【问题标题】:Oracle Index pick up甲骨文指数回升
【发布时间】: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


【解决方案1】:

Oracle 是否应该使用索引取决于很多因素。

i) 索引旨在平均提供log(n) 行为。它通过保持索引排序然后应用binary search 来实现这一点(它实际上使用tree structure 其中节点包含一些数据子集,但为了理解让我们坚持下去)。 所以,基本上二进制搜索是导致log(n)时间的搜索,但应该有一些东西可以搜索。在您的情况下,where 子句中没有指定任何内容,那么它应该搜索什么?它必须读取整个索引并最终读取整个表。 您可以尝试提供hint,但这可能会增加查询时间,并且您可以轻松了解 Oracle 不使用您的索引的原因。

ii) Cardinality (Selectivity) 的数据,但我认为这不是问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多