未来OB之神
#1
创建Outline的语句如下:CREATE OUTLINE ot1 ON “SELECT/+ index(t1 ix1)/ C1,C2,C3 FROM T1 WHERE C1=1 ORDER BY 2”;以下哪个语句可以命中该Outline?
A. SELECT C1,C2,C3 FROM T1 WHERE C1=1 ORDER BY 1
B. SELECT C2,C1,C3 FROM T1 WHERE C1=2 ORDER BY 2
C. SELECT C2,C1,C3 FROM T1 WHERE C1=1 ORDER BY 1
D. SELECT C1,C2,C3 FROM T1 WHERE C1=2 ORDER BY 2
asjqn
#2
Outline 匹配的核心规则:
-
SQL 文本必须完全一致 :Outline 是基于 SQL 文本的精确匹配(除了字面量常量可以被参数化/忽略外,SQL 的结构、关键字、列的顺序、表名等必须完全相同)。
-
常量参数化 :
WHERE C1=1 中的 1 和 ORDER BY 2 中的 2 是常量。在匹配 Outline 时,这些常量通常会被忽略(即 C1=1 和 C1=2 视为相同,ORDER BY 2 和 ORDER BY 1 视为相同)。
-
列顺序不能变 :
SELECT C1,C2,C3 和 SELECT C2,C1,C3 的文本结构不同,无法命中同一个 Outline。
分析给定的 Outline 定义:
SELECT/+ index(t1 ix1)/ C1,C2,C3 FROM T1 WHERE C1=1 ORDER BY 2
- 提取列:
C1, C2, C3 (顺序固定)
- 表名:
T1
- 过滤条件:
C1=常量
- 排序:
ORDER BY 常量
逐一分析选项:
-
A. SELECT C1,C2,C3 FROM T1 WHERE C1=1 ORDER BY 1
- 列顺序:
C1,C2,C3 (匹配)
- 过滤条件:
C1=1 (常量匹配)
- 排序:
ORDER BY 1 (常量匹配)
- 结论:可以命中。
-
B. SELECT C2,C1,C3 FROM T1 WHERE C1=2 ORDER BY 2
- 列顺序:
C2,C1,C3 (不匹配 ,列顺序变了)
- 结论:无法命中。
-
C. SELECT C2,C1,C3 FROM T1 WHERE C1=1 ORDER BY 1
- 列顺序:
C2,C1,C3 (不匹配 ,列顺序变了)
- 结论:无法命中。
-
D. SELECT C1,C2,C3 FROM T1 WHERE C1=2 ORDER BY 2
- 列顺序:
C1,C2,C3 (匹配)
- 过滤条件:
C1=2 (常量匹配)
- 排序:
ORDER BY 2 (常量匹配)
- 结论:可以命中。
总结:
选项 A 和 D 都可以命中该 Outline。
正确答案:A、D
1 个赞