我有以下带有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';
预计执行计划:
答案 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,请将它们全部删除。
堆上的批量插入比带索引的表上快得多。