SQL Server 2008 SqlDataReader读取100万数据超慢,高手帮忙。
我最近做一个数据上报程序,需要日报、月报。日报查询的数据较少,每天不过几万而已,无问题。但是月报时,查询某张表时需要读取100W条数据,我在Code时,每条语句都是在SS...
我最近做一个数据上报程序,需要日报、月报。日报查询的数据较少,每天不过几万而已,无问题。但是月报时,查询某张表时需要读取100W条数据,我在Code时,每条语句都是在SSMS中验证过的,查询都不会超过5秒钟即可读取并加载到界面上。但是问题是,当我运行程序后,有可能会出现读取特别慢的情况,10几秒才读取1万条数据(ADO.NET一直在读,但是特别慢),但是如果我使用缓存清理语句后,又或者我对语句加几个空格,再运行程序,5秒即可读完。但是当过些天(时间未知),在执行的时候,就又读的超级慢。。。。我的这条读取语句是日报与月报公用的,只是@参数不同而已,我想是不是因为缓存的问题,该如何解决此问题,因为程序是需要定时运行的,我不可能经常去检查他是否正常运行。高手赐教。
数据库服务器是虚拟机16G内存,CPU是多核16线程,我这里初步排查是缓存问题。
附上语句 展开
数据库服务器是虚拟机16G内存,CPU是多核16线程,我这里初步排查是缓存问题。
附上语句 展开
3个回答
展开全部
这就是执行计划重编译和数据缓存。
可以分成两个部分解说,LZ红包也要给双份的!
执行计划简单的说就是SQL怎么读取操作数据。
你这个属于基于优化的重编译(optimality-based recompilation---你可以去国外网站查这个关键词),主要是由统计信息发生改变导致(比如记录十万百万的增加)。
如果你想印证的话,可以用profiler跟踪重编译事件。
其下你可以用我这个方式测试一下你的SQL。
select
p.usecounts,p.cacheobjtype,p.objtype,t.text
from sys.dm_exec_cached_plans p
cross apply sys.dm_exec_sql_text(plan_handle) t
where p.cacheobjtype='Compiled Plan' and t.text like '%dbo.StrText%'
and t.text not like '%dm_exec_cached_plans%'
你把上边红框里改成你那个查询的关键字
以上只是测试方法。
第二:数据缓存,这个跟时间有关系,用的是最近最少使用的数据优先清空的原理。
你可以把服务器内存整到 64G。然后配置一番,基本可以缓存多一些。
原因找到了:具体怎么做呢?
第一:如果版本可以的,你可以用索引视图
第二:分页,这个就是小块优化了!
第三:我看了一下你这个查询,可以整合到一个表中,独立建表
展开全部
在生产服务器上,千万谨慎使用DBCC FREEPROCCACHE命令
看你贴出的语句,应该是使用了参数化查询,参数化查询是可以有效的利用缓存计划
不过如果你所要查询的几个表数据变动过于频繁,可能计划不适应当前数据分布
这样的话,可以考虑非参数化查询,将参数以字符的形式拼接到语句中
这样每次就会生成新的查询计划
看你贴出的语句,应该是使用了参数化查询,参数化查询是可以有效的利用缓存计划
不过如果你所要查询的几个表数据变动过于频繁,可能计划不适应当前数据分布
这样的话,可以考虑非参数化查询,将参数以字符的形式拼接到语句中
这样每次就会生成新的查询计划
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
从你这个情况来看,确实像SQL 的缓存计划所致,因为语句参数化了,所以SQL在试图使用原有的执行计划,可是实际情况是原有的执行计划已经不是最优的了
可以考虑执行DBCC FREEPROCCACHE命令,看情况是否也会发生变化。
可以考虑执行DBCC FREEPROCCACHE命令,看情况是否也会发生变化。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询