在这些情况下index是否仍然存在?



我有一些关于索引的问题。

首先,如果我在WITH子句中使用索引列,该列是否仍然可以作为主查询中的索引列?

例如,

WITH TEST AS (
SELECT EMP_ID
FROM EMP_MASTER
)
SELECT *
FROM TEST
WHERE EMP_ID >= '2000'

' EMP_MASTER'表中'EMP_ID'为PK, EMP_MASTER的索引由EMP_ID组成。

在这种情况下,是否'索引扫描'发生在主查询?

第二,如果我连接两个表,然后在WHERE中使用每个表的两个索引列,'索引扫描'发生吗?

例如,

SELECT *
FROM A, B
WHERE A.COL1 = B.COL1 AND
A.COL1 > 200 AND
B.COL1 > 100

表A的索引由'COL1'组成,表B的索引由'COL1'组成。

在这种情况下,在表连接之前是否在每个表中进行'Index Scan' ?

如果你能给我一些适当的建议,我真的很感激。

首先,SQL是一种声明性语言,而不是过程性语言。也就是说,SQL查询描述的是结果集,而不是特定的处理。SQL引擎使用优化器来确定生成结果集的最佳执行计划。

第二,Oracle有一个合理的优化器

因此,Oracle可能会在这些情况下使用索引。然而,你应该看看执行计划,看看Oracle到底做了什么。

首先,如果我在WITH子句中使用索引列,该列是否仍然作为主查询中的索引列?

是的。CTE (WITH部分)和其他查询一样,如果查询引用了索引使用的物理表列,那么引擎会使用索引,如果它认为这是个好主意

在这种情况下,是否'索引扫描'发生在主查询?

根据你提供的有限信息,我们无法判断。引擎将根据它对索引中数据分布(例如STATISTICS对象)和它所拥有的其他信息(例如缓存的查询执行计划)的启发式方法扫描或查找索引。

在这种情况下,在表连接之前是否在每个表中进行'索引扫描' ?

因为它是一个范围查询,所以引擎使用索引扫描而不是索引查找可能是有意义的——但是也可以执行表扫描并忽略索引,如果索引没有足够的选择性和特异性。还要考虑查询标志来强制读取未提交的数据(例如,为了性能和避免锁定)。

相关内容

最新更新