内部联接涉及三个表

时间:2011-07-02 06:31:49

标签: sql postgresql

我有一个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
 ...

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您的示例中可能有错误,因为您从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,但性能几乎相同(除非它本身在嵌套查询中)它仍然需要找到记录。

答案 2 :(得分:0)

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

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

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