2014-06-13 49 views
2

我已經跟蹤了一個緩慢的API端點到SQL查詢的原因,並且不能爲我的生活進行優化。如何優化這個緩慢的PostgreSQL查詢

查詢如下:

SELECT "Views".*, "Show".*, "Episode".*, "User".* FROM "Views" 
LEFT OUTER JOIN "Shows" AS "Show" ON "Show"."id" = "Views"."ShowId" 
LEFT OUTER JOIN "Episodes" AS "Episode" ON "Episode"."id" = "Views"."EpisodeId" 
LEFT OUTER JOIN "Users" AS "User" ON "User"."id" = "Views"."UserId" 
WHERE "Show"."tvdb_id" IN (259063,82066,258823,265766,261742,82283,205281,182061,121361) 
AND "User"."id"=29; 

它需要3000-4200ms之間完成。的EXPLAIN分析其對查詢結果可以在這裏找到:http://explain.depesz.com/s/J9R

編輯:我也曾嘗試IN()分成OR值:

SELECT "Views".*, "Show".*, "Episode".*, "User".* FROM "Views" 
LEFT OUTER JOIN "Shows" AS "Show" ON "Show"."id" = "Views"."ShowId" 
LEFT OUTER JOIN "Episodes" AS "Episode" ON "Episode"."id" = "Views"."EpisodeId" 
LEFT OUTER JOIN "Users" AS "User" ON "User"."id" = "Views"."UserId" 
WHERE 
    "Show"."tvdb_id"=259063 OR 
    "Show"."tvdb_id"=82066 OR 
    "Show"."tvdb_id"=258823 OR 
    "Show"."tvdb_id"=265766 OR 
    "Show"."tvdb_id"=261742 OR 
    "Show"."tvdb_id"=82283 OR 
    "Show"."tvdb_id"=205281 OR 
    "Show"."tvdb_id"=182061 OR 
    "Show"."tvdb_id"=121361 
AND "User"."id"=29; 

我曾嘗試在列上創建索引參考LEFT OUTER JOIN但導致邊際收益(如果有的話)。有趣的是,我也嘗試將WHERE x IN減少到一個WHERE x = y,這立即改善了情況,而在200-300毫秒內做出了迴應。那麼我將如何去優化IN語句呢?

謝謝!

+0

IN轉換爲OR – Jester

+0

也向我們展示指標是如何尋找ATM – Jester

+0

@Jester謝謝!我會更新我的問題,但我已經嘗試將IN()分成幾個「顯示」。「tvdb_id」= 259063或等等它最多保存10-20ms :( – Illizian

回答

0

嘗試在表格視圖上的ShowId,EpisodeId,UserId上進行組合索引。

CREATE INDEX Views_idx ON Views 
    USING btree (ShowId, EpisodeId, UserId); 

ps。解釋鏈接是錯誤的,它是一些其他的查詢

最好的問候,

NELE

+0

不幸的是,這似乎並沒有增加性能:(謝謝! – Illizian

+0

你能提供正確的解釋輸出爲這個查詢? –

+0

很確定鏈接是正確的,我做了另一個http://explain.depesz.com/s/bXu,並用原始查詢和輸出更新了要點(這裏是https://gist.github.com/Illizian/e00aed6dec146e919c93#file-explain-sql ) – Illizian