以下是我正在执行的查询。
select col1, col2 from table1 where col1 in (select table2.col1 from table2) and col2 = 'ABC' ;
查询需要花费大量时间才能完成。如果我删除“in(从table2中选择table2.col1)”条件,则查询的行为与索引查询所需的方式相同。
我的问题是, 如果我们在where子句中使用了索引列,并且我们包含非索引列的条件(特别是条件),是否有可能性能受到影响?关于查询的解释计划没有给出任何非索引提取的提示。
此外,条件的顺序是否重要? 即如果我在非索引子句之前给出了索引子句,那么oracle是否只对所选择的子集应用非索引子句?
提前致谢。
答案 0 :(得分:1)
谓词的顺序无关紧要。优化器确定了。 它并不像“索引总是更好”那么简单,因此优化器会尝试评估每个谓词的“选择性”,然后确定“最佳”顺序。
如果确定一个谓词导致表的一小部分,并且存在索引,则可能会使用索引访问。在您的情况下,我认为索引不会对您有所帮助,除非这些行按col2
进行物理排序(在磁盘上)。
如果您可以分享执行计划,我们可能会帮助您。