下面有一个简单的SQL语句JOIN
:为什么这个SQL查询需要8个小时才能完成?
SELECT
REC.[BarCode]
,REC.[PASSEDPROCESS]
,REC.[PASSEDNODE]
,REC.[ENABLE]
,REC.[ScanTime]
,REC.[ID]
,REC.[Se_Scanner]
,REC.[UserCode]
,REC.[aufnr]
,REC.[dispatcher]
,REC.[matnr]
,REC.[unitcount]
,REC.[maktx]
,REC.[color]
,REC.[machinecode]
,P.PR_NAME
,N.NO_NAME
,I.[inventoryID]
,I.[status]
FROM tbBCScanRec as REC
left join TB_R_INVENTORY_BARCODE as R
ON REC.[BarCode] = R.[barcode]
AND REC.[PASSEDPROCESS] = R.[process]
AND REC.[PASSEDNODE] = R.[node]
left join TB_INVENTORY as I
ON R.[inventid] = I.[id]
INNER JOIN TB_NODE as N
ON N.NO_ID = REC.PASSEDNODE
INNER JOIN TB_PROCESS as P
ON P.PR_CODE = REC.PASSEDPROCESS
表tbBCScanRec
有556553条记录,而表TB_R_INVENTORY_BARCODE
有260513个reccords和表TB_INVENTORY
有7688.不过,最后两个表(TB_NODE
和TB_PROCESS
)都少于30个记录。令人难以置信的是,它在SQL Server 2005中运行时,需要8小时才能返回结果集。
为什么需要很长时间来执行?
如果两个inner join
被删除,则只需十秒钟即可完成运行。
这是怎么回事?
有至少两个UNIQUE NONCLUSTERED INDEX
es。
一个是IX_INVENTORY_BARCODE_PROCESS_NODE
在桌子上TB_R_INVENTORY_BARCODE
,其覆盖四列(inventid
,barcode
,process
,和node
)。
另一种是IX_BARCODE_PROCESS_NODE
在桌子上tbBCScanRec
,它覆盖三列(BarCode
,PASSEDPROCESS
,和PASSEDNODE
)。
我不能推荐任何具体的教程,但你需要学习理解执行计划。在SSMS中有一些选项可以打开执行计划 - 如果你可以补充一下,我们可能会给你一些指示(尽管发布一个XML查询计划,尽管如此)。此外,通常使用实际值而不是预计值计划更好,但如果预计需要8小时才能获得实际值,则预计计划可能已足够。 –