如何在SQL Server中减少这个简单SQL查询的执行时间?
select *
from companybackup
where tiRecordStatus = 1
and (iAccessCode < 3 or chUpdateBy = SUSER_SNAME())
它有近38,681行,耗时近10分23秒。该表有50列,甚至我在所有列上创建索引以减少时间但是没有成功,即使我使用nolock选项和所有可用的解决方案检查但是无法减少执行时间。
可能是什么问题?
答案 0 :(得分:0)
如果这是一个关键查询,您可以创建一个专门为它设计的索引:
CREATE INDEX ix_MyIndexNameHere ON CompanyBackup
(tiRecordStatus, iAccesscode, chUpdateBy)
这仍然需要键查找,因为你返回的所有字段都是*
,但它比一堆单字段索引好很多。
答案 1 :(得分: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;
答案 2 :(得分:0)
我想知道SUSER_SNAME()函数做了什么,现在它在每一行都被执行了。你能尝试将该函数返回值赋给参数然后执行查询吗?
如果功能成本高,这将大大缩短执行时间。
修改。任何人都可以告诉我为什么我不能发布一些SQL条款,有些我可以吗?无法发布DECLARE语法。