【DB筆試面試573】在Oracle中,經常使用Hint有哪些?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

         題目         部分

在Oracle中,經常使用Hint有哪些?程序員


     
         答案部分          



OracleHint是用來提示Oracle的優化器,用來選擇用戶指望的執行計劃。在許多狀況下,Oracle默認的執行方式並不老是最優的,只不過因爲平時操做的數據量比較小,因此,好的執行計劃與差的執行計劃所消耗的時間差別不大,用戶感受不到而已。但對於書寫操做大數據量的SQL而言,其SQL的書寫則須要先了解一下執行計劃是否最優或知足生產須要。一般當從開發環境遷移到生產環境下時,每每會出現此類狀況。面試

例如:假設有一張客戶表,在客戶類別上有索引。若是想查找某一類別用戶,而該類別用戶佔總數的比例高達90%,那麼此時採用全表掃描方式將會比索引掃描方式快。若是不使用Hint,那麼Oracle極可能會選擇使用索引方式來執行。sql

使用Hint能夠實現如下功能:數據庫

1)改變SQL中的表的關聯順序。微信

2)改變SQL中的表的關聯方式。網絡

3)實現並行方式執行DMLDDL以及SELECT語句。app

4)改變表的訪問路徑(數據讀取方式)。ide

5)調整查詢轉換類型,重寫SQL學習

6)調整優化器優化目標。大數據

7)調整優化器類型。

Oracle推出了一個隱含參數「_OPTIMIZER_IGNORE_HINTS」,取值爲TRUEFALSE,缺省值是FALSEOracle能夠經過將該隱含參數設置爲TRUE,使得Oracle優化器忽略語句中全部的Hint。顯然,Oracle提供此參數的目的就是在不修改應用的前提下,忽略全部Hint,讓Oracle優化器本身來選擇執行路徑。

Hint的語法格式以下所示:

