几百万数据的数据库查询

时间:2022-01-11 21:46:40
大半夜的我这有一个很严重的问题一直困扰这我

一个数据库(SQL2008)里面有一张收支明细表:字段如下 
Mark(1=收入,2=支出)

ID(自增)   Messages       Mark   Money    CreateTime
1      您xxxx收入xx元      1    10.00    2012-11-01 20:10:10     
2      您xxxx支出xx元      2    10.00    2012-11-01 21:10:10     
3      您xxxx收入xx元      1    10.00    2012-11-01 22:10:10     
4      您xxxx收入xx元      1    10.00    2012-11-01 23:10:10     
...
2000000   您xxxx支出xx元      2    10.00    2012-11-01 23:30:10    

这张表每天插入的数据大概是 几十万条数据左右

每30分钟插入一些数据(这个每次插入也有几万),期间还有零零散散的一些插入

问题就出现在这里 每次在插入的时候   执行(简单的SQL)查询就没法查询了  一直显示请求超时直到插入完毕才恢复
数据量小的时候没发现这个问题 直到后面数据量越来越大已经到了200多万了  真的是查询也费尽插入更费劲

还有操作数据库用的普通的 ADO 希望这里有接触过百万数据的高手指点下  没接触的也可以帮帮忙 

帮忙给出解决方案

16 个解决方案

#1


定期把数据放入历史数据库存档。

#2


分表,索引优化,或者上面的定期清除历史数据

#3


去SQL 版块问问吧  那边处理SQL  的比较专业.

#4


对数据库不熟。

估计可以根据日期分表。

#5


你执行简单查询的时候正有人改变数据库呢,等数据库改变晚了就可以查询了~!

#6


分表,或者表分区

历史数据,放历史数据库。

一个表仅放今天的记录

#7


分2个表 我怎么查询

#8


肯定要求有排序与索引

#9


关注中,学习中

#10


引用 2 楼 myhope88 的回复:
分表,索引优化,或者上面的定期清除历史数据
++

#11


学习啊,来大牛,说的稍微详细点

#12


一张收支明细表,一张收支明细插入表
每天插入是都插入收支明细插入表
查询联合起来查
过了0:00将收支明细插入表导入收支明细表,清空

#13


可以试下使用事务批量插入数据库 。。

#14


引用 12 楼 phoebuswei 的回复:
一张收支明细表,一张收支明细插入表
每天插入是都插入收支明细插入表
查询联合起来查
过了0:00将收支明细插入表导入收支明细表,清空

这个比较靠谱,
不过两个张表在进行导入与导出时,
有查询请求和新增数据进来,怎么操作?

#15


引用 12 楼 phoebuswei 的回复:
一张收支明细表,一张收支明细插入表
每天插入是都插入收支明细插入表
查询联合起来查
过了0:00将收支明细插入表导入收支明细表,清空


这个办法好像很不错 但是查询是个体力活

#16


索引什么的解决不了问题的

  每次在插入的时候  执行(简单的SQL)查询就没法查询了  一直显示请求超时直到插入完毕才恢复

原因是当数据库进行插入、更新的时候是有一个简单的锁的。
你去注意一下,设定数据库查询允许脏读,就不会这么卡了

另外,当插入、更新的时候,显式的设定不锁表。

还有,即便是允许脏读,插入更新不锁表,当数据量很大的时候,查询仍然会很慢,这时候你可以做数据库分区,对数据库的日志模式作调整,都会对访问效率有所改善的



#1


定期把数据放入历史数据库存档。

#2


分表,索引优化,或者上面的定期清除历史数据

#3


去SQL 版块问问吧  那边处理SQL  的比较专业.

#4


对数据库不熟。

估计可以根据日期分表。

#5


你执行简单查询的时候正有人改变数据库呢,等数据库改变晚了就可以查询了~!

#6


分表,或者表分区

历史数据,放历史数据库。

一个表仅放今天的记录

#7


分2个表 我怎么查询

#8


肯定要求有排序与索引

#9


关注中,学习中

#10


引用 2 楼 myhope88 的回复:
分表,索引优化,或者上面的定期清除历史数据
++

#11


学习啊,来大牛,说的稍微详细点

#12


一张收支明细表,一张收支明细插入表
每天插入是都插入收支明细插入表
查询联合起来查
过了0:00将收支明细插入表导入收支明细表,清空

#13


可以试下使用事务批量插入数据库 。。

#14


引用 12 楼 phoebuswei 的回复:
一张收支明细表,一张收支明细插入表
每天插入是都插入收支明细插入表
查询联合起来查
过了0:00将收支明细插入表导入收支明细表,清空

这个比较靠谱,
不过两个张表在进行导入与导出时,
有查询请求和新增数据进来,怎么操作?

#15


引用 12 楼 phoebuswei 的回复:
一张收支明细表,一张收支明细插入表
每天插入是都插入收支明细插入表
查询联合起来查
过了0:00将收支明细插入表导入收支明细表,清空


这个办法好像很不错 但是查询是个体力活

#16


索引什么的解决不了问题的

  每次在插入的时候  执行(简单的SQL)查询就没法查询了  一直显示请求超时直到插入完毕才恢复

原因是当数据库进行插入、更新的时候是有一个简单的锁的。
你去注意一下,设定数据库查询允许脏读,就不会这么卡了

另外,当插入、更新的时候,显式的设定不锁表。

还有,即便是允许脏读,插入更新不锁表,当数据量很大的时候,查询仍然会很慢,这时候你可以做数据库分区,对数据库的日志模式作调整,都会对访问效率有所改善的