【问题标题】:Inner joins involving three tables涉及三个表的内连接
【发布时间】:2011-07-02 06:31:48
【问题描述】:

我有一个 SELECT 语句,其中包含三个涉及两个表的内部联接。 除了在 ON 和 WHERE 子句中引用的列上创建索引之外,我还可以做些什么来优化连接,比如重写查询?

SELECT
  ...
FROM
  my_table AS t1
INNER JOIN
  my_table AS t2
ON 
  t2.id = t1.id
INNER JOIN
  other_table AS t3
ON
  t2.id = t3.id
WHERE
 ...

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您可以调整 PostgreSQL 配置、VACUUM ANALIZE 和所有常规优化。

    如果这还不够,您可以花几天时间编写代码来创建物化视图,如 postgresql wiki 中所述。

    【讨论】:

      【解决方案2】:

      您的示例中可能有错误,因为您从my_table 中选择了两次相同的记录,您真的可以这样做:

      SELECT
        ...
      FROM
        my_table AS t1
      INNER JOIN
        other_table AS t3
      ON
        t1.id = t3.id
      WHERE
       ...
      

      因为在您的示例代码中 t1 将始终为 t2。

      但假设您的意思是 ON t2.idX = t1.id;然后回答你的问题,你不能得到比你所拥有的更好的性能,你可以索引它们或者你可以更进一步并将它们定义为外键关系(与性能优势相比,这不会做太多非索引与索引它们)。

      您可能希望考虑限制您的 where 子句,也许这就是您的索引将(如果不是更多)有益的地方。

      您可以将查询编写为使用 WHERE EXISTS(如果您不需要从所有三个表中选择数据)而不是 INNER JOINS,但性能几乎相同(除非它本身在嵌套查询中)为它仍然需要找到记录。

      【讨论】:

        【解决方案3】:

        在 PostgreSQL 中。您的大部分调优都不会针对实际查询。目标是帮助优化器找出如何最好地执行声明式查询,而不是指定如何从程序中执行。这并不是说有时查询不能自己优化,或者它们可能不需要优化,但这没有我知道的任何问题区域,除非您要检索更多记录比你需要的(我见过偶尔发生)。

        首先要做的是运行真空分析以确保您获得最佳统计数据。然后使用解释分析将预期查询性能与实际进行比较。从那时起,我们将查看索引等。此查询中没有任何需要在查询级别上进行优化的内容。但是,如果不查看 where 子句中的实际过滤器和 explain analyze 的实际输出,就没有什么可以建议的了。

        通常您调整数据库以选择更好的查询计划,而不是在查询中指定它。这通常是 PostgreSQL 的方式。注释当然是通过指出有例外来限定的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-18
          • 1970-01-01
          • 2012-08-15
          • 1970-01-01
          • 2015-10-07
          • 1970-01-01
          • 2011-04-06
          相关资源
          最近更新 更多