加入需要太长时间

时间:2011-02-24 17:17:21

标签: sql database performance oracle join

我有这个查询,在Oracle中运行大约需要5分钟:

select t1.A,t2.B,t2.C,t2.D,t2.E 
from TABLE1 t1 join TABLE2 t2 
on t2.X = t1.Y 
where t1.F = <integer> 
and t2.G = <integer> 
and t1.H = <integer> 

t1有170万行,t2有3100万行。我有关于t2.X和t1.F的索引。尝试在t1.Y,t2.G和t1.H上添加指数,但他们没有帮助。我有什么想法可以改善这种联接的表现吗?

1 个答案:

答案 0 :(得分:3)

查看所涉及的所有字段,每个表上的覆盖索引将涉及可能的列

t1: Y, F, H, A
t2: X, G, C, D, E

任何标准的选择性如何:t2.X,t2.G或t1.Y,t1.F,t1.H?

如果单个列都没有足够的选择性(理想情况下为0.5%或更低),您可能需要创建一个或多个涉及多个列的覆盖索引,例如

t2 (G, X)
t1 (H, F, Y)

注意:索引中列的顺序非常重要 - 始终将最具选择性(将列数据划分为最不同的集合)放在第一位。

以存储为代价,您可以通过在索引本身中提供所有必需的列来使索引覆盖查询。这意味着查询根本不需要返回表数据。

create index ix_t2 on t2 (G,X) INCLUDE (C,D,E)
create index ix_t1 on t1 (H,F,Y) INCLUDE (A)

修改

看起来我在那里放了一个SQL Server DDL。在Oracle中,您必须将索引扩展为t2(G,X,C,D,E) - 但这会增加索引使用的选择性要求,因为索引键变得非常长。