-2

如何减少 SQL Server 中这个简单 SQL 查询的执行时间?

select * 
from companybackup  
where tiRecordStatus = 1
and (iAccessCode < 3 or chUpdateBy = SUSER_SNAME())

它有近 38,681 行,耗时近 10 分 23 秒。该表有 50 列,甚至我在所有列上都创建了索引以减少时间,但它没有成功,即使我检查了 nolock 选项和所有可用的解决方案,但无法减少执行时间。

可能是什么问题?

4

3 回答 3

0

您没有提供太多信息,但将 OR 拆分为两个查询的联合通常会有所帮助(优化器在使用 OR 时遇到问题):

select * 
from companybackup  
where tiRecordStatus = 1
and iAccessCode < 3
union
select * 
from companybackup  
where tiRecordStatus = 1
and chUpdateBy = SUSER_SNAME())

如果这没有帮助,请尝试创建这些索引:

create index idx1 on companybackup(tiRecordStatus, iAccessCode);
create index idx2 on companybackup(chUpdateBy, tiRecordStatus);

如果索引值的分布,则强制重新计算:

update statistics companybackup;
于 2013-06-11T13:01:07.677 回答
0

我想知道 SUSER_SNAME() 函数做了什么,现在它在每一行上执行。您可以尝试将该函数返回值传递给参数然后执行查询吗?

如果该功能成本高昂,这将大大减少执行时间。

编辑。谁能告诉我为什么我不能发布一些 SQL 子句而我可以?不能发布 DECLARE 语法。

于 2013-06-11T13:29:13.797 回答
0

如果这是一个关键查询,您可以创建一个专为它设计的索引:

CREATE INDEX ix_MyIndexNameHere ON CompanyBackup 
           (tiRecordStatus, iAccesscode, chUpdateBy)

这仍然需要进行键查找,因为您要返回带有 的所有字段*,但它比一堆单字段索引要好得多。

于 2013-06-11T12:56:46.193 回答