0

我正在使用 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 (+)
4

2 回答 2

2

如果您要从视图中选择而不在任一表上放置任何谓词,那么 Oracle 将根据不同值的数量以及连接列中的最大值和最小值以及存在的任何直方图来估计连接基数——投影的行数可以是从零到 1016736 x 2007 的任意值(当连接列的每一行都具有相同的单个值时)

然后,连接类型将取决于此估计。

通常,您会看到此类查询的散列外连接,与读取查询投影所需的数据相比,它非常有效且成本几乎不高。

对于一个简单的计数(*),如果您在连接列上有索引并且大表的连接列被限制为 NOT NULL(或者您使用某种方法来确保索引中包含空值),那么它们都可以是快速全扫描,结果散列外连接。性能会非常好。

如果您有特定的查询速度很慢,则需要执行计划来帮助优化。

于 2013-10-16T21:03:24.947 回答
0

连接没问题,只需为每个表的“Id”创建一个索引。

尝试更新统计信息:

对于每个表:

ANALYZE TABLE XXXX_TABLE DELETE STATISTICS;

ANALYZE TABLE XXXX_TABLE COMPUTE STATISTICS;
于 2013-10-16T20:47:50.523 回答