c# – 查询较新的记录时,使用存储过程缓慢查询
对不起,下面的文字墙…
我这里有一个奇怪的问题.我有一个很大的表,在过去几天存储来自Exchange 2007的邮件跟踪日志信息.记录数量为数百万(约10-12百万),每30分钟一次,我通过PowerShell计划任务从所有传输服务器批量插入任何新日志. 每晚一次我运行一个维护任务来清除任何超过一天的日志,以便表格不会变得太大,但是如果可以的话我想保持日志更长一点. 该表称为MessageTracking,并且具有一个主键,即IDENTITY int列,[MessagelogID],每个记录增加1. [date-time] asc的[date-time]列上有一个非聚集索引. 发件人和收件人字段上有一个全文索引. 用户可以通过我在C#Asp.net中编写的前端网页搜索表格.该页面允许使用4个搜索字段进行基本搜索: >开始DateTime 这会将查询传递给实际将记录拉回的存储过程.存储过程称为GetMessageTracking. 现在谈到我的奇怪问题.此查询以0秒的形式返回结果,快速闪烁: USE [DATABASENAME] GO DECLARE @return_value int EXEC @return_value = [dbo].[GetMessageTracking] @maximumRows = 20,@startRowIndex = 0,@sortExpression = N'[date-time]',@SearchStartDate = N'2012-03-27 13:51',@SearchEndDate = N'2012-03-27 20:09',@SearchSender = N'user@domain.com',@SearchRecipient = N'Default' SELECT 'Return Value' = @return_value GO 如果我将@SearchStartDate参数改为一小时,即N’2012-03-27 14:51’那么它很长时间都没有完成. 我只能假设我的日期时间索引存在重大问题,因为全文目录通常是空闲的.我遇到的挑战之一是我每小时插入数千条记录,索引(IX_DateTime)很快就会碎片化,但是我想不出一个阻止这种情况发生的好方法. 所以我的问题确实是两个问题: 1)在搜索较新的记录时,如何查询导致此问题的原因? 2)当有大量插入时,有关索引的提示吗? 我想也许是执行计划导致这种奇怪的行为,但似乎没有.我尝试将WITH RECOMPILE选项添加到查询中,这完全没有任何区别.我清除了执行计划缓存也没有效果. 很确定我的问题完全取决于我的索引. 谢谢! 解决方法
使用重新编译是一个很好的第一步.所以我们可以排除参数嗅探问题的可能性.
请发布执行计划的屏幕截图.我想这个问题会变得清晰.我猜这是一个统计问题.查询优化器认为没有DateTime> = N’2012-03-27 14:51’的行,因此选择了错误的计划.尝试运行sp_updatestats. 对于你的问题的#2:将索引填充设置为50-80范围内的某个值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |