我正在使用Oracle 11g。
我有一个包含1016736行的大表和另一个包含2007行的小表。我想将这两个表连接到一个视图中。
我加入这些表格如下。
其中big_table.id = small_table.id(+)
我假设,这将通过查看小表1016736次来形成视图。是否有更优化的方法来做到这一点?
现在的查询速度较慢,我想让它更快。
任何想法都会受到赞赏,因为我是Oracle新手。
---编辑--- 这是我的观点的脚本。
select a.col1, a.col2, a.col100, b.col1, b.col2, b.col3
from big_table a, small_table b where a.col1 = b.col1 (+)
答案 0 :(得分:2)
如果您要从视图中选择而不在任何一个表上放置任何谓词,那么Oracle将根据不同值的数量以及连接列中的最大值和最小值以及任何直方图来估计连接基数present - 投影的行数可以是0到1016736 x 2007(当每个连接列的每个行具有相同的单个值时)
然后,连接类型将取决于此估计值。
通常,您会看到此类查询的散列外连接,这非常有效,并且比读取查询投影所需的数据成本高得多。
对于简单计数(*),如果连接列上有索引并且大表的连接列被约束为NOT NULL(或者您使用某种方法来确保索引中包含空值)那么它们每个都可以快速完全扫描,结果哈希外部连接。表现非常好。
如果您的特定查询速度很慢,则需要执行计划来帮助优化。
答案 1 :(得分:0)
连接正常,只需为每个表创建一个“Id”索引。
尝试更新统计信息:
每张表:
ANALYZE TABLE XXXX_TABLE DELETE STATISTICS;
ANALYZE TABLE XXXX_TABLE COMPUTE STATISTICS;