如何增加简单的T-SQL查询性能 - 需要很长时间才能完成。请....!

时间:2017-06-07 14:57:49

标签: sql-server query-tuning

我有以下带有2个表连接和WHERE子句的简单查询。

我已经为关键加入字段以及WHERE子句字段编制了索引。

这两个表有大约1.23亿行,这是非常巨大的。完成下面的完整查询大约需要7/8小时。我编制索引并且不确定还有什么可做的,因为它是JOIN& WHERE条款:

insert into dbo.IMS_CLAIMS(CLAIM_ID
                          ,DX_CLAIM_ID
                          ,SVC_SEQ_NBR
                          ,SVC_DT
                          ,ALLWD_AMT
                          ,BILL_AMT
                          )
select h.CLAIM_ID
      ,h.DX_CLAIM_ID
      ,s.SVC_SEQ_NBR
      ,h.SVC_DT
      ,s.ALLWD_AMT
      ,s.BILL_AMT
from [2016Q4_VITALS_EXPORT_HEADERS] as h
    inner join [2016Q4_VITALS_EXPORT_SERVICE] as s
        on h.claim_id = s.claim_id
where cast(SVC_DT as date) >= '2015-10-01'
      and cast(SVC_DT as date) <= '2016-11-30';

预计执行计划:

2 个答案:

答案 0 :(得分:2)

 WHERE cast(SVC_DT as date) >= '2015-10-01' And cast(SVC_DT as date) <= '2016-11-30'

当您将SVC_DT转换为日期时,您强制SQL Server读取每一行,执行转换,然后执行比较到'2015-10-01'。这排除了在SVC_DT上使用索引。

 WHERE SVC_DT >= '2015=10-01'  AND SVC_DT < '2016-12-01'  

请注意,我们必须将结束日期从11/30更改为12/01,并且&lt; =更改为&lt;

逻辑与上面相同,但现在SQL Server可以使用索引。

答案 1 :(得分:0)

如果您在表格上有任何索引:dbo.IMS_CLAIMS,请将它们全部删除。

堆上的批量插入比带索引的表上快得多。