【问题标题】:How can I optimise this slow PostgreSQL query如何优化这个缓慢的 PostgreSQL 查询
【发布时间】:2014-08-04 04:50:45
【问题描述】:

我已经跟踪到 SQL 查询的 API 端点速度慢的原因,但我终生无法对其进行优化。

查询如下:

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-4200 毫秒。查询的 EXPLAIN ANALYZE 的结果可以在这里找到: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 语句呢?

谢谢!

【问题讨论】:

  • 还向我们展示了索引的外观
  • @Jester 谢谢!我会更新我的问题,但我已经尝试将 IN() 分成几个“Show”。“tvdb_id”=259063 OR 等它最多节省了 10-20 毫秒:(
  • 我会尝试更改 WHERE 子句的顺序,假设 user.id 的限制比 IN 的记录数少?
  • 你有关于 tvdb_id 的索引吗?

标签: sql postgresql optimization


【解决方案1】:

尝试对 ShowId、EpisodeId、UserId 字段的表 Views 进行组合索引。

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

ps。解释链接错误,是为了其他查询

最好的问候,

内尔

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-09-21
  • 2021-01-27
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2014-07-04
相关资源
最近更新 更多