Oracle深度学习笔记SQL基线Word格式.docx
- 文档编号:22666125
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:24
- 大小:21.21KB
Oracle深度学习笔记SQL基线Word格式.docx
《Oracle深度学习笔记SQL基线Word格式.docx》由会员分享,可在线阅读,更多相关《Oracle深度学习笔记SQL基线Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
计划基线由一个或多个已经被接受到的SQL查询执行计划组成。
运行一个查询,且该查询已经存在计划基线,优化器就会优先考虑计划基线中的执行计划。
3.测试
用SQL_ID创建基线
tpcc@TOADDB>
createtabletasselect*fromall_objects;
Tablecreated.
createindext_idxont(object_name);
Indexcreated.
收集统计信息:
execdbms_stats.gather_table_stats(user,'
t'
cascade=>
true);
PL/SQLproceduresuccessfullycompleted.
select/*test_01*/object_id,object_typefromtwhereobject_name='
DUAL'
;
OBJECT_IDOBJECT_TYPE
---------------------------------
142TABLE
143SYNONYM
查找所执行SQL的ID
selectsql_id,sql_textfromv$sqlwheresql_textlike'
select/*test_01*/%'
SQL_ID
-------------
SQL_TEXT
----------------------------------------------------------------------------------------------------
farns9fxz7dum
select/*test_01*/object_id,object_typefromtwhereobject_name='
SQL计划基线的管理,需要拥有administersqlmanagementobject权限。
查看已有基线:
SQL>
selectsql_handle,plan_namefromdba_sql_plan_baselineswheresql_textlike'
norowsselected
使用dbms_spm.load_plans_from_cursor_cache加载sql_id对应的SQL的执行计划。
declare
xpls_integer;
begin
x:
=dbms_spm.load_plans_from_cursor_cache(sql_id=>
'
farns9fxz7dum'
);
end;
/
再查看创建的基线如下:
selectsql_handle,plan_namefromdba_sql_plan_baselineswheresql_textlike'
SQL_HANDLE
PLAN_NAME
SQL_718c094fd7a20a4d
SQL_PLAN_733099zbu42kda0b930be
如此就为需要创建计划基线的SQL创建了计划基线
用sql文本来创建计划基线
如下
selectobject_idfromtwhereobject_name='
OBJECT_ID
----------
142
143
begin
=dbms_spm.load_plans_from_cursor_cache(
attribute_name=>
SQL_TEXT'
attribute_value=>
selectobject_idfromt%'
dbms_output.put_line(x);
end;
查看如下:
SQL_b7598beb2a522d9d
SQL_PLAN_bfqcbxcp54bcxa0b930be
显示一条SQL的执行计划
我们可以使用dbms_xplan.display_sql_plan_baseline来完成,如下:
selectsql_handle
fromdba_sql_plan_baselines
whereplan_name='
SQL_PLAN_bfqcbxcp54bcxa0b930be'
/
select*fromtable(dbms_xplan.display_sql_plan_baseline(sql_handle=>
SQL_b7598beb2a522d9d'
));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQLhandle:
SQL_b7598beb2a522d9d
SQLtext:
selectobject_idfromtwhereobject_name='
Planname:
SQL_PLAN_bfqcbxcp54bcxa0b930bePlanid:
2696491198
Enabled:
YESFixed:
NOAccepted:
YESOrigin:
MANUAL-LOAD
Planrows:
Fromdictionary
Planhashvalue:
767293772
---------------------------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
|0|SELECTSTATEMENT||||4(100)||
|1|TABLEACCESSBYINDEXROWIDBATCHED|T|2|60|4(0)|00:
00:
01|
|*2|INDEXRANGESCAN|T_IDX|2||3(0)|00:
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
2-access("
OBJECT_NAME"
='
)
26rowsselected.
也可以输入plan_name,或是两者都输入。
还有一个参数为format,来用决定所显示计划的详细信息,其值可以为baice,typical或all。
4.创建一个AWR基线
通过如下命令来实现。
dbms_workload_repository.create_baseline(
start_snap_id=>
xxxxx,
end_snap_id=>
yyyy,
baseline_name=>
temp_baseline_name'
快照点,我们可以使用dba_hist_snapshot视图查找
如下:
selectsnap_idfromdba_hist_snapshot;
SNAP_ID
78
79
92
93
82
95
76
77
86
83
84
85
88
89
94
73
80
81
87
90
91
74
75
23rowsselected.
然后执行如下,创建AWR基线:
dbms_workload_repository.create_baseline(
start_snap_id=>
91,
end_snap_id=>
92,
baseline_name=>
创建一个SQL调优集。
dbms_sqltune.create_sqlset(
sqlset_name=>
temp_sqlset'
description=>
sqltunesetfromawr'
从awr基线中找到占较高资源的查询来填充SQL调优集。
base_curdbms_sqltune.sqlset_cursor;
openbase_curfor
selectvalue(x)
fromtable(dbms_sqltune.select_workload_repository(
'
null,null,'
elapsed_time'
null,null,null,15))x;
dbms_sqltune.load_sqlset(
populate_cursor=>
base_cur);
为SQL调优集中的每一个查询SQL创建计划基线。
xpls_integer;
x:
=dbms_spm.load_plans_from_sqlset(
sqlset_name=>
这样就完成了调优集中查询SQL的计划基线的创建。
5.SQL基线综合性使用
很多的时候,优化器只选择一种执行计划,我们尝试使用hint改变这个执行计划,且执行效率有很较大的提升。
但是通常是不能够改变产品系统里面的SQL代码的。
在这种情况下,会用到SQL计划基线,在不改变SQL的情况下让优化器选择我们加个hint后的执行计划。
使用SQL计划基线是一个不错的选择。
测试如下:
准备表
droptabletpurge;
Tabledropped.
variablenamevarchar2(30)
exec:
name:
='
执行SQL
selectcount(*)fromtwhereobject_name=:
name;
COUNT(*)
2
常看刚执行SQL的SQL_ID
Selectsql_id,child_numberfromv$sqlwheresql_textlike'
selectcount(*)fromtwhereobject_name=:
name'
SQL_IDCHILD_NUMBER
-------------------------
astw879f241950
显示执行计划:
select*fromtable(dbms_xplan.display_cursor(sql_id=>
'
astw879f24195'
SQL_IDastw879f24195,childnumber0
-------------------------------------
name
293504097
---------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
|0|SELECTSTATEMENT||||3(100)||
|1|SORTAGGREGATE||1|25|||
|*2|INDEXRANGESCAN|T_IDX|2|50|3(0)|00:
=:
NAME)
19rowsselected.
带HINT执行
select/*+full(t)*/count(*)fromtwhereobject_name=:
查看执行计划的SQL_ID如下:
selectsql_id,child_numberfromv$sqlwheresql_textlike'
select/*+full(t)*/count(*)fromtwhereobject_name=:
9rsq8360s27zu0
查看执行计划:
9rsq8360s27zu'
SQL_ID9rsq8360s27zu,childnumber0
2966233522
|0|SELECTSTATEMENT||||422(100)||
|*2|TABLEACCESSFULL|T|2|50|422
(1)|00:
2-filter("
然后改变第一个执行SQL(未带HINT)的执行计划,让其走使用hint后的SQL——“9rsq8360s27zu”的执行计划,也就是让它走全表扫描
创建两条SQL计划基线
Selectsql_id,hash_value,child_numberfromv
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 深度 学习 笔记 SQL 基线