包含36条记录的表与2,151,316条记录的表连接

时间:2018-04-08 10:23:25

标签: sql oracle

我正在使用Oracle。如果我不加入只有36条记录的表,我的查询运行得很快。如果我加入则需要将近2秒钟。现在我想改进查询。这是查询的一瞥,

SELECT BT.Col1, Count('t') 
FROM BigTable BT
INNER JOIN  SmallTable ST ON ST.SomeCol = BT.SomeCol
GROUP BY BT.Col1

我也用EXISTS进行了测试,但时间保持不变。

BigTable有2,151,300条记录和36条小记录。

2 个答案:

答案 0 :(得分:1)

在BigTable上创建此索引:

CREATE INDEX big_covering_ix ON BigTable( SomeCol, Col1 );

我不确定常量t的目的是什么:

SELECT  ..... Count('t') 

它会更简单:Count(*)。 无论如何,它不会影响查询的速度。

答案 1 :(得分:1)

我建议将其写为exists,然后添加索引。查询是:

SELECT BT.Col1, Count(*) 
FROM BigTable BT
WHERE EXISTS (SELECT 1 FROM SmallTable ST WHERE ST.SomeCol = BT.SomeCol)
GROUP BY BT.Col1;

这假定SmallTable没有重复。

对于此查询,请尝试BigTable(col1, somecol)上的索引。