【发布时间】:2021-03-05 02:14:37
【问题描述】:
我有一些关于索引的问题。
首先,如果我在 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”组成。
在这种情况下,在表连接之前是否会在每个表中发生“索引扫描”?
如果你能给我一些正确的建议,我真的很感激。
【问题讨论】:
-
您应该在查询上运行
EXPLAIN以查看发生了什么。 -
不要忘记一个表可以有多个索引,而这些索引可以覆盖多个列。
-
答案可以这样表述:如果索引存在,优化器可能会或可能不会选择使用它们(基于几个考虑)。但是,
with子句和连接的where子句中存在的谓词都不会阻止优化器使用索引。我相信这确实是您的问题 - 要么单独使用with子句,要么单独使用连接,无需其他原因,阻止使用索引?答案是明确的“不”。如果您有未使用索引的实际案例,则必须寻找其他原因。