对不起,下面的文字墙…
我这里有一个奇怪的问题.我有一个很大的表,在过去几天存储来自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范围内的某个值.
查看更多关于c# – 查询较新的记录时,使用存储过程缓慢查询的详细内容...