W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Hint 是 SQL 語句中將指令傳遞給 OceanBase 數(shù)據(jù)庫優(yōu)化器或服務(wù)器的一種注釋。通過 Hint 可以使優(yōu)化器或服務(wù)器生成某種特定的計劃。 一般情況下,優(yōu)化器會為用戶查詢選擇最佳的執(zhí)行計劃,不需要用戶主動使用 Hint 指定,但在某些場景下,優(yōu)化器生成的執(zhí)行計劃可能不滿足用戶的要求,這時就需要用戶使用 Hint 來主動指定并生成特殊的執(zhí)行計劃。
Hint 應(yīng)該少用,僅在您收集了相關(guān)表的統(tǒng)計信息并且使用 ?EXPLAIN PLAN
? 語句在沒有 Hint 的情況下評估了優(yōu)化器計劃之后,才謹慎考慮使用。更改數(shù)據(jù)庫條件以及在后續(xù)版本中增強查詢性能可能會導(dǎo)致您代碼中的 Hint 對性能產(chǎn)生重大影響。
一個語句塊只能有一個注釋包含 Hint,并且該注釋必須跟隨 ?SELECT
?、?UPDATE
?、?INSERT
?、?MERGE
? 或 ?DELETE
? 關(guān)鍵字。
以下是 Hint 在語句塊注釋中的語法格式:
/*+[hint text]*/
Hint 從語法上看是一種特殊的 SQL 注釋, 所不同的是在注釋的左標記后增加了一個加號(+)。 如果服務(wù)器端無法識別 SQL 語句中的 Hint,那么優(yōu)化器會選擇忽略用戶指定的 Hint 而使用默認計劃所生成邏輯。另外需要指明的是,Hint 只影響優(yōu)化器所生成的計劃的邏輯,而不影響 SQL 語句的語義。
以下是定義 Hint 時需要注意的一些規(guī)則:
DELETE
?、?INSERT
?、?MERGE
?、?SELECT
? 或 ?UPDATE
? 關(guān)鍵字的 Hint 無效。您可以通過在許多 Hint 中定義一個可選的查詢塊名稱,以此來指定該 Hint 適用的查詢塊。使用此語法,允許您在外部查詢中指定一個應(yīng)用于嵌入式視圖的 Hint。
查詢塊參數(shù)的語法格式為 ?@queryblock
?,其中 ?queryblock
? 是在查詢中被指定的查詢塊的標識符。?queryblock
? 標識符可以是系統(tǒng)生成的,也可以是用戶自己指定的。當(dāng)您在查詢塊中直接指定要應(yīng)用的 Hint 時,將忽略 ?@queryblock
?。
EXPLAIN PLAN
? 生成,預(yù)轉(zhuǎn)換查詢塊的名稱可以通過對使用了 ?NO_QUERY_TRANSFORMATION
? Hint 的查詢運行 ?EXPLAIN PLAN
? 生成。QB_NAME
? 來指定用戶自定義的名稱。許多 Hint 既可以應(yīng)用于特定的表或索引,也可以更全局地應(yīng)用于視圖中的表或一部分索引的列。語法元素 ?tablespec
? 和 ?indexspec
? 定義了這些全局 Hint。
以下是 ?tablespec
? 的語法:
[ view.[ view. ]... ]table
您必須完全按照在語句中顯示的方式來指定要訪問的表。如果該語句使用表的別名,則在 Hint 中使用也使用別名而不是表名。但是,即使 Schema 名稱出現(xiàn)在語句中,也不要在 Hint 中使用的表名中包含 Schema 名稱。
注意
使用 ?tablespec
? 子句指定全局 Hint 對于使用 ANSI 連接的查詢不起作用,因為優(yōu)化器在解析期間會生成額外的視圖。相反,可以通過 ?@queryblock
? 來指定該提示所應(yīng)用到的查詢塊。
以下是? indexspec
?的語法:
{ index
| ( [ table. ]column [ [ table. ]column ]...)
}
在 Hint 的說明部分,當(dāng) ?tablespec
? 后跟著 ?indexspec
? 時,允許但不要求使用逗號來分隔表名和索引名。也允許(但不是必需)使用逗號分隔多次出現(xiàn)的 ?indexspec
?。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: