使用VBA中的SQL處理DB2數據庫以製作一些自定義報告。我想出了下面的查詢,但花了45分鐘才能運行80,000個結果......表BILLPRC可能在WHERE子句之前總共有兩次。只是想知道是否有更好的方法來編寫查詢來加快速度。這可能是一個相當含糊的問題,所以如果您需要更多信息,我可以進一步解釋。加快JOIN中CASE的SQL查詢
SELECT b.BLCO# || RIGHT('00000' || b.BLACCT, 5) Acct, b.BLRECT Type, b.BLREC# Record, i.INAME || ' ' || i.INAME2 Desc, b.BLPPGM# Promo, SUBSTR(b.BLPEFFD, 4, 2) || SUBSTR(b.BLPEFFD, 6, 2) || SUBSTR(b.BLPEFFD, 2, 2) Eff, SUBSTR(b.BLPENDD, 4, 2) || SUBSTR(b.BLPENDD, 6, 2) || SUBSTR(b.BLPENDD, 2, 2) Exp, CASE
WHEN (p.PPPRC1 = '0') THEN (p.PPPRC2)
WHEN (p.PPPRC1 != '0') THEN (p.PPPRC1) END Price,
CASE
WHEN (p.PPPRC1 = '0') THEN (p.PPCST2)
WHEN (p.PPPRC1 != '0') THEN (p.PPCST1) END Allow, i.ILASTC Cost
FROM QS36F.BILLPRC b
LEFT JOIN QS36F.PROMO p
ON b.BLREC# || b.BLPPGM# = p.PPREC || p.PPPGM#
LEFT JOIN QS36F.ITEM i
ON CASE
WHEN (b.BLRECT = 'I') AND (b.BLREC# = i.IMFGR || i.ICOLOR || i.IPATT) THEN 1
WHEN (b.BLRECT = 'P') AND (b.BLREC# = i.IPRCCD) THEN 1
END = 1
WHERE (b.BLPPGM# != '') AND (b.BLSTS != 'H')
ORDER BY (b.BLACCT)
我有一種感覺,沒有給出記錄和CASE被檢查的數量。
你可以使用索引視圖嗎? – userDEV 2014-12-03 18:51:36
要做的第一件事可能是將文件移出QS36F並創建實際的關係表。 System/36環境並不適用於高性能SQL(甚至可能不適用於中等性能)。仔細查看實際的文件定義。 – user2338816 2014-12-04 07:08:24
東西像'b.BLREC#|| b.BLPPGM#= p.PPREC || p.PPPGM#'意味着你有一個多部分密鑰,這違反了良好的規範化實踐。這也意味着你不能使用索引,所以查詢會很慢。你能比較一下列嗎?當'p'爲'null'時,'SELECT CASE'沒有明確列出大小寫。 DB2具有將CYMD日期轉換爲其他格式的實用程序。你的'ON CASE'是一個'OR'條件,這對一些人有幫助。 – 2014-12-04 13:54:50