繁体   English   中英

如何加快MySQL Select Case查询

[英]How to speed up MySQL Select Case query

我在其他SO用户的帮助下对其他几个SQL查询使用了相同的格式。 它可以在行数不多的表上很好地工作,但是我现在正在努力使该查询与3个表(每个表有约65K行)一起工作。 该查询尚未完成运行(我在做其他事情时让它在后台运行,大约8个小时后就放弃了)。 同一查询将在几分钟内在大约2万行的表上运行。 我试过在联接字段(具有多个字段的1个索引和单独的单个字段索引)上的表上创建索引,但还是没有运气。 我想知道是否还有其他方法可以优化此查询,或者我可以采用其他方法来获得类似的结果。

SELECT a.PART_KIT_ID, `PART_KIT_NAME`,`EXTERNAL_SYS_PART_ID`, `ATA_NUMBER`, `PART_KIT_DESC`, `ACTIVE_IND`, `Flag NameA`, `Parameter Name`, `Flag NameB`, `AutoCAT`, `ICAM`, `ICAM_PRIOR`
 from (SELECT b.PART_KIT_ID
, CASE WHEN b.CTLG_VER_ID <> c.CTLG_VER_ID and b.CTLG_VER_ID <> a.CTLG_VER_ID THEN 'CTLG VER ID FLAG A' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.CTLG_VER_ID = c.CTLG_VER_ID and b.CTLG_VER_ID <> a.CTLG_VER_ID THEN 'CTLG VER ID FLAG B' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, d.ATA_NUMBER `ATA_NUMBER`
, d.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
, d.ACTIVE_IND `ACTIVE_IND`
, 'CTLG_VER_ID' `Parameter Name`
, a.CTLG_VER_ID `AutoCAT`
, b.CTLG_VER_ID `ICAM`
, c.CTLG_VER_ID `ICAM_PRIOR`
FROM cost_part_kit_attrib_ctlg_pq_acat a
JOIN cost_part_kit_attrib_ctlg_pq_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = b.ATTRIB_ID
JOIN cost_part_kit_attrib_ctlg_pq_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = c.ATTRIB_ID
LEFT OUTER JOIN acat_attribute d on a.ACAT_PART_KIT_ID = d.AUTOCAT_PART_KIT_ID 
UNION ALL
SELECT b.PART_KIT_ID 
, CASE WHEN b.CTLG_NAME <> c.CTLG_NAME and b.CTLG_NAME <> a.CTLG_NAME THEN 'CTLG NAME FLAG A' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.CTLG_NAME = c.CTLG_NAME and b.CTLG_NAME <> a.CTLG_NAME THEN 'CTLG NAME FLAG B' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, d.ATA_NUMBER `ATA_NUMBER`
, d.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
, d.ACTIVE_IND `ACTIVE_IND`
, 'CTLG_NAME' `Parameter Name`  
, a.CTLG_NAME `AutoCAT`
, b.CTLG_NAME `ICAM`
, c.CTLG_NAME `ICAM_PRIOR`
FROM cost_part_kit_attrib_ctlg_pq_acat a
JOIN cost_part_kit_attrib_ctlg_pq_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = b.ATTRIB_ID
JOIN cost_part_kit_attrib_ctlg_pq_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = c.ATTRIB_ID
LEFT OUTER JOIN acat_attribute d on a.ACAT_PART_KIT_ID = d.AUTOCAT_PART_KIT_ID
UNION ALL
SELECT b.PART_KIT_ID
, CASE WHEN b.PART_KIT_NAME <> c.PART_KIT_NAME and b.PART_KIT_NAME <> a.PART_KIT_NAME THEN 'PART KIT NAME FLAG A' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.PART_KIT_NAME = c.PART_KIT_NAME and b.PART_KIT_NAME <> a.PART_KIT_NAME THEN 'PART KIT NAME FLAG B' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, d.ATA_NUMBER `ATA_NUMBER`
, d.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
, d.ACTIVE_IND `ACTIVE_IND`  
, 'PART_KIT_NAME' `Parameter Name`
, a.PART_KIT_NAME `AutoCAT`
, b.PART_KIT_NAME `ICAM`
, c.PART_KIT_NAME `ICAM_PRIOR`
FROM cost_part_kit_attrib_ctlg_pq_acat a
JOIN cost_part_kit_attrib_ctlg_pq_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = b.ATTRIB_ID
JOIN cost_part_kit_attrib_ctlg_pq_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = c.ATTRIB_ID
LEFT OUTER JOIN acat_attribute d on a.ACAT_PART_KIT_ID = d.AUTOCAT_PART_KIT_ID
UNION ALL
SELECT b.PART_KIT_ID
, CASE WHEN b.ATTRIB_ID <> c.ATTRIB_ID and b.ATTRIB_ID <> a.ATTRIB_ID THEN 'ATTRIB_ID FLAG A' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.ATTRIB_ID = b.ATTRIB_ID and b.ATTRIB_ID <> a.ATTRIB_ID THEN 'ATTRIB_ID ID FLAG B' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, d.ATA_NUMBER `ATA_NUMBER`
, d.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
, d.ACTIVE_IND `ACTIVE_IND`  
, 'ATTRIB_ID' `Parameter Name`
, a.ATTRIB_ID `AutoCAT`
, b.ATTRIB_ID `ICAM`
, c.ATTRIB_ID `ICAM_PRIOR`
FROM cost_part_kit_attrib_ctlg_pq_acat a
JOIN cost_part_kit_attrib_ctlg_pq_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = b.ATTRIB_ID
JOIN cost_part_kit_attrib_ctlg_pq_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = c.ATTRIB_ID
LEFT OUTER JOIN acat_attribute d on a.ACAT_PART_KIT_ID = d.AUTOCAT_PART_KIT_ID
UNION ALL
SELECT b.PART_KIT_ID
, CASE WHEN b.ATTRIB_NAME <> c.ATTRIB_NAME and b.ATTRIB_NAME <> a.ATTRIB_NAME THEN 'ATTRIB_NAME FLAGA' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.ATTRIB_NAME = c.ATTRIB_NAME and b.ATTRIB_NAME <> a.ATTRIB_NAME THEN 'ATTRIB_NAME FLAGB' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, d.ATA_NUMBER `ATA_NUMBER`
, d.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
, d.ACTIVE_IND `ACTIVE_IND`  
, 'ATTRIB_NAME' `Parameter Name`
, a.ATTRIB_NAME `AutoCAT`
, b.ATTRIB_NAME `ICAM`
, c.ATTRIB_NAME `ICAM_PRIOR`
FROM cost_part_kit_attrib_ctlg_pq_acat a
JOIN cost_part_kit_attrib_ctlg_pq_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = b.ATTRIB_ID
JOIN cost_part_kit_attrib_ctlg_pq_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = c.ATTRIB_ID
LEFT OUTER JOIN acat_attribute d on a.ACAT_PART_KIT_ID = d.AUTOCAT_PART_KIT_ID
UNION ALL
SELECT b.PART_KIT_ID
, CASE WHEN b.ATTRIB_DESC <> c.ATTRIB_DESC and b.ATTRIB_DESC <> a.ATTRIB_DESC THEN 'ATTRIB_DESC FLAGA' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.ATTRIB_DESC = c.ATTRIB_DESC and b.ATTRIB_DESC <> a.ATTRIB_DESC THEN 'ATTRIB_DESC FLAGB' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, d.ATA_NUMBER `ATA_NUMBER`
, d.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
, d.ACTIVE_IND `ACTIVE_IND`  
, 'ATTRIB_DESC' `Parameter Name`
, a.ATTRIB_DESC `AutoCAT`
, b.ATTRIB_DESC `ICAM`
, c.ATTRIB_DESC `ICAM_PRIOR`
FROM cost_part_kit_attrib_ctlg_pq_acat a
JOIN cost_part_kit_attrib_ctlg_pq_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = b.ATTRIB_ID
JOIN cost_part_kit_attrib_ctlg_pq_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = c.ATTRIB_ID
LEFT OUTER JOIN acat_attribute d on a.ACAT_PART_KIT_ID = d.AUTOCAT_PART_KIT_ID
UNION ALL
SELECT b.PART_KIT_ID
, CASE WHEN b.ATTRIB_VALUE <> c.ATTRIB_VALUE and b.ATTRIB_VALUE <> a.ATTRIB_VALUE THEN 'ATTRIB_VALUE FLAGA' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.ATTRIB_VALUE = c.ATTRIB_VALUE and b.ATTRIB_VALUE <> a.ATTRIB_VALUE THEN 'ATTRIB_VALUE FLAGB' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, d.ATA_NUMBER `ATA_NUMBER`
, d.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
, d.ACTIVE_IND `ACTIVE_IND`  
, 'ATTRIB_VALUE' `Parameter Name`
, a.ATTRIB_VALUE `AutoCAT`
, b.ATTRIB_VALUE `ICAM`
, c.ATTRIB_VALUE `ICAM_PRIOR`
FROM cost_part_kit_attrib_ctlg_pq_acat a
JOIN cost_part_kit_attrib_ctlg_pq_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = b.ATTRIB_ID
JOIN cost_part_kit_attrib_ctlg_pq_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = c.ATTRIB_ID
LEFT OUTER JOIN acat_attribute d on a.ACAT_PART_KIT_ID = d.AUTOCAT_PART_KIT_ID 
UNION ALL
SELECT b.PART_KIT_ID
, CASE WHEN b.EXTERNAL_SYS_PART_ID <> c.EXTERNAL_SYS_PART_ID and b.EXTERNAL_SYS_PART_ID <> a.EXTERNAL_SYS_PART_ID THEN 'EXTERNAL_SYS_PART_ID FLAGA' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and b.EXTERNAL_SYS_PART_ID <> a.EXTERNAL_SYS_PART_ID THEN 'EXTERNAL_SYS_PART_ID FLAGB' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, d.ATA_NUMBER `ATA_NUMBER`
, d.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
, d.ACTIVE_IND `ACTIVE_IND`  
, 'EXTERNAL_SYS_PART_ID' `Parameter Name`
, a.EXTERNAL_SYS_PART_ID `AutoCAT`
, b.EXTERNAL_SYS_PART_ID `ICAM`
, c.EXTERNAL_SYS_PART_ID `ICAM_PRIOR`
FROM cost_part_kit_attrib_ctlg_pq_acat a
JOIN cost_part_kit_attrib_ctlg_pq_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = b.ATTRIB_ID
JOIN cost_part_kit_attrib_ctlg_pq_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = c.ATTRIB_ID
LEFT OUTER JOIN acat_attribute d on a.ACAT_PART_KIT_ID = d.AUTOCAT_PART_KIT_ID
UNION ALL
SELECT b.PART_KIT_ID
, CASE WHEN b.PART_KIT_ID <> c.PART_KIT_ID and b.PART_KIT_ID <> a.PART_KIT_ID THEN 'PART_KIT_ID FLAGA' ELSE NULL END AS `Flag NameA`
, CASE WHEN b.PART_KIT_ID = c.PART_KIT_ID and b.PART_KIT_ID <> a.PART_KIT_ID THEN 'PART_KIT_ID FLAGB' ELSE NULL END AS `Flag NameB`
, a.PART_KIT_NAME `PART_KIT_NAME`
, d.ATA_NUMBER `ATA_NUMBER`
, d.EXTERNAL_SYS_PART_ID `EXTERNAL_SYS_PART_ID`
, d.PART_KIT_DESC `PART_KIT_DESC`
, d.ACTIVE_IND `ACTIVE_IND`  
, 'PART_KIT_ID' `Parameter Name`
, a.PART_KIT_ID `AutoCAT`
, b.PART_KIT_ID `ICAM`
, c.PART_KIT_ID `ICAM_PRIOR`
FROM cost_part_kit_attrib_ctlg_pq_acat a
JOIN cost_part_kit_attrib_ctlg_pq_icam b ON a.EXTERNAL_SYS_PART_ID = b.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = b.ATTRIB_ID
JOIN cost_part_kit_attrib_ctlg_pq_icam_prior c on a.EXTERNAL_SYS_PART_ID = c.EXTERNAL_SYS_PART_ID and a.ATTRIB_ID = c.ATTRIB_ID
LEFT OUTER JOIN acat_attribute d on a.ACAT_PART_KIT_ID = d.AUTOCAT_PART_KIT_ID 
  ) a
  ORDER BY PART_KIT_ID

最初,我曾考虑过使用Unpivot,但由于我要处理的字段数量过多,建议不要这样做。 希望从专家那里得到建议/建议!

因此,我花了一些时间查看自己的联接,试图确保它们确实有意义-并且我意识到我的左外部联接正在联接的领域没有另一个领域那么有意义。 我的查询现在只需1分16秒即可运行!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM