使用一个大表和一个小表加速查询,简单的内部联接

时间:2010-06-09 15:13:26

标签: sql postgresql join performance

我有一个包含60行和5列的表T1:ID1,ID2,info1,info2,info3。

我有一个包含120万行和另外5列的表T2:ID3,ID2,info4,info5,info6。

我想从ID2匹配的所有行中获取(ID1,ID2,info4,info5,info6)。目前我的查询如下:

SELECT T1.ID1, T2.ID2,
       T2.info4, T2.info5, T2.info6
  FROM T1, T2
 WHERE T1.ID2 = T2.ID2;

这需要大约15秒才能运行。我的问题是 - 如果需要很长时间,如果没有,我怎样才能加快速度?我认为它不应该因为T1太小了。

我要求PostgreSQL对EXPLAIN进行查询,然后它说它会哈希T2,然后哈希加入与T1的哈希。似乎哈希T2需要这么长时间。有没有办法编写查询,所以它不必哈希T2?或者,有没有办法让它缓存T2的哈希值,所以它不会重新做到这一点?这些表格每隔几天才会更新一次。

如果它有所不同,T1是会话早期创建的临时表。

3 个答案:

答案 0 :(得分:13)

不应该花那么长时间:)

T2( ID2 )上创建索引可以提高查询的效果:

CREATE INDEX idx_t2_id2 ON t2 (id2);

答案 1 :(得分:0)

可能正在使用JOIN增加查询速度:

SELECT T1.ID1, T2.ID2,
    T2.info4, T2.info5, T2.info6
FROM T1
JOIN T2 ON T2.ID2 = T1.ID2;

我不确切知道,但可能是你的查询首先加入两个表中的所有行,然后应用WHERE条件,这就是问题。

当然,正如Peter Lang所见,你应该创建索引。

答案 2 :(得分:0)

首先,进行联接。

SELECT T1.ID1, T2.ID2,
       T2.info4, T2.info5, T2.info6
  FROM T1
  JOIN T2 ON T1.ID2 = T2.ID2;

然后尝试在T2.d2上创建和索引。

如果没有,如果可能,您可以将ID1列添加到T2。您声称每隔几天就会相应更新一次。然后它只是一个关于T2的简单查询,没有连接。

SELECT T2.ID1, T2.ID2,
       T2.info4, T2.info5, T2.info6
  FROM T2 
  WHERE T2.ID2 = A_VALUE;

同样,建议使用T2.ID2的索引。

相关问题