加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 查询较新的记录时,使用存储过程缓慢查询

发布时间:2020-12-15 21:32:19 所属栏目:百科 来源:网络整理
导读:对不起,下面的文字墙… 我这里有一个奇怪的问题.我有一个很大的表,在过去几天存储来自Exchange 2007的邮件跟踪日志信息.记录数量为数百万(约10-12百万),每30分钟一次,我通过PowerShell计划任务从所有传输服务器批量插入任何新日志. 每晚一次我运行一个维护任
对不起,下面的文字墙…

我这里有一个奇怪的问题.我有一个很大的表,在过去几天存储来自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范围内的某个值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读