【发布时间】:2015-08-15 03:31:04
【问题描述】:
全部,
我在 Oracle 中面临以下情况的一个特殊问题。
View A - Column 1 - 5
Table B - Column 1, 2, 6-10 (Has millions of Rows)
视图 A 和表 B 之间的公共列是第 1 列和第 2 列。
表 B 在第 1、2 列有索引。
查询是这样的
SELECT vw.column3, vw.column4, vw.column5, tbl.column2, tbl.column6... tbl.column10
from viewA vw
join tableB tbl
on tbl.column1 = vw.column1
and tbl.column2 = vw.column2
虽然我加入了表上可用的索引,但查询正在对表进行全面扫描,而不是索引扫描。请帮助理解这个问题。
表已分析,无直方图,通过在查询中指定索引来尝试提示。
【问题讨论】:
-
是否有理由相信在 B 上使用索引是有益的?是否有理由相信视图 A 将返回表 B 中
column1, column2值的一小部分?看起来(天真地)表扫描将是最有效的方法,除非有一些您没有提到的非常有选择性的谓词。 -
由于表有数百万条记录查询结果需要更长的时间,我假设查询是否可以使用索引,它可能会更快..
-
是什么让你相信这一点?您没有 WHERE 子句来告诉数据库您希望如何对数据进行子集化,并且您正在访问不在索引上的字段;因此,如果数据库选择使用它必须读取索引的索引,那么它无论如何都必须转身读取表。从数据库的角度来看,只读取表更有效。
-
实际上,这里没有足够的信息来做出任何决定。可能只有一行从视图中出来,加入表会将整个查询的输出减少到一行。但是,我们不知道,因为我们不知道视图产生了多少行,或者它使用什么访问路径来实现它的结果集。
-
请发布此查询的解释计划(首先运行:
EXPLAIN PLAN FOR the_query,然后是SELECT * FROM table(DBMS_XPLAN.Display),然后复制粘贴最后一个命令的输出)。还请提供信息,你有什么样的索引 - 目前我们只知道你加入avaliable indexes,但我们不知道更多细节。
标签: oracle oracle11g query-performance sql-execution-plan