簡體   English   中英

提高sql查詢速度

[英]Improve sql query speed

我有以下sql需要很長時間才能執行,有沒有更好的方法來編寫它來提高速度。

任何幫助都非常值得贊賞。

謝謝

    SELECT a.KeyField
    FROM Details a,
         Master b
    WHERE a.ForeignKeyField = b.ForeignKeyField
      AND a.KeyField IS NOT NULL
      AND Date BETWEEN 
TO_DATE ('01-01-2011', 'dd-mm-yyyy') AND TO_DATE ('31-12-2011', 'dd-mm-yyyy')
      AND a.KeyField IN
        (SELECT p.KeyField
         FROM Details p,
              Master q
         WHERE q.ForeignKeyField = p.ForeignKeyField
           AND p.KeyField IS NOT NULL
           AND p.KeyField = a.KeyField
           AND q.FKField2 = b.FKField2
         GROUP BY p.KeyField,
                  q.Date HAVING COUNT (DISTINCT q.ForeignKeyField) > 1)
    GROUP BY b.Id,
             b.Name,
             b.ForeignKeyField,
             b.Date,
             a.ForeignKeyField,
             a.SomeOtherField,
             a.KeyField,
             b.EtcEtc

對您的查詢運行一個EXPLAIN ,您將看到緩慢來自哪里。 但是,通常如果您可以避免嵌套查詢(您的IN語句)和DISTINCT您的查詢將更好地執行。 看看您是否可以在同一查詢中兩次加入DetailsMaster表並相應地放置索引

首先,您需要學習正確的連接語法。 我的猜測是,由於相關的子查詢,Oracle正在選擇次優的查詢路徑。 讓我們改為連接:

SELECT a.KeyField
FROM Details a join
 Master b
 on a.ForeignKeyField = b.ForeignKeyField join
 (SELECT p.KeyField, q.Date, q.FKField2
  FROM Details p join
       Master q
       on q.ForeignKeyField = p.ForeignKeyField
  WHERE p.KeyField IS NOT NULL AND
        q.FKField2 = b.FKField2
  GROUP BY p.KeyField, q.Date
  HAVING COUNT (DISTINCT q.ForeignKeyField) > 1
 ) t
 on a.KeyField = t.KeyField and
    b.FKField2 = t.FKField2
WHERE a.KeyField IS NOT NULL AND
  Date BETWEEN TO_DATE ('01-01-2011', 'dd-mm-yyyy') AND TO_DATE ('31-12-2011', 'dd-mm-yyyy') AND
GROUP BY b.Id, b.Name, b.ForeignKeyField, b.Date, a.ForeignKeyField, a.SomeOtherField, a.KeyField, 
     b.EtcEtc

以這種方式編寫也讓我意識到Date上沒有條件,盡管在子查詢中使用了它。 這個對嗎?

確保您已准備好相關指數。 檢查執行計划以驗證它們實際上是否正在使用。 在選擇索引時,Oracle非常挑剔。

我不明白內部查詢的原因。 我會這樣簡化:

SELECT a.KeyField
FROM Details a,
     Master b
WHERE a.ForeignKeyField = b.ForeignKeyField
  AND a.KeyField IS NOT NULL
  AND Date >= TO_DATE ('01-01-2011', 'dd-mm-yyyy')
  AND Date <= TO_DATE ('31-12-2011', 'dd-mm-yyyy')

GROUP BY b.Id,
         b.Name,
         b.ForeignKeyField,
         b.Date,
         a.ForeignKeyField,
         a.SomeOtherField,
         a.KeyField,
         b.EtcEtc
HAVING COUNT (DISTINCT q.ForeignKeyField) > 1

>=, <=替換BETWEEN也會有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM