ORACLE 通過SPM為SQL語句加HINT
一個SQL,通過SPM固定它的執行計劃,可以通過DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE實現。也可以通地此功能在不修改原SQL的情況下對其加HINT來固定執行計劃。
DB VERSION:ORACLE 11.2.0.4
OS:CENTOS 6.6
例如:
原SQL走索引:
SELECT * FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;
想通過加HINT讓其走全表掃描:
SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;
在V$SQL中查詢出,原SQL的SQL_ID=064qcdmgt6thw,加HINT的SQL的SQL_ID=ahdtbgvsd3bht,PLAN_HASH_VALUE=970476072。
執行以下:
DECLARE
CNT NUMBER;
V_SQL CLOB;
BEGIN
--得到原語句SQL文字
SELECT SQL_FULLTEXT INTO V_SQL FROM V$SQL WHERE SQL_ID = '064qcdmgt6thw' AND ROWNUM=1;
--用加HINT的SQL的SQL_ID和PLAN_HASH_VALUE,來固定原語句的SQL
CNT := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(SQL_ID => 'ahdtbgvsd3bht',
PLAN_HASH_VALUE => 970476072,
SQL_TEXT => V_SQL);
END;
這樣就將加HINT的執行計劃固定在原語句上。執行原語句,在V$SQL的PLAN_HASH_VALUE列和SQL_PLAN_BASELINE列來確認是否固定。
測試中發現,一些含有繫結變數的SQL,用常量的SQL的SQL_ID和PLAN_HASH_VALUE無法固定,此時可以嘗試使用EXECUTE IMMEDIATE來生成含有繫結變數的SQL。
例如:
DECLARE
V_SQL VARCHAR2(3000);
BEGIN
V_SQL := 'SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=:1';
EXECUTE IMMEDIATE V_SQL
USING 10;
END;
或
var v number;
exec :v :=10
SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=:V;
ORACLE 通過SQL PROFILE為SQL語句加HINT可參考:http://blog.itpub.net/28539951/viewspace-1603192/
DB VERSION:ORACLE 11.2.0.4
OS:CENTOS 6.6
例如:
原SQL走索引:
SELECT * FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;
想通過加HINT讓其走全表掃描:
SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;
在V$SQL中查詢出,原SQL的SQL_ID=064qcdmgt6thw,加HINT的SQL的SQL_ID=ahdtbgvsd3bht,PLAN_HASH_VALUE=970476072。
執行以下:
DECLARE
CNT NUMBER;
V_SQL CLOB;
BEGIN
--得到原語句SQL文字
SELECT SQL_FULLTEXT INTO V_SQL FROM V$SQL WHERE SQL_ID = '064qcdmgt6thw' AND ROWNUM=1;
--用加HINT的SQL的SQL_ID和PLAN_HASH_VALUE,來固定原語句的SQL
CNT := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(SQL_ID => 'ahdtbgvsd3bht',
PLAN_HASH_VALUE => 970476072,
SQL_TEXT => V_SQL);
END;
這樣就將加HINT的執行計劃固定在原語句上。執行原語句,在V$SQL的PLAN_HASH_VALUE列和SQL_PLAN_BASELINE列來確認是否固定。
測試中發現,一些含有繫結變數的SQL,用常量的SQL的SQL_ID和PLAN_HASH_VALUE無法固定,此時可以嘗試使用EXECUTE IMMEDIATE來生成含有繫結變數的SQL。
例如:
DECLARE
V_SQL VARCHAR2(3000);
BEGIN
V_SQL := 'SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=:1';
EXECUTE IMMEDIATE V_SQL
USING 10;
END;
或
var v number;
exec :v :=10
SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=:V;
ORACLE 通過SQL PROFILE為SQL語句加HINT可參考:http://blog.itpub.net/28539951/viewspace-1603192/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-2128755/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 通過sql profile為sql語句加hintOracleSQL
- 通過使用hint unnest調優sql語句SQL
- ORACLE常用SQL最佳化hint語句OracleSQL
- 透過使用hint unnest調優sql語句SQL
- 通過sql語句分析足彩SQL
- 使用hint來調優sql語句SQL
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- 通過SQL PROFILE自動優化SQL語句SQL優化
- 通過java來格式化sql語句JavaSQL
- 通過hint push_subq優化sql優化SQL
- ORACLE 11G 使用SPM來調整SQL語句的執行計劃OracleSQL
- Oracle SQL 語句的執行過程OracleSQL
- oracle sql語句OracleSQL
- 通過ORA錯誤反思sql語句規範SQL
- 通過sql語句分析足彩(第三篇)SQL
- 理解oracle執行sql語句的過程OracleSQL
- 使用USE_HASH Hint調優一個SQL語句SQL
- SQL語句優化方法用hint的30種方法SQL優化
- 通過SQL語句提取儲存過程中的內容SQL儲存過程
- Oracle基本SQL語句OracleSQL
- oracle常用SQL語句OracleSQL
- oracle的sql語句OracleSQL
- MySQL_通過binlog檢視原始SQL語句MySql
- 通過java程式抽取日誌中的sql語句JavaSQL
- 用 Phoenix 通過 SQL 語句更新操作 HBase 資料SQL
- ORACLE sql 語句的執行過程(SQL效能調整)OracleSQL
- 通過分析SQL語句的執行計劃優化SQL 二SQL優化
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- Oracle-監控sql語句的過載率OracleSQL
- MySQL在ROW模式下通過binlog提取SQL語句MySql模式
- 通過圖表簡化sql語句的表關聯SQL
- SQL查詢語句 (Oracle)SQLOracle
- Oracle SQL語句分類OracleSQL
- Oracle SQL精妙SQL語句講解OracleSQL
- 通過分析SQL語句的執行計劃優化SQL(總結)SQL優化
- Oracle sql with 語句語法與例子OracleSQL
- Oracle一個SQL語句的處理過程(轉)OracleSQL
- 通過Linux命令過濾出binlog中完整的SQL語句LinuxSQL