1

我有以下带有 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';

预计执行计划:

4

2 回答 2

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,并且 <= 更改为 <

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

于 2017-06-07T15:10:44.333 回答
0

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

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

于 2017-06-23T00:26:20.260 回答