【发布时间】:2019-05-14 13:23:03
【问题描述】:
此查询引用了约 3M 条记录,现在需要一个绝对时间才能运行。 数据取自 Excel 电子表格,其中 Cust/Invoices 向下行,每月值 2016 到当前列。
此查询检查相同/不同产品在同一月份是否有值,如果可以忽略则输出 1,如果后续查询应考虑输出 0。
我已经为产品设置了一个索引,它负责初始条件,但它是绝对杀死这个的子查询:
UPDATE tbl_transactions a
SET ProdInCust_Mnth_Same_SameProd_LowerVal =
CASE WHEN
(
SELECT COUNT(TransactionID)
FROM tbl_transactions_tmp b
WHERE
b.TransactionID<>a.TransactionID AND
b.CustomerRef=a.CustomerRef AND
b.TransMonth=a.TransMonth AND
(
(
(b.Product='PLATINUM') AND
b.TransValue<0
)
OR
(
a.TransValue=0 AND
(b.Product='PLATINUM' OR b.Product='GOLD' OR b.Product='SILVER') AND
b.TransValue<0
)
OR
(
a.TransValue<0 AND
(b.Product='PLATINUM' OR b.Product='GOLD') AND
((b.TransValue=a.TransValue AND b.RowReference>a.RowReference) OR
b.TransValue<a.TransValue
)
)
)
)>0 THEN 1 ELSE 0 END
WHERE Product='GOLD';
解释产生:
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 UPDATE a \N index IDX_tbl_transactions_Product PRIMARY 8 \N 2828152 100 Using where
2 DEPENDENT SUBQUERY b \N ref IX_Transactions_SP_ProcessTransAA IX_Transactions_SP_ProcessTransAA 45 finance.a.CustomerRef,finance.a.TransMonth 1 20.7 Using where; Using index
从视觉上看,它说这是一个完整的索引扫描,我假设红色背景表明这很糟糕。
关于如何进一步优化的任何想法。
【问题讨论】:
-
您可能想在这里发布一个更简单的问题。
-
这是最小版本。它最初是一个大脚本,涵盖了其他三种产品,但我将它分解成更简单的块。我将把它(这部分)进一步分解为三个单独的语句,以拼命尝试让它发挥作用。
-
尝试为
TransValue添加索引并使用EXISTS而不是使用COUNT计数。 -
请提供
SHOW CREATE TABLE。
标签: mysql indexing mysql-dependent-subquery