索引查询以及非索引条件

时间:2013-05-17 07:07:47

标签: sql oracle oracle11g query-performance

以下是我正在执行的查询。

select col1, col2 from table1 where col1 in (select table2.col1 from table2) and col2 = 'ABC' ;
  • 在table1中,col2上有索引,没有可用的索引 COL1。
  • 我在表1中有大约400万条'ABC'记录。
  • table1的总大小约为5000万。
  • table2的大小较小。大约100万。 (此表中没有索引)

查询需要花费大量时间才能完成。如果我删除“in(从table2中选择table2.col1)”条件,则查询的行为与索引查询所需的方式相同。

我的问题是, 如果我们在where子句中使用了索引列,并且我们包含非索引列的条件(特别是条件),是否有可能性能受到影响?关于查询的解释计划没有给出任何非索引提取的提示。

此外,条件的顺序是否重要? 即如果我在非索引子句之前给出了索引子句,那么oracle是否只对所选择的子集应用非索引子句?

提前致谢。

1 个答案:

答案 0 :(得分:1)

谓词的顺序无关紧要。优化器确定了。 它并不像“索引总是更好”那么简单,因此优化器会尝试评估每个谓词的“选择性”,然后确定“最佳”顺序。

如果确定一个谓词导致表的一小部分,并且存在索引,则可能会使用索引访问。在您的情况下,我认为索引不会对您有所帮助,除非这些行按col2进行物理排序(在磁盘上)。

如果您可以分享执行计划,我们可能会帮助您。