本文解释 OceanBase 数据库中的 Hint 引用 Table 时的注意事项。
适用版本
OceanBase 数据库所有版本。
详细信息
在 SQL 中使用 Hint 时需要注意,如果 Table 在 SQL 语句中指定了别名(correlation name),则需要在 Hint 中指定别名,而不能使用 Table 本命,否则 Hint 不生效。
示例如下:
表 a1 在 SQL 中的别名为 t1,直接在 hint /*+ index(a1 a1_i1) */ 中使用 a1 不能生效。
obclient [TEST2]> explain extended select /*+ index(a1 a1_i1) */ * from a1 t1 where id<=10\G
*************************** 1. row ***************************
Query Plan: ===================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
-----------------------------------
|0 |TABLE SCAN|T1 |2 |46 |
===================================
Outputs & filters:
-------------------------------------
0 - output([T1.ID(0x7f3a1259ce90)], [T1.NAME(0x7f3a1259d290)], [T1.AGE(0x7f3a1259d590)], [T1.AGE1(0x7f3a1259d890)], [T1.AGE2(0x7f3a1259db90)]), filter(nil),
access([T1.ID(0x7f3a1259ce90)], [T1.NAME(0x7f3a1259d290)], [T1.AGE(0x7f3a1259d590)], [T1.AGE1(0x7f3a1259d890)], [T1.AGE2(0x7f3a1259db90)]), partitions(p0),
is_index_back=false,
range_key([T1.ID(0x7f3a1259ce90)]), range(MIN ; 10],
range_cond([T1.ID(0x7f3a1259ce90) <= 10(0x7f3a1259c770)])
Used Hint:
-------------------------------------
/*+
*/
Outline Data:
-------------------------------------
/*+
BEGIN_OUTLINE_DATA
FULL(@"SEL$1" "TEST2.T1"@"SEL$1")
END_OUTLINE_DATA
*/
表 a1 在 SQL 中的别名为 t1,在 hint /*+ index(t1 a1_i1) */ 中使用 t1 则 hint 能生效。
obclient [TEST2]> explain extended select /*+ index(t1 a1_i1) */ * from a1 t1 where id<=10\G
*************************** 1. row ***************************
Query Plan: ========================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
----------------------------------------
|0 |TABLE SCAN|T1(A1_I1)|1 |92 |
========================================
Outputs & filters:
-------------------------------------
0 - output([T1.ID(0x7f32b495c860)], [T1.NAME(0x7f32b495cc60)], [T1.AGE(0x7f32b495cf60)], [T1.AGE1(0x7f32b495d260)], [T1.AGE2(0x7f32b495d560)]), filter([T1.ID(0x7f32b495c860) <= 10(0x7f32b495c140)]),
access([T1.ID(0x7f32b495c860)], [T1.NAME(0x7f32b495cc60)], [T1.AGE(0x7f32b495cf60)], [T1.AGE1(0x7f32b495d260)], [T1.AGE2(0x7f32b495d560)]), partitions(p0),
is_index_back=true, filter_before_indexback[true],
range_key([T1.NAME(0x7f32b495cc60)], [T1.AGE(0x7f32b495cf60)], [T1.ID(0x7f32b495c860)]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
Used Hint:
-------------------------------------
/*+
INDEX(@"SEL$1" "TEST2.T1"@"SEL$1" "A1_I1")
*/
Outline Data:
-------------------------------------
/*+
BEGIN_OUTLINE_DATA
INDEX(@"SEL$1" "TEST2.T1"@"SEL$1" "A1_I1")
END_OUTLINE_DATA
*/