[英]How can I replace WHERE IN choices in WHERE clause to reduce execution time of the request?
我在RAD Studio 10.2 Tokyo上編寫的C ++項目中使用DBF數據庫。 為了在此數據庫上發出請求,我使用了UniDac Devart組件(與MySQL本身相比有一點限制)。 我遇到的問題是在請求中使用WHERE IN條件時,該請求花了太多時間執行(有時超過一小時)。
這是我的要求:
SELECT accountrp, SUM(amounteur) AS montant FROM %s
WHERE doctype='1' AND period<>'00' AND
matchno IN(SELECT matchno FROM %s GROUP BY matchno HAVING SUM(amounteur)<>0)
GROUP BY accountrp
accountrp,doctype,period是字符,countereur是數字。
問題出在matchno IN的周圍。 我想在不使用IN的情況下優化請求。 我在Internet上看到可以用INNER JOIN聯結代替WHERE IN條件,但我不知道這是否是解決方案以及如何執行此操作。
你能幫我嗎 ?
您可以嘗試以下
SELECT s.accountrp, SUM(s.amounteur) AS montant FROM %s s
join
(SELECT matchno FROM %s GROUP BY matchno HAVING SUM(amounteur)<>0) t
on s.matchno =t.matchno
WHERE s.doctype='1' AND s.period<>'00'
GROUP BY s.accountrp
第一個建議是您可以在INNER JOIN中更改IN子句
這應該對性能更有效
SELECT accountrp,
SUM(amounteur) AS montant
FROM %s as s
INNER JOIN (
SELECT matchno
FROM %s
GROUP BY matchno
HAVING SUM(amounteur)<>0
) t on t.matchno = s.matchno
WHERE doctype='1' AND period<>'00' AND
GROUP BY accountrp
這是因為In子句等效於一組OR條件,並且每次為每個OR都執行查詢。內部聯接只是兩個表之間的聯接,而僅執行一次
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.