日期:2014-05-17  浏览次数:20509 次

SQL语句执行 越来越慢
表不大,20万记录,需要全部读出来传送到别的地方,不可能一次全读出来,内存也受不了。

因为传送要花点时间,所以为了效率,采用多线程。一共开了50个线程,每个线程负责4000条记录的读取和传送,线程每次读50个记录,传送完后再读50个,...,在读记录的时候程序中加了锁,防止冲突。

开始的时候工作良好,每次读取花费的时间不到0.1秒,但到了后来就越来越慢,需要花几分钟才能执行完一次读取,而这时候在其他的地方(比如数据库管理工具)执行同样的sql 语句,非常快。

我用的是C#做的程序,为了解决这个问题,使用了各种方法,比如把执行的SQL放到存储过程中,使用DataAdapter.fill读到Dataset中,使用DataReader等等,全部不行。

SQL语句也非常简单,就是像“select [id],[quantity],[city],....from table where id between m and n";

请问各位高手,有什么好的办法吗?
------解决方案--------------------
加上索引试过么。。。
------解决方案--------------------
程序中在SQL查询后有没有关闭连接,或者去看看数据库连接池的设置。
------解决方案--------------------
一共开了50个线程  在读记录的时候程序中加了锁,防止冲突。

线程越多,速度不一定越快
------解决方案--------------------
表不大,20万记录,需要全部读出来传送到别的地方


LZ 用数据导入导出嘛,换种方式看,不一定就非得用线程的
------解决方案--------------------
在between  and这个字段上加上聚集索引试下
------解决方案--------------------
DataReader看看是否关闭连接了,如果传送数据慢的话,可以考虑用WCF传递。。
------解决方案--------------------
1.加锁为了放冲突。这里的锁是指SQL SERVER中的锁还是线程之间的互斥锁之类的?
2.开始的时候0.1秒,后来几分钟。是指程序程序刚执行的时候快,后来慢?还是指以前执行挺快,现在慢了?

------解决方案--------------------
需要花几分钟才能执行完一次读取,而这时候在其他的地方(比如数据库管理工具)执行同样的sql 语句,非常快。


重新組織下索引,重新建下索引就可以解決類似的問題。可以通過索引維護計劃嚮導創建。




------解决方案--------------------
從開始時間到現在,中間有沒有升級過什么系统组件或程序组件,如有升級過Framework版本,不同的版本會有些差異,如從Framework 1.0 升級到 Framework 2.0 ,舊的讀取數據方法,與新版本的訪問數據方法不同。會導致Load數據時候產生緩慢。若是這樣,可以考慮採用新版本的讀取數據方法。

當然,還可以通過SQL Server Profiler跟蹤檢查每一次讀取數據的運作情況,通過Database Engine Tuning Advisor 檢查工作負荷情況。
------解决方案--------------------
引用:
1.加锁为了放冲突。这里的锁是指SQL SERVER中的锁还是线程之间的互斥锁之类的?
2.开始的时候0.1秒,后来几分钟。是指程序程序刚执行的时候快,后来慢?还是指以前执行挺快,现在慢了?
-------------------------------------------------------
1 加锁是线程中……


1、肯定不是数据库查询出问题了,因为你说过:这时候在其他的地方(比如数据库管理工具)执行同样的sql 语句,非常快。
2、你说:程序刚开始执行的快,后来就越来越慢。程序重新启动后速度又会变快。因为你查询出来的结果都放在内存里面的,而且每次执行一次的时候,这段存储Dataset的数据没有放掉,继续在内存中,内存会越来越大,所以会慢,你可以试试,每次传出去后就放掉Dataset所占的内存