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語句OracleSQL
- Oracle中的sql hintOracleSQL
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- SQL查詢語句 (Oracle)SQLOracle
- Oracle SQL精妙SQL語句講解OracleSQL
- MySQL_通過binlog檢視原始SQL語句MySql
- [20191101]通過zsh計算sql語句的sql_id.txtSQL
- [20191011]通過bash計算sql語句的sql_id.txtSQL
- 列出oracle dbtime得sql語句OracleSQL
- 後臺執行SQL語句(oracle)SQLOracle
- 【SQL】Oracle SQL join on語句and和where使用區別SQLOracle
- java連線oracle執行sql語句JavaOracleSQL
- mysql執行sql語句過程MySql
- Oracle執行語句跟蹤 使用sql trace實現語句追蹤OracleSQL
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- SQL語句SQL
- 如何通過注入SQL語句盜取網站管理許可權AHSQL網站
- 18 與Oracle Data Guard 相關的SQL語句OracleSQL
- 一條sql語句的執行過程SQL
- 【SQL】9 SQL INSERT INTO 語句SQL
- 【SQL】10 SQL UPDATE 語句SQL
- 【SQL】11 SQL DELETE 語句SQLdelete
- SQL SELECT 語句SQL
- sql常用語句SQL
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(五)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(四)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(三)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(二)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(一)Oracle
- 【SQL】Oracle sql語句 minus函式執行效率與join對比SQLOracle函式
- Oracle OCP(01):使用SQL SELECT語句檢索資料OracleSQL
- oracle v$sqlare 分析SQL語句使用資源情況OracleSQL
- ORACLE中sql語句----運算子的優先順序OracleSQL
- oracle常用後臺程序及sql語句執行流程OracleSQL
- 【SQL】Oracle BLOB 批量匯入匯出圖片語句SQLOracle
- ORACLE常用語句:Oracle
- 6. Oracle開發和應用—6.3. 基本SQL語句—6.3.4. select語句OracleSQL
- GaussDB SQL查詢語句執行過程解析SQL
- EF中使用SQL語句或儲存過程SQL儲存過程