1{SELECT | INSERT | UPDATE | DELETE | MERGE/*+ <具體的Hint內容>*/
2

     

關於Hint須要注意如下幾點:

Hint中第一個星號(*)和加號(+)之間不能有空格。

Hint中加號(+)和具體的Hint內容之間能夠有空格,也能夠沒有空格,但一般爲了規範和區別於註釋建議加上空格。

Hint中的具體內容能夠是單個Hint,也能夠是多個Hint的組合,若是是後者,那麼各個Hint間至少須要用1個空格來彼此分隔。

Hint必須緊隨關鍵字SELECTINSERTUPDATEDELETEMERGE以後。

若是在目標SQL中使用了Hint,那麼就意味着自動啓用了CBO,即Oracle會以CBO來解析含Hint的目標SQL。可是對於RULEDRIVING_SITE來講,它們能夠在RBO下使用,並且不自動啓用CBO

Hint中指定具體對象時(好比指定表名或索引名),不能帶上該對象所在SCHEMA的名稱,即便該SQL文本中己經有對應的SCHEMA名稱。

Hint中指定具體表名時,若是該表在對應SQL文本中有別名,那麼在Hint中應該使用該表的別名。

對於簡單的SQL語句通常只有一個查詢塊(Query Block),那麼在其上設置Hint其做用範圍就是該語句塊,而對於複雜的有多個查詢語句的SQL語句(例如查詢中用到了子查詢、內聯視圖、集合等操做時),各個Hint的做用域是不一樣的。Hint生效的範圍僅限於它自己所在的查詢塊,若是在Hint中不指定該Hint生效的查詢塊,那麼Oracle會默認認爲它生效的範圍是指該Hint所處於的查詢塊。

因爲各類緣由致使HintOracle忽略後,Oracle並不會給出任何提示或者警告,更不會報錯,目標SQL依然能夠正常執行。致使Hint失效的緣由一般有:

① 使用的Hint有語法或者拼寫錯誤。

② 使用的Hint是無效的(例如,在非等值鏈接中使用了USE_HASH)。

③ 使用的Hint是自相矛盾的(例如,即指定了FULL又指定了INDEX_FFS),但Oracle只是將自相矛盾的Hint所有忽略掉,而組合Hint中的其它Hint依然有效。

④ 使用的Hint受到了查詢轉換的干擾。

⑤ 依據Hint執行的結果是錯誤的(例如在非空的索引列上計算行數)。

⑥ 使用的Hint受到了保留關鍵字的干擾。Oracle在解析Hint的時候,從左到右進行,若是遇到一個詞是Oracle關鍵字或保留字,那麼Oracle將忽略這個詞以及以後的全部詞。若是遇到的一個詞既不是關鍵字也不是Hint,那麼就忽略該詞。若是遇到的詞是有效的Hint,那麼就會保留該HintOracle的保留字或者關鍵字能夠經過視圖V$RESERVED_WORDS來查詢。由此能夠知道下面5SQL語句中只有14中的APPEND提示是起做用的。

11. INSERT /*+ APPEND,PARALLEL(T1) */ INTO T1 SELECT * FROM T2;
22. INSERT /*+ PARALLEL(T1), APPEND */ INTO T1 SELECT * FROM T2;
33. INSERT /*+ THIS IS APPEND */ INTO T1 SELECT * FROM T2;
44. INSERT /*+ THIS APPEND */ INTO T1 SELECT * FROM T2;
55. INSERT /*+ NOLOGGING APPEND */ INTO T1 SELECT * FROM T2;
     


由於IS是一個關鍵字,(逗號)也是一個關鍵字,因此,上面的第2和第3SQLOracle解析時當遇到,IS時,就忽略了後面的全部Hint。在第4SQL中,THIS並非一個關鍵字,因此APPEND提示有效。爲了不這樣的狀況發生SQL中書寫Hint時,在/*+ */這種結構內只寫Hint,而不要寫逗號,或者是其的註釋。若是要對SQL寫註釋,那麼能夠在專門的註釋結構中書寫。

SQL語句優化過程當中,常常會用到Hint,經過在SQL語句中設置Hint從而影響SQL的執行計劃,經過V$SQL_HINT視圖能夠查詢全部的Hint,下表是一些經常使用的Hint

3-19 經常使用Hint介紹

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

建議對上表中每一個Hint都作相關的實驗來深刻學習,而本書再也不詳述。最後須要說明一下有關NOLOGGING的錯誤使用狀況。下面幾條SQL都是使用NOLOGGING時的錯誤用法:

1INSERT INTO T1 NOLOGGING;
2INSERT INTO T1 SELECT * FROM T2 NOLOGGING;
3INSERT /*+ NOLOGGING */ INTO T1 VALUES ('0');
4INSERT /*+ NOLOGGING */ INTO T1 SELECT * FROM T2;
5DELETE /*+ NOLOGGING */ FROM T1;
6UPDATE /*+ NOLOGGING */ T1 SET A='1';
     


實際上,上述全部的SQL沒有一個可以實現不產生日誌的數據更改操做。事實上,NOLOGGING並非Oracle的一個有效的Hint,而是一個SQL關鍵字,一般用於DDL語句中。這裏NOLOGGING至關於給SELECT的表指定了一個別名爲NOLOGGING。下面是NOLOGGING的一些正確用法:

1CREATE TABLE T1 NOLOGGING AS SELECT * FROM T2;
2CREATE INDEX T1_IDX ON T1(A) NOLOGGING;
3ALTER INDEX T1_IDX REDUILD ONLINE NOLOGGING;
4ALTER TABLE T1 NOLOGGING;
     


若面試官問如何強制一個SQL語句使用索引,此時就能夠回答使用Hint/*+INDEX(TABLE INDEX_NAME)*/來完成。

& 說明:

有關Hint的更多內容能夠參考個人BLOGhttp://blog.itpub.net/26736162/viewspace-2125011/http://blog.itpub.net/26736162/viewspace-2125709/


本文選自《Oracle程序員面試筆試寶典》,做者:李華榮。



watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=      

---------------優質麥課------------

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 詳細內容能夠添加麥老師微信或QQ私聊。


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


About Me:小麥苗      

 本文做者:小麥苗,只專一於數據庫的技術,更注重技術的運用

● 做者博客地址:http://blog.itpub.net/26736162/abstract/1/

 本系列題目來源於做者的學習筆記,部分整理自網絡,如有侵權或不當之處還請諒解

 版權全部,歡迎分享本文,轉載請保留出處

 QQ:646634621  QQ羣:618766405

 提供OCP、OCM和高可用部分最實用的技能培訓

● 題目解答如有不當之處,還望各位朋友批評指正,共同進步

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=DBA寶典

長按下圖識別二維碼或微信掃描下圖二維碼來關注小麥苗的微信公衆號:xiaomaimiaolhr,學習最實用的數據庫技術。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk= 喜歡就點擊「好看」吧



本文分享自微信公衆號 - DB寶(lhrdba)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索