简单的程式,海量的数据,速度问题求解!

jay_lizj 2009-10-30 03:16:05
加精
系统要求扫描产品的条码,保存进数据库,条码不能重复。
系统很简单,但每天的数据量非常大,基本要7万条/天,所以当数据总量达到200万的时候,系统插入记录时就会非常慢,我目前的检查重复是通过设置条码栏位为唯一索引,在程式中捕捉sql返回的错误来判断,这样比传统的用语句判断是否唯一已经快很多,但在数据量大时还是十分缓慢。数据库采用的sql2000.现在没办法只能定期转移数据,实在是非常麻烦。
请教是否有更好的方法处理,谢谢!!!
...全文
1611 104 打赏 收藏 转发到动态 举报
写回复
用AI写文章
104 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshixinghuo 2010-07-11
  • 打赏
  • 举报
回复
haohao xuexi ya
huobr 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 85 楼 dd_zhouqian 的回复:]
条形码基本对每个商品都是唯一的,也可能一个商品有多个条形码,
每天7W,也就是7W种商品。
30天210W,也就是210W种商品。

[/Quote]

如果是商品的条码,我在想什么行业每天都有这么多种新商品交易?
ERR0RC0DE 2009-11-06
  • 打赏
  • 举报
回复
楼主应该将表设计(结构,索引,[不会还有触发器吧?]写出来,
然后再写些关键代码(怎么insert表)贴出来让大家分析,而不是靠大家猜。
yjsyyy 2009-11-06
  • 打赏
  • 举报
回复
数据库索引可以使查询变快,但会让插入变慢,数据量大时影响更大。

所以应该把查询和插入分开,建缓冲表应该是个好办法:
缓冲表和持久表都按条码建索引
在缓冲表中只放一天的数据,新数据都插入缓冲表(数据量小,插入快),插入前按‘缓冲表、持久表’的顺序判断重复
每天在数据库服务器空闲时将缓冲表数据转入持久表(耗时操作在后台执行)
查询时综合两张表

还有一个办法就是分区了,分区其实就是:
将所有记录按条码的前n(需规划n的值以控制分区大小及数据量均衡)个字符分类,分别放在多个分区(分表)中,插入或查询时先按前n个字符确定分区(分表),然后再在小数据量的分区(分表)中操作。
patckchen 2009-11-06
  • 打赏
  • 举报
回复
1.一秒之内都应该可以接受
2.并发输入在30台电脑左右
3.数据库服务器的配置志强2.8双核CPU两个,内存2G
4. 条码不能重复是指表中任意时期记录的条码都不能重复
5. 应用系统是局域网
可以开sql跟踪,看慢在哪里啊,cpu,IO,哪里慢解决哪里问题
数据库服务器CPU足够了, 条件允许的话再加2G内存, 硬盘加满;
如果有6个硬盘1,2硬盘RAID1(操作系统,数据库软件); 3,4,5,6硬盘RAID10; 数据库文件放在RAID10盘上
如果有8个硬盘1,2硬盘RAID1(操作系统,数据库软件); 3,4硬盘RAID10(数据库使用文件组,放索引文件);
5,6,7,8硬盘RAID10放数据文件
操作系统和数据库可以升级到X64版本,数据用sql server 2005或2008版本
定期做碎片整理及重建索引工作;
数据记录的表用条码字段做主键,聚集索引,如果要写入快表的索引尽量少.
是否对表分区看具体应用了,条码字段是全局索引,如果只考虑对条码字段唯一性,分区没什么意义.
写表使用存储过程.
你的这种要求insert的sql也能满足,使用绑定变量方法,减少sql的解析时间.




aassdd 2009-11-05
  • 打赏
  • 举报
回复
看完了。学习中,幸好没用sqlserver2000搞这种大数据量。
阿三 2009-11-05
  • 打赏
  • 举报
回复
写个存储过程,用这个去判断,然后客户端去调用。
hehaiyi2008 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 75 楼 zyxip 的回复:]
先检查程序,将和这个表有有绑定的数据感知控件全部去掉。

