下面是一条简单的SQL JOIN语句:
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条记录,表TB_INVENTORY具有7688条记录。但是,最后两个表(TB_NODE和TB_PROCESS)的记录都少于30条。
令人难以置信的是,当它在SQL Server2005中运行时,返回结果集需要8小时。
为什么要花这么多时间来执行?
如果删除两个inner join,则只需10秒即可完成运行。
出什么事了?
至少有两个UNIQUE NONCLUSTERED INDEXE。
一个是表TB_R_INVENTORY_BARCODE上的IX_INVENTORY_BARCODE_PROCESS_NODE,它包含四个列(inventid、barcode、process和node)。
另一个是表tbBCScanRec上的IX_BARCODE_PROCESS_NODE,它包含三个列(BarCode、PASSEDPROCESS和PASSEDNODE)。
发布于 2011-09-27 15:27:16
好吧,这样的问题的标准答案是:
REC.PASSEDPROCESS
N.NO_ID、REC.PASSEDNODE、P.PR_CODE、REC.PASSEDPROCESS发布于 2011-09-27 15:27:38
您正在处理大约(556553 *30 *30) 5亿行。您可能需要在表中添加indexes。
如果您使用的是SQL server,则可以观察计划查询,以了解您在哪里浪费时间。请参阅此处的文档:http://msdn.microsoft.com/en-us/library/ms190623(v=sql.90).aspx
查询计划将帮助您创建索引。
发布于 2018-05-02 09:36:27
当您检查索引时,也应该有聚集索引-非聚集索引使用聚集索引,所以没有聚集索引将使非聚集索引变得无用。过时的统计数据也可能是一个问题。
但是,为什么需要获取所有数据呢?这样做的目的是什么?您应该使用WHERE子句将结果集限制为您需要的内容。
https://stackoverflow.com/questions/7565484
复制相似问题