0

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

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 (select table2.col1 from table2)”条件,则查询的行为方式与索引查询所需的方式相同。

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

另外,条件的顺序重要吗?即,如果我在非索引子句之前给出索引子句,oracle 会仅在所选子集上应用非索引子句吗?

提前致谢。

4

1 回答 1

1

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

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

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

于 2013-05-17T11:15:10.673 回答