大数据的查询和比对

烟灰洒落键盘 2012-04-27 01:38:11
RT,在生产的流水线上会扫描物品的序列号和MAC地址,但是在存入数据库之前,会跟之前的历史数据作比较,看看有没有重复,MAC地址是不允许有重复的,重复的报错,怎么样才能让查询和比对的效率高
客户要求数据保存5年以上及个别客户时10年,也就是每次扫描的时候要和之前所有的数据作比较,每年的数据大概在1000W左右,响应时间要控制在1.5s以内,不然就达不到产能,现在数据库只能几百W条数据,现在都感觉有点慢了,索引也建了,但是效果还是不明显,因为其他客户的数据也是写入这个表,每天的数据大概在20W左右.
现有的措施:
1.在表上建立了索引,提高查询料率,但是太多就会影响插入效率
2.每天将30天之前的数据写入历史表,但是做比较的时候还是要查询全表
也想过分客户建表,这样每个表中的数据就会少点,但是BOSS不同意.数据库是SQL 2008
...全文
562 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
码农-彬少 2012-04-27
  • 打赏
  • 举报
回复
去数据库版问吧。这SQL语句一看就知道快不了了~
烟灰洒落键盘 2012-04-27
  • 打赏
  • 举报
回复
怎么分呢,首先我没有权限改动数据库的架构,还得向总公司申请,表结构:
CREATE TABLE [SAP_ADMIN].[SCANNED_DATA_TAB](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[SCAN_DATA] [nvarchar](40) NOT NULL,
[ORDER_NO] [nvarchar](30) NOT NULL,
[PART_NO] [nvarchar](30) NULL,
[CUSTOMER] [nvarchar](30) NULL,
[LOT_NO] [nvarchar](30) NOT NULL,
[PALLET_NO] [int] NOT NULL,
[CARTON_NO] [int] NOT NULL,
[BOX_NO] [int] NOT NULL,
[SCAN_SEQUENCE] [nvarchar](20) NOT NULL,
[FIRST_SCAN_TIME] [datetime] NULL,
[FIRST_SCAN] [nvarchar](30) NULL,
[SECOND_SERIAL] [nvarchar](30) NULL,
[THIRD_SERIAL] [varchar](30) NULL,
[FORUTH_SERIAL] [nvarchar](30) NULL,
[LAST_SCAN] [nvarchar](30) NULL,
[LAST_SCAN_TIME] [datetime] NULL,
[SCAN_TIMES] [int] NULL,
[PROPERTY] [nvarchar](20) NULL,
[BASIC_PART] [nvarchar](50) NULL,
[OPERATION] [nvarchar](50) NULL,
[SNProperty] [nvarchar](10) NULL,
[notext] [nvarchar](50) NULL,
[Work_line] [nvarchar](20) NOT NULL,
[Work_Floor] [nvarchar](20) NOT NULL,
[work_station] [nvarchar](20) NOT NULL,
[five_serial] [nvarchar](30) NULL,
[six_serial] [nvarchar](30) NULL,
[replace_sn] [nvarchar](30) NULL,
CONSTRAINT [PK_SCANNED_DATA_TAB] PRIMARY KEY CLUSTERED
(
[SCAN_DATA] ASC,
[ORDER_NO] ASC,
[LOT_NO] ASC,
[PALLET_NO] ASC,
[CARTON_NO] ASC,
[BOX_NO] ASC,
[SCAN_SEQUENCE] ASC,
[Work_line] ASC,
[Work_Floor] ASC,
[work_station] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
CONSTRAINT [IX_SCANNED_DATA_TAB] UNIQUE NONCLUSTERED
(
[SCAN_DATA] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
cheng2005 2012-04-27
  • 打赏
  • 举报
回复
这个没有办法,大数据量的情况下要进行 频繁 准确 的查询,这个不能只依靠软件来解决,再完美的方法都是需要时间的。
你的需求和搜索引擎还不一样,别看搜索引擎速度挺快,数据量很大,但是人家有各种索引,更主要的是,索搜引擎没有 准确 这个需求,不需要保证结果是正确且完整的。

想解决,只能是想办法把数据源变小,或者拆分。
比如按照MAC,分段拆分。这样每一次可以去一个更小的范围内查询。
winner2050 2012-04-27
  • 打赏
  • 举报
回复
楼主没觉悟,也没有实践。

建立索引肯定是正确的,它导致插入速度影响极低。

查询负担远远大于插入。

仅仅校验序列号和MAC是否重复,1500万的数据量轻松能对付。

把序列号和MAC两个字段构建复合索引。

如果字段用char型,速度比varchar 索引速度又快了很多。
ycproc 2012-04-27
  • 打赏
  • 举报
回复
分表 分区
yajiedesign 2012-04-27
  • 打赏
  • 举报
回复
试试根据MAC地址来分表。
设计一个函数F,使 F(mac)=1-10。
然后查询和比对对应的表
anzhiqiang_touzi 2012-04-27
  • 打赏
  • 举报
回复
可以考虑表分区
anzhiqiang_touzi 2012-04-27
  • 打赏
  • 举报
回复
我做过一个系统
大概是3个月就1.5亿。但是我们会进行数据转移的
anzhiqiang_touzi 2012-04-27
  • 打赏
  • 举报
回复
可以考虑表分区

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