【发布时间】:2011-07-03 17:52:14
【问题描述】:
我有这个在 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 上添加索引,但它们没有帮助。有什么想法可以提高此联接的性能吗?
【问题讨论】:
-
可以发布查询计划吗?查询返回多少行?各种条件的选择性如何?
-
t2.G 和 t1.H 返回几乎整个表,t1.F 仅返回 2 行
-
如果对于任何给定的 F 值,T1 中只有 2 行,并且如果 T2 中 T1 中的每一行都有 10 行,那么您的对象统计信息似乎不正常。使用 T1.F 上的索引和 T2.X 上的索引的简单嵌套循环连接应该花费不到一秒的时间。即使查询计划恰好是 70 行,查看查询计划也会非常有用。
-
选择声明;按索引 ROWID (t1) 访问表;嵌套循环;表访问完全(t1); INDEX RANGE SCAN(t1.F 上的索引)
-
在下面的答案中创建索引后:SELECT STATEMENT;哈希连接;表访问完全(t2);按索引 ROWID (t1)、索引范围扫描(t1 上的索引(H、F、Y))的表访问
标签: sql database performance oracle join