不确定题目:创建Outline的语句如下:CREATE OUTLINE ot1 ON "SELECT/*+index(t1 ix1)*/C1+1,C2,C3 FROM T1 WHERE C1=1";以下哪个语句可以命中该Outline?

创建Outline的语句如下:CREATE OUTLINE ot1 ON “SELECT/+index(t1 ix1)/C1+1,C2,C3 FROM T1 WHERE C1=1”;以下哪个语句可以命中该Outline?

A. SELECT C1+2,C2,C3 FROM T1 WHERE C1=5

B. SELECT C1+1,C3,C2 FROM T1 WHERE C1=5

C. SELECT C1+1,C2,C3 FROM T1 WHERE C1=199

D. SELECT C1+1,C2, C3 FROM T1 WHERE C1=5

1 个赞

正确答案是 D
D 选项:SELECT C1+1,C2, C3 FROM T1 WHERE C1=5
表达式 C1+1、列顺序 C2, C3 与原语句完全一致,仅常量值 C1=5 不同(常量不影响匹配),因此可以命中 Outline。

Oracle 的 Outline 匹配逻辑是基于语句的文本结构进行严格匹配,包括:
列的顺序、表达式必须和创建 Outline 时的语句完全一致
空格、换行等不影响,但列顺序、别名、表达式不能改变
条件中的常量值(如 C1=1)不参与 Outline 匹配,所以 C1=5、C1=199 都可以命中

其余错误,我们来逐一分析:
A 选项:SELECT C1+2,C2,C3 FROM T1 WHERE C1=5
表达式 C1+2 与原语句的 C1+1 不一致,无法命中。
B 选项:SELECT C1+1,C3,C2 FROM T1 WHERE C1=5
列的顺序 C3,C2 与原语句的 C2,C3 不一致,无法命中。
C 选项:SELECT C1+1,C2,C3 FROM T1 WHERE C1=199
虽然表达式和列顺序都和原语句一致,但原语句创建时包含 /+index(t1 ix1)/ 提示,而该选项的语句没有任何额外空格或格式匹配问题。

C选项为什么不对?

答案是D