我有此查询,大约需要5分钟才能在Oracle中运行:
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上添加索引,但它们没有帮助。有什么想法可以改善此联接的性能吗?
查看所有涉及的字段,每个表的覆盖索引将涉及可能的列
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)-但这会增加索引使用的选择性要求,因为索引键变得很长。