再一次利用withas优化SQL(一)

2014-11-24 07:22:26 · 作者: · 浏览: 19

上海的一个哥们问我有个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 --执行计划 ------------------------------------------------------------------------