上海的一个哥们问我有个SQL跑了4个小时都没跑完,实在受不了了,找我优化一下。我确实挺佩服他的,要是我遇到跑了几分钟的,就受不了了。
SQL语句和执行计划如下:
--sql id:1qbbw3th4x8yc
SELECT "VOUCHER".FID "ID",
"ENTRIES".FID "ENTRIES.ID",
"ENTRIES".FEntryDC "ENTRIES.ENTRYDC",
"ACCOUNT".FID "ACCOUNT.ID",
"ENTRIES".FCurrencyID "CURRENCY.ID",
"PERIOD".FNumber "PERIOD.NUMBER",
"ENTRIES".FSeq "ENTRIES.SEQ",
"ENTRIES".FLocalExchangeRate "LOCALEXCHANGERATE",
"ENTRIES".FReportingExchangeRate "REPORTINGEXCHANGERATE",
"ENTRIES".FMeasureUnitID "ENTRYMEASUREUNIT.ID",
"ASSISTRECORDS".FID "ASSISTRECORDS.ID",
"ASSISTRECORDS".FSeq "ASSISTRECORDS.SEQ",
CASE
WHEN (("ACCOUNT".FCAA IS NULL) AND
("ACCOUNT".FhasUserProperty <> 1)) THEN
"ENTRIES".FOriginalAmount
ELSE
"ASSISTRECORDS".FOriginalAmount
END "ASSISTRECORDS.ORIGINALAMOUNT",
CASE
WHEN (("ACCOUNT".FCAA IS NULL) AND
("ACCOUNT".FhasUserProperty <> 1)) THEN
"ENTRIES".FLocalAmount
ELSE
"ASSISTRECORDS".FLocalAmount
END "ASSISTRECORDS.LOCALAMOUNT",
CASE
WHEN (("ACCOUNT".FCAA IS NULL) AND
("ACCOUNT".FhasUserProperty <> 1)) THEN
"ENTRIES".FReportingAmount
ELSE
"ASSISTRECORDS".FReportingAmount
END "ASSISTRECORDS.REPORTINGAMOUNT",
CASE
WHEN (("ACCOUNT".FCAA IS NULL) AND
("ACCOUNT".FhasUserProperty <> 1)) THEN
"ENTRIES".FQuantity
ELSE
"ASSISTRECORDS".FQuantity
END "ASSISTRECORDS.QUANTITY",
CASE
WHEN (("ACCOUNT".FCAA IS NULL) AND
("ACCOUNT".FhasUserProperty <> 1)) THEN
"ENTRIES".FStandardQuantity
ELSE
"ASSISTRECORDS".FStandardQuantity
END "ASSISTRECORDS.STANDARDQTY",
CASE
WHEN (("ACCOUNT".FCAA IS NULL) AND
("ACCOUNT".FhasUserProperty <> 1)) THEN
"ENTRIES".FPrice
ELSE
"ASSISTRECORDS".FPrice
END "ASSISTRECORDS.PRICE",
CASE
WHEN ("ACCOUNT".FCAA IS NULL) THEN
NULL
ELSE
"ASSISTRECORDS".FAssGrpID
END "ASSGRP.ID"
FROM T_GL_Voucher "VOUCHER"
LEFT OUTER JOIN T_BD_Period "PERIOD"
ON "VOUCHER".FPeriodID = "PERIOD".FID
INNER JOIN T_GL_VoucherEntry "ENTRIES"
ON "VOUCHER".FID = "ENTRIES".FBillID
INNER JOIN T_BD_AccountView "ACCOUNT"
ON "ENTRIES".FAccountID = "ACCOUNT".FID
LEFT OUTER JOIN T_GL_VoucherAssistRecord "ASSISTRECORDS"
ON "ENTRIES".FID = "ASSISTRECORDS".FEntryID
WHERE "VOUCHER".FID IN
(SELECT "VOUCHER".FID "ID"
FROM T_GL_Voucher "VOUCHER"
INNER JOIN T_GL_VoucherEntry "ENTRIES"
ON "VOUCHER".FID = "ENTRIES".FBillID
INNER JOIN T_BD_AccountView "ACCOUNT"
ON "ENTRIES".FAccountID = "ACCOUNT".FID
INNER JOIN t_bd_accountview PAV
ON ((INSTR("ACCOUNT".flongnumber, pav.flongnumber) = 1 AND
pav.faccounttableid = "ACCOUNT".faccounttableid) AND
pav.fcompanyid = "ACCOUNT".fcompanyid)
WHERE (("VOUCHER".FCompanyID IN ('fSSF82rRSKexM3KKN1d0tMznrtQ=')) AND
(("VOUCHER".FBizStatus IN (5)) AND
((("VOUCHER".FPeriodID IN ('+wQxkBFVRiKnV7OniceMDoI4jEw=')) AND
"ENTRIES".FCurrencyID =
'dfd38d11-00fd-1000-e000-1ebdc0a8100dDEB58FDC') AND
(pav.FID IN ('vyPiKexLRXiyMb41VSVVzJ2pmCY='))))))
ORDER BY "ID" ASC, "ENTRIES.SEQ" ASC, "ASSISTRECORDS.SEQ" ASC
--执行计划
------------------------------------------------------------------------