IBM DB2 SQL查询优化

问题描述:

我有这个疑问:IBM DB2 SQL查询优化

select DBSAITE.MITEM, DBSAITE.MPDSC, DBSAITE.MUTMS, MVSACPE.COSTUN, PCSACST.CSTTYAPP, 
SUM(PCSACST.CSTBURD1 + PCSACST.CSTBURD2 + PCSACST.CSTLABOR + 
PCSACST.CSTMAT + PCSACST.CSTSETUP + PCSACST.CSTEXTRN) as COSTO_STD 
from MVSACPE, PCSACST, DBSAITE 
WHERE PCSACST.CSTCOSC = MVSACPE.CODSOC 
AND PCSACST.CSTITEM = MVSACPE.CODITM 
AND MVSACPE.CODITM = DBSAITE.MITEM 
AND DBSAITE.MCOSC = 'GRS' 
AND MVSACPE.CODSOC = 'GRS23' 
AND MVSACPE.DTPERI = '201512' 
AND MVSACPE.CODMAG = 'ALL' 
AND MVSACPE.CODCOS = 'MPR' 
AND PCSACST.CSTDATE = '20150630' 
AND PCSACST.CSTTYPE = 'SG' 
GROUP BY DBSAITE.MITEM, DBSAITE.MPDSC, DBSAITE.MUTMS, MVSACPE.COSTUN,PCSACST.CSTTYAPP 

我想好歹优化查询,因为有成千上万的记录参加工作,是非常慢(3分钟)。

有什么建议吗?

+0

您正在从SELECT语句中的连接表中选择数据并按它们进行分组。如果您打算从这些表中检索数据,则不能使用“EXISTS”。 'EXISTS'只检查它们是否存在。它不会返回任何东西。 – Siyual

+0

你可能想看看这些表是如何编制索引的。 – Siyual

+0

存在什么?请描述 –

首先,使用明确的JOIN语法重写查询。如果没有别的,这可以更容易地看到该怎么做:

select DBSAITE.MITEM, DBSAITE.MPDSC, DBSAITE.MUTMS, MVSACPE.COSTUN, PCSACST.CSTTYAPP, 
SUM(PCSACST.CSTBURD1 + PCSACST.CSTBURD2 + PCSACST.CSTLABOR + 
PCSACST.CSTMAT + PCSACST.CSTSETUP + PCSACST.CSTEXTRN) as COSTO_STD 
from MVSACPE JOIN 
    PCSACST 
    ON PCSACST.CSTCOSC = MVSACPE.CODSOC AND 
     PCSACST.CSTITEM = MVSACPE.CODITM JOIN 
    DBSAITE 
    ON MVSACPE.CODITM = DBSAITE.MITEM 
WHERE DBSAITE.MCOSC = 'GRS' AND 
     MVSACPE.CODSOC = 'GRS23' AND 
     MVSACPE.DTPERI = '201512' AND 
     MVSACPE.CODMAG = 'ALL' AND 
     MVSACPE.CODCOS = 'MPR' AND 
     PCSACST.CSTDATE = '20150630' AND 
     PCSACST.CSTTYPE = 'SG' 
GROUP BY DBSAITE.MITEM, DBSAITE.MPDSC, DBSAITE.MUTMS, MVSACPE.COSTUN,PCSACST.CSTTYAPP; 

索引可能会帮助查询。目前还不清楚哪些条件最具选择性。缺乏其他信息,一个好的开始是这样的:

- `MVSACPE(CODSOC, DTPERI, CODMAG, CODCOS, CODITM)` 
- `PCSACST(CSTCOSC, CSTITEM, CSTDATE, CSTTYPE)` 
- `DBSAITE(MITEM, MCOSC)`