在估算一个数据的最大量,总不至于每天七万,无限的增加下去吧

将条码的长度保存起来,先用条码的长度进行过滤,如果80%以上的长度都是一个长度,则不用这个方法

将条码中的偶数个数保存在一个独立的数字字段中,先进行比较,应该先能排除一半

将条码的最后几位数据独立保存在一个数字字段中,先进行比较,数字比较速度应该比字段比较快

在根据业务看是否能用时间来划分,每天或每周,每月建立一张表

增加一int类型的主键。撤销条码的主键。


总的原则是将数据分类来查,不要每将都在一大堆中查找,就象在书店一样,可以按出版商,按书类型进行
书架分类,然后找书的时间才能快速定位。

[/Quote]

losehum 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sz_haitao 的回复:]
7万条/天,每次是多少条,如果多的话,插之前先批量查询是否有重复,没有就批量插入,有重复就先剔除重复的,再批量插入

不过,估计慢在插入后的索引维护上,分区表可以减低维修开销
[/Quote]

统一, 存在索引的话, 绝对的太浪费时间. 如果只是想讲所有条码在数据库中不重复存在, 那干脆直接先把所有索引,外键等删除, 然后等数据全部进入后, 在去重复, 重建索引.
lhslktg 2009-11-05
  • 打赏
  • 举报
回复
h
Yizero 2009-11-04
  • 打赏
  • 举报
回复
很热闹,进来学习一下!
lw_China 2009-11-04
  • 打赏
  • 举报
回复
如果其他地方没问题的话
我认为瓶颈就在比较的过程。
那么是不是可以这样:

1.在做比较的时候统计每一个条形码的重复次数。

2.将经常重复的条形码(比如说前20W个)拿出来做
第一次比较,不重复再进行后续比较。

PS: 当然,如果条码的重复数分布很平均的话,这个方法无效。
dd_zhouqian 2009-11-04
  • 打赏
  • 举报
回复
条形码基本对每个商品都是唯一的,也可能一个商品有多个条形码,
每天7W,也就是7W种商品。
30天210W,也就是210W种商品。
  • 打赏
  • 举报
回复
1、楼主的应用场景描述不够清晰。
2、条码建主键索引,使用捕捉sql错误还做程序错误处理,都是正确的。
分析:
3、你的数据每天7万,那么按月分表是可以做的。
  检查过你的数据库主机性能没?忙的时候消耗CPU多少、内存多少,是否满足应用需要?
  有多少程序在并发处理这个表,是否有锁表的产生,都要看看。
4、我在工作中应用的都是千万级以上的数据,并发的用户量很多,当然数据库主机也很强劲(IBM16CPU,32G内存)。你的问题该不难解决。
jin20000 2009-11-04
  • 打赏
  • 举报
回复
关注
贝隆 2009-11-04
  • 打赏
  • 举报
回复
学习
wzpwork 2009-11-04
  • 打赏
  • 举报
回复
数据库索引查询快,但会影响插入速度,它有两面性。

在内存中实现一个HASH。现在的服务器都四个G以上的内存,每天7万记录没问题。

检查时从内存HASH中查询,插入时存到数据库中,按月建表。一个月下来也只有向几千万的记录。
evenfun 2009-11-04
  • 打赏
  • 举报
回复
在SQL2000中,几百万条数据是不算多的,
如果产品条码是主键或者有索引的话,
查询的速度应该是很快的.
我做过测试, 在五千万条数据中检索一条(where条件是主键或者是索引,用的是"=")
时间不会超过几百毫秒.
你的表是不是索引过多.请确认.


建议先检索是否存在,然后再插入.
不会出现那样的问题
cuidenghong123 2009-11-04
  • 打赏
  • 举报
回复
学习
flowingdream 2009-11-04
  • 打赏
  • 举报
回复
mark & ding.
加载更多回复(82)

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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