2011-05-04 26 views
0

我需要優化此查詢。教授建議使用指數,但我對如何使用非常困惑。如果我能得到一個好索引的例子,爲什麼,以及實際需要的代碼,我可以自己完成剩下的工作。任何幫助都是極好的。 (PSQL btw)需要幫助優化數據庫查詢。非常沒有經驗的指數

SELECT 
     x.enteredBy 
     , x.id 
     , count(DISTINCT xr.id) 
     , count(DISTINCT c.id) 
     , 'l' 
FROM 
     ((locationsV x left outer join locationReviews xr on x.id = xr.lid) 
     left outer join reviews r on r.id = xr.id) 
     left outer join comments c on xr.id = c.reviewId 
WHERE 
     x.vNo = 0 
     AND (r.enteredBy IS NULL OR 
      (r.enteredBy <> x.enteredBy 
      AND c.enteredBy <> x.enteredBy 
      AND r.enteredBY NOT IN 
         (SELECT requested FROM friends WHERE requester = x.enteredBY) 
      AND r.enteredBY NOT IN 
         (SELECT requester FROM friends WHERE requested = x.enteredBY))) 
    AND (c.enteredBy IS NULL OR 
      (c.enteredBY NOT IN 
         (SELECT requested FROM friends WHERE requester = x.enteredBY) 
      AND c.enteredBY NOT IN 
         (SELECT requester FROM friends WHERE requested = x.enteredBY))) 
GROUP BY 
    x.enteredBy 
    , x.id 

我試着在開始時添加這樣的東西,但總的時間並沒有改變。

CREATE INDEX friends1_idx ON friends(requested); 
CREATE INDEX friends2_idx ON friends(requester); 
+0

任何人都可以看到任何其他優化? – 2011-05-05 01:00:24

回答

1

我認爲除了查看索引之外,可以優化SQL本身以提高性能。在WHERE子句中使用IN子句可能會導致優化器執行全表掃描。所以如果你可以將它們移動到FROM部分的表格中,你將會獲得更好的性能。此外,在SELECT聲明中使用COUNT(DISTINCT ...)子句似乎有問題。如果您可以進行更改,則可能會更好,因此DISTINCT子句在此處是必需的,並且只需使用COUNT聚合函數。

考慮使用SQL語句FROM子句中你做的左連接之前 - 的結構是這樣的:

SELECT ... 
FROM Table1 LEFT JOIN 
    (SELECT ... FROM Table2 INNER JOIN Table3 ON ...) AS Table4 ON 
     Table1.somecolumn = Table4.somecolumn 
... 

我知道這是不是給你解決,但希望它會幫助你可以考慮問題的其他方面,並探索解決績效的其他方法。

+0

謝謝!任何索引的額外提示? – 2011-05-04 23:17:18

+0

我認爲最好使用DB分析工具來建議索引,而不是試圖猜測自己。大多數DB都會有工具讓你運行一個SQL命令,這個命令將被分析索引建議。除此之外,你需要一個能夠區分事物的索引。如果您爲90%的值相同的列索引,那麼除非您正在尋找10%的數據,否則它可能不會太有用。有很多獨特值的列可能是更好的索引。你也想索引你的查詢中使用的列 - 可能是「請求者」或「請求」你的情況。 – Shawn 2011-05-05 17:16:30