不修改sql文本情況下,改變其執行計劃

摘要:
在不修改SQL文本的情况下,可以使用sqlprofile和spm(sqlplanmanage)来更改执行计划。本文主要介绍SPM模式sqlprofile。请参阅sqlprofile固定执行计划步骤。1.手动生成SQLPlanBaselineDECLAREV_ TEMPNUMBER;BEGINV_TEMP:=DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(原始目标的SQL_ID=˃s

不修改sql文本情況下,改變其執行計劃

可以使用sql profile和spm(sql plan manage),本文主要介紹SPM方式

sql profile參考sql profile固定執行計劃

步驟

1.手動生成SQL Plan Baseline

DECLARE
   V_TEMP   NUMBER;
BEGIN
   V_TEMP :=
      DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE (SQL_ID            => '原目标的sql_id',
                                             PLAN_HASH_VALUE   => 原目标sql的执行计划HASH值);
END;

2.改寫原SQL,加入hint,生成正確的執行計劃

-- SQL_ID和PLAN HASH VALUE可以在v$sql查找
-- SQL_HANDLE可以在DBA_DBA_SQL_PLAN_BASELINES中查找
DECLARE
   V_TEMP   NUMBER;
BEGIN
   V_TEMP :=
      DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE (
         SQL_ID            => '改写SQL的SQL_ID',
         PLAN_HASH_VALUE   => 改写SQL执行计划HASH值,
         SQL_HANDLE        => '第一步生成的HANDLE');
END;

3.刪除第一步生成的SQL Plan Baseline

DECLARE
   V_TEMP   NUMBER;
BEGIN
   V_TEMP :=
      DBMS_SPM.DROP_SQL_PLAN_BASELINE (
         SQL_HANDLE   => '原目标HANDLE',
         PLAN_NAME    => '原目标PLAN_NAME');
END;

實驗

1.創建測試環境

CREATE TABLE TEST_SPM AS SELECT * FROM DBA_OBJECTS;

CREATE INDEX IX_TEST_SPM_OBJECT_ID ON TEST_SPM(OBJECT_ID);

2.構造原SQL並查看執行計劃

SELECT /*+NO_INDEX(TEST_SPM IX_TEST_SPM_OBJECT_ID)*/* FROM TEST_SPM WHERE OBJECT_ID=10;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());

不修改sql文本情況下,改變其執行計劃第1张

3.生成原SQL的SQL Plan Baseline

-- 生成
DECLARE
   V_TEMP   NUMBER;
BEGIN
   V_TEMP :=
      DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE (SQL_ID            => 'cjdf02m61dsd9',
                                             PLAN_HASH_VALUE   => 1145642998);
END;
-- 查看,因為數據庫的cursor_sharing為force,所以值被替代為變量
SELECT SQL_HANDLE,PLAN_NAME,SUBSTR(SQL_TEXT,0,100) SQL_TEXT FROM DBA_SQL_PLAN_BASELINES 

不修改sql文本情況下,改變其執行計劃第2张

4.修改sql並查看執行計劃

SELECT /*+INDEX(TEST_SPM IX_TEST_SPM_OBJECT_ID)*/* FROM TEST_SPM WHERE OBJECT_ID=10;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());

不修改sql文本情況下,改變其執行計劃第3张

5.用修改後的SQL的SQL_ID,PLAN HASH VALUE和原SQL的SQL HANDLE生成新的SQL PLAN BASELINE

-- 生成
DECLARE
   V_TEMP   NUMBER;
BEGIN
   V_TEMP :=
      DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE (
         SQL_ID            => 'cju4dakqwvft7',
         PLAN_HASH_VALUE   => 3777949824,
         SQL_HANDLE        => 'SQL_9fa71106593b209e');
END;
-- 查看
SELECT SQL_HANDLE,PLAN_NAME,TO_CHAR(SUBSTR(SQL_TEXT,0,100)) SQL_TEXT FROM DBA_SQL_PLAN_BASELINES;

不修改sql文本情況下,改變其執行計劃第4张

6.刪除原SQL的SQL PLAN BASELINE

DECLARE
   V_TEMP   NUMBER;
BEGIN
   V_TEMP :=
      DBMS_SPM.DROP_SQL_PLAN_BASELINE (
         SQL_HANDLE   => 'SQL_9fa71106593b209e',
         PLAN_NAME    => 'SQL_PLAN_9z9sj0tcmq84yeb1890ae');
END;

7.查看原SQL的執行計劃

SELECT /*+NO_INDEX(TEST_SPM IX_TEST_SPM_OBJECT_ID)*/* FROM TEST_SPM WHERE OBJECT_ID=10;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());

不修改sql文本情況下,改變其執行計劃第5张

免责声明:文章转载自《不修改sql文本情況下,改變其執行計劃》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇利用基于Go Lang的Hugo配合nginx来打造属于自己的纯静态博客系统关于Linux的时间与时区下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

带你由浅入深探索webpack4(一)

 相信你或多或少也听说过webpack、gulp等这些前端构建工具。近年来webpack越来越火,可以说成为了前端开发者必备的工具。如果你有接触过vue或者react项目,我想你应该对它有所了解。 这几天我重新整理了一下webpack中知识点,把一些常用到的总结出来,希望能帮助到大家以及加深自己对webpack的理解。 (由于我在写这篇文章的时候webpa...

Oracle面试题(基础篇)

1. Oracle跟SQL Server 2005的区别? 宏观上: 1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windows平台的稳定性和安全性影响了sql server的稳定性和安全性 2). oracle使用的脚本语言为PL-SQL,而sql server使用的脚本为T-...

java中的静态导入

     java中的静态导入他是jdk5.0的新特性,所谓静态导入就是不使用类名.属性名,类名.方法名的形式去调用属性或方法,而是通过静态导入,直接使用方法名和属性。 静态导入的语法: import static 包名.类名.静态成员变量; import static 包名.类名.静态成员函数; 下面来看一个例子: 1.自定义一个类,给一个成员变量,给一...

bert训练代码

from torch.optim import Adam from torch.utils.data import DataLoader from dataset.wiki_dataset import BERTDataset from models.bert_model import * import tqdm import pandas as pd...

MySQL8.0官方文档学习

InnoDB架构 下面的架构里只挑选了部分内容进行学习 内存架构(In-Memory Structures) Buffer Pool Buffer Pool是内存中的一块区域,InnoDB访问表和索引的时候缓存这些数据。buffer pool使得经常使用的数据直接从内存读取,加快了数据处理。在专用的服务器上,会给buffer pool分配80%的物理内存...

C语言两个libxml2库使用的问题

最近使用libxml2想做点东西,翻看一些example后还是有些疑问,去segmentfault问了下,感谢@pingjiang的热心解答,问题解决,记录如下 (一)如下是一个XML文件,p为根结点 <p> <one>1</one> <two>2</two> <th...