SQL Monitor and SQL Quarantine
SQL Monitor belongs Oracle Tuning Pack
STATISTICS_LEVEL=TYPICAL(default) or all, will start QAL monitor features.
Events to Trigger SQL monitor
单次执行消耗大于等于5秒cpu/IO时间的SQL PL/SQL
并行执行的语句
加/* + MONITOR*/ hint的SQL语句
用sql_monitor事件指定SQL ID对应的SQL
alter system set events 'sql_monitor [sql:5hc07qvt8v737 | sql:9ht3ba3arrzt3] force=true
利用存储过程
DBMS_SQL_MONITOR.BEGNIS_OPERATION and DBMS_SQL_MONITOR.END_OPERATION 定义的会话中的所有SQL PL/SQL
CONTROL_MANAGEMENT_PACK_ACCESS is the default Oracle parameter.
Set the default parameter: Diagnostic + Tuning.
CONTROL_MANAGEMENT_PACK_ACCESS
SQL监控方法
cloud control
sql developer
DBMS_SQL_MONITOR package
SQL Monitor interface
monitor_hint, no_monitor_hint
dba_hist_reports
dba_hist_reports_details
V$SQL_MONITOR
V$SQL_PLAN_MONITOR
V$SQL_MONITOR_SESSTAT
v$active_session_history, v$session, v$session_longops, v$sql, v$sqlplan
SQL监控权限
普通用户可以监控自己运行的SQL,不需要其它额外的权限
SELECT_CATALOG_ROLE权限的用户还可以监控其它用户的SQL
如何预防由于执行计划改变引起的SQL性能衰减?
SQL执行计划管理(SQL PLAN Management)是一种预防性机制,使优化器可以自动管理执行计划,从而确保数据库仅使用已知或验证过的计划
SQL Plan Baseline and SQL Profile ???
Automatic SPM Evolve Advisor
SPM Evolve Advisor is a SQL consultant, used to auto exam the SQL performace
第一阶段, 基准捕获(Capture Baseline)
自动捕获
设置 OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES = TRUE
手工捕获
手工捕获
DBMS_SPM.LOAD_PLANS_FROM_%
第二阶段, 选择
再次解析相同的语句,但是创建了不同的计划。
新计划被添加到Plan History记录中,知道经过验证,才会被使用
two parameter should be kept as default
optimizer_use_sql_plan_baselines=true
optimizer_capture_sql_plan_baselines=false
第三阶段,演进
New SYS_AUTO_SPM_EVOLVE_TASK job as part of the Automatic SQL Tuning Task
Report: DBMS_SPM.REPORT_AUTO_EVOLVE_TASK
Manual: DBMS_SPM.CREATE_EVOLVE_TASK
同等或者更加优化的执行计划会被添加到SQL Plan Baseline
SPM设置
查看配置
select parameter_name, parameter_value from DBA_SQL_MANAGEMENT_CONFIG;
变更保留期
exec DBMS_SPM.CONFIGURE('plan_retention_weeks',5)
改变空间消耗
exec DBMS_SPM.CONFIGURE('space_budget_percenet',5)
加载计划的来源
exec DBMS_SPM.LOAD_PLANS_FROM_AWR(begin_snap+.29, end_snap+>69)
SQL隔离
通过隔离SQL执行计划,更科学的防止失控SQL对系统资源 不必要的消耗。
从Oracle Database 19c开始,SQL隔离会自 动隔离由资源管理器终止的SQL语句的执行计 划,以便不允许它们再次运行。
手动隔离 - 为SQL语句的执行计划创建隔离配置
使用以下任一包函数为SQL语句的执行计划创建隔离配置:
DBMS_SQLQ.CREATE_QUARANTINE_BY_SQL_ID
DBMS_SQLQ .CREATE_QUARANTINE_BY_SQL_TEXT
DECLARE
quarantine_config VARCHAR2(30);
BEGIN
quarantine_config := DBMS_SQLQ.CREATE_QUARANTINE_BY_SQL_ID( SQL_ID => ’8vu7s907prbgr’, PLAN_HASH_VALUE => '3488063716');
END;
/
DECLARE quarantine_config VARCHAR2(30);
BEGIN
quarantine_config := DBMS_SQLQ.CREATE_QUARANTINE_BY_SQL_ID( SQL_ID => '152sukb473gsk');
END;
/
DECLARE quarantine_config VARCHAR2(30);
BEGIN
quarantine_config := DBMS_SQLQ.CREATE_QUARANTINE_BY_SQL_TEXT( SQL_TEXT => to_clob('select count(*) from emp'));
END;
/
手动隔离 -在隔离配置中指定隔离阈值
可指定如下隔离阈值:
- CPU time
- Elapsed time
- I/O in megabytes
- Number of physical I/O requests
- Number of logical I/O requests
例:
BEGIN
DBMS_SQLQ.ALTER_QUARANTINE( QUARANTINE_NAME => 'SQL_QUARANTINE_3z0mwuq3aqsm8cfe7a0e4', PARAMETER_NAME => 'CPU_TIME', PARAMETER_VALUE => '5');
DBMS_SQLQ.ALTER_QUARANTINE( QUARANTINE_NAME => 'SQL_QUARANTINE_3z0mwuq3aqsm8cfe7a0e4', PARAMETER_NAME => 'ELAPSED_TIME', PARAMETER_VALUE => '10');
END;
/
注: 如果任何Resource Manager阈值等于或小于SQL语句的隔离配置中指定的隔离阈值,则该SQL语句(如果使 用其隔离配置中指定的执行计划)则不允许运行
Overview of SQL Plan Management:
https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/overview-of-sql-planmanagement.html#GUID-F1C45056-F998-43E5-B362-83F88DA49E58
Monitoring Database Operations:
https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/monitoring-databaseoperations.html#GUID-C941CE9D-97E1-42F8-91ED-4949B2B710BF
Quarantine for Execution Plans for SQL Statements Consuming Excessive System Resources: https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/diagnosing-and-resolving-problems.html#GUID-1CF7E2B7-1BF8-4907-889E-1107CAA83E51
手把手教你19c新特性:SQL隔离 :
https://mp.weixin.qq.com/s?__biz=MzI3OTM3MDkyNg==&mid=2247489388&idx=1&sn=89e7f43ee306a72392e1ce053fa984c2&chksm=eb499aaddc3e13bb3453a17ac3eae1b6769f7 5f61ce4979a4039751ec7b4a1f9288c45fe560d&mpshare=1&scene=1&srcid=&sharer_sharetime=1581493432215&sharer_shareid=166f7736f01ec1a6c9b45e9d9bde8d51&key=e4586ba 676168b970ea50196cf8d4ca7746f0fff69ed5ddf1387325e34afe121416ee942752638387df5817c47e7ad8888b2c5fc65614bb5b75427e42eb6ba7992691e30fb6cd21e846a7746974f10fe &ascene=0&uin=MTA3MjQyMDI0MQ%3D%3D&devicetype=iMac+MacBookPro14%2C1+OSX+OSX+10.14.6+build(18G3020)&version=12031d10&nettype=WIFI&lang=zh_CN&fontScal e=100&exportkey=AUTitqq8BDZyi2M0ZL%2F86aY%3D&pass_ticket=A9Fq3frJwLHL1WWsZ9dtJx0jIYFrVlPMjAdWaTtDi4r%2F%2FLP5agh7r1gzleIFgalD##
-------------------------------------------------
------------SPM Demo Script---------------
-------------------------------------------------
select * from dba_sql_plan_baselines;
origin, accept
loading plan from AWR
select *
from (select snap_id, snap_level, to_char(begin_interval_time, 'dd/mm/yy hh24:mi:ss') begin
from dba_hist_snapshot
order by snap_id desc)
where rownum <=3;
--Loading plan from AWR
variable v_plan_cnt number
exec :v_plan_cnt := dbms_spm.load_plans_from_awr(begin_snap => 132, end_snap => 133);
select sql_handle, sql_text, plan_name, origin, enabled, accepted
from dba-sql_plan_baselines
where origin= 'MANUAL-LOAD-FROM-AWR';
--Loading plans from the Shared SQL Area
alter system flush shared_pool;
alter system flush buffer_cache;
select /*load_cc*/ *
from sh.sales
where quantity_sold > 40
order by prod_id;
select sql_id, child_number as "Child Num", plan_hash_value as "Plan Hash", optimizer_env_hash_value as "Opt Env Hash"
from v$SQL
where sql_text like 'SELECT /*load_cc*/%';
variable v_plan_cnt number
begin
:v_plan_cnt := dbms_spm.load_plans_from_cursor_cache(sql_id => '99asdf9ak3asdf3');
end;
/
select sql_handle, sql_text, plan_name, origin, enabled, accepted
from dba_sql_plan_baselines
where origin= 'MANUAL-LOAD-FROM-CURSOR-CACHE';
--Loading plans from the SQL Tuning Set
alter system flush shared_pool;
alter system flush buffer_cache;
select /*q1_group_by */ prod_name, sum(quantity_sold)
from sh.products_test p, sh.sales_test s
where p.prod_id = s.prod_id and p.prod_category_id = 203
group by prod_name;
exec dbms_sqltune.create_sqlset(sqlset_name => 'MY_SYS')
declare
l_cursor dbms_sqltune,sqlset_cursor;
begin
open l_cursor for
select value(a) from table (
dbms_sqltune.select_cursor_cache (
basic_filter => 'sql_text like ' "SELECT /* q1_group_by */% " ' ',
attribute_list => 'ALL' )
) a;
dbms_sqltune.load_sqlset( sqlset_name => 'MY_SYS', populate_cursor => l_cursor);
end;
/
select * from dba_sqlset_statements where sqlset_name = 'MY_SYS';
variable v_plan_cnt number
execute :v_plan_cnt := dbms_spm.load_plans_from_sqlset ( -
sqlset_name => 'MY_SYS', -
basic_filter => 'sql_text like ' "SELECT /* q1_group_by */% " ' ',);
select sql_handle, sql_text, plan_name, origin, enabled, accepted
from dba_sql_plan_baselines
where origin= 'MANUAL-LOAD-FROM-STS'
order by sql_handle, accepted;
--Evolve Plan
set serveroutput on
declare
tk_name varchar2(50);
exe_name varchar2(50);
evol_out clob;
begin
tk_name := dbms_spm.create_evolve_task ( sql_handle => 'SQL_429qwer0wqweru',
plan_name => 'SQL_PLAN_45b3233fassfdqwq24');
exe_name := dbms_spm.execute_evolve_task (task_name => tk_name);
evol_cout := dbms_spm.report_evolve_task ( task_name => tk_name, execution_name=> exe_name);
dbms_output.put_line(evol_out);
end;
/
--clean up
exec dbms_sqltune.drop_sqlset("MY_SYS');
--SQL Quarantine-- only available on Exadata at this time (March 2020)
ORA-00040
ORA-56955
alter system set RESOURCE_MANAGER_PLAN = 'LIMIT_RESOURCE" scope = memory;
alter system flush shared_pool;
select sql_text, sql_id, ,sql_quarantine, avoided_executions
from v$sql where sql_quarantine is not null;
--clean up
begin
for quarantineObj in (select name from dba_sql_quarantine) loop
sys.dbms_sqlq.drop_quarantine(quarantineObj.name);
end loop;
end;
/
--End of File--
Comments
Post a Comment