Bo's Oracle Station

查看: 1870|回复: 0

课程第43次

[复制链接]

27

主题

27

帖子

183

积分

超级版主

Rank: 8Rank: 8

积分
183
发表于 2019-8-24 09:34:43 | 显示全部楼层 |阅读模式
Notice: This blog is written by Bo Tang.

SQL Tuning Advisor不能选择limited, 但是SQL Access Advisor可以


QQ图片20190824093206.png

SQL Access Advisor一定要选择“删除无效对象”:


QQ图片20190824093416.png



  1. DECLARE

  2. taskname varchar2(30) := 'SQLACCESS4393242';
  3. task_desc varchar2(256) := 'SQL Access Advisor';
  4. task_or_template varchar2(30) := 'SQLACCESS_EMTASK';
  5. task_id number := 0;
  6. num_found number;
  7. sts_name varchar2(256) := 'SQLTUNINGSET1';
  8. sts_owner varchar2(30) := 'SYS';

  9. BEGIN
  10. /* Create Task */
  11. dbms_advisor.create_task(DBMS_ADVISOR.SQLACCESS_ADVISOR,task_id,taskname,task_desc,task_or_template);
  12. /* Reset Task */
  13. dbms_advisor.reset_task(taskname);
  14. /* Delete Previous STS Workload Task Link */
  15. select count(*) into num_found from user_advisor_sqla_wk_map where task_name = taskname and workload_name = sts_name;
  16. IF num_found > 0 THEN
  17. dbms_advisor.delete_sts_ref(taskname, sts_owner, sts_name);
  18. END IF;
  19. /* Link STS Workload to Task */
  20. dbms_advisor.add_sts_ref(taskname,sts_owner, sts_name);
  21. /* Set STS Workload Parameters */
  22. dbms_advisor.set_task_parameter(taskname,'VALID_ACTION_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  23. dbms_advisor.set_task_parameter(taskname,'VALID_MODULE_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  24. dbms_advisor.set_task_parameter(taskname,'SQL_LIMIT',DBMS_ADVISOR.ADVISOR_UNLIMITED);
  25. dbms_advisor.set_task_parameter(taskname,'VALID_USERNAME_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  26. dbms_advisor.set_task_parameter(taskname,'VALID_TABLE_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  27. dbms_advisor.set_task_parameter(taskname,'INVALID_TABLE_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  28. dbms_advisor.set_task_parameter(taskname,'INVALID_ACTION_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  29. dbms_advisor.set_task_parameter(taskname,'INVALID_USERNAME_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  30. dbms_advisor.set_task_parameter(taskname,'INVALID_MODULE_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  31. dbms_advisor.set_task_parameter(taskname,'VALID_SQLSTRING_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
  32. dbms_advisor.set_task_parameter(taskname,'INVALID_SQLSTRING_LIST','"@!"');
  33. /* Set Task Parameters */
  34. dbms_advisor.set_task_parameter(taskname,'ANALYSIS_SCOPE','ALL');
  35. dbms_advisor.set_task_parameter(taskname,'RANKING_MEASURE','PRIORITY,OPTIMIZER_COST');
  36. dbms_advisor.set_task_parameter(taskname,'DEF_PARTITION_TABLESPACE',DBMS_ADVISOR.ADVISOR_UNUSED);
  37. dbms_advisor.set_task_parameter(taskname,'TIME_LIMIT',10000);
  38. dbms_advisor.set_task_parameter(taskname,'MODE','LIMITED');
  39. dbms_advisor.set_task_parameter(taskname,'STORAGE_CHANGE',DBMS_ADVISOR.ADVISOR_UNLIMITED);
  40. dbms_advisor.set_task_parameter(taskname,'DML_VOLATILITY','TRUE');
  41. dbms_advisor.set_task_parameter(taskname,'WORKLOAD_SCOPE','FULL');
  42. dbms_advisor.set_task_parameter(taskname,'DEF_INDEX_TABLESPACE',DBMS_ADVISOR.ADVISOR_UNUSED);
  43. dbms_advisor.set_task_parameter(taskname,'DEF_INDEX_OWNER',DBMS_ADVISOR.ADVISOR_UNUSED);
  44. dbms_advisor.set_task_parameter(taskname,'DEF_MVIEW_TABLESPACE',DBMS_ADVISOR.ADVISOR_UNUSED);
  45. dbms_advisor.set_task_parameter(taskname,'DEF_MVIEW_OWNER',DBMS_ADVISOR.ADVISOR_UNUSED);
  46. dbms_advisor.set_task_parameter(taskname,'DEF_MVLOG_TABLESPACE',DBMS_ADVISOR.ADVISOR_UNUSED);
  47. dbms_advisor.set_task_parameter(taskname,'CREATION_COST','TRUE');
  48. dbms_advisor.set_task_parameter(taskname,'JOURNALING','4');
  49. dbms_advisor.set_task_parameter(taskname,'DAYS_TO_EXPIRE','30');
  50. /* Execute Task */
  51. dbms_advisor.execute_task(taskname);
  52. END;
复制代码
QQ图片20190824094144.png



红条和蓝条有高度差,就说明有调优的结果。如果一样高,请务必收集一下可能会涉及到的对象的优化器统计信息(利用同一个SQL调优集,做STA),再来SAA。

  1. begin
  2.    dbms_advisor.quick_tune(advisor_name => dbms_advisor.SQLACCESS_ADVISOR,
  3.    task_name => 'MYTASK11',
  4.    attr1 => 'select   max(line)   from hr.tbig where length(TEXT) >=100  group by  text  having max(line) >=60',
  5.    template => dbms_advisor.SQLACCESS_OLTP);
  6. end;
  7.    

  8. begin
  9.    dbms_advisor.quick_tune(advisor_name => dbms_advisor.SQLACCESS_ADVISOR,
  10.    task_name => 'MYTASK12',
  11.    attr1 => 'select   max(line)   from hr.tbig where length(TEXT) >=100  group by  text  having max(line) >=60',
  12.    template => dbms_advisor.SQLACCESS_WAREHOUSE);
  13. end;
复制代码
  1. CREATE MATERIALIZED VIEW LOG ON
  2. "HR"."TBIG"
  3. WITH ROWID, SEQUENCE("LINE","TEXT")
  4. INCLUDING NEW VALUES;

  5. CREATE MATERIALIZED VIEW "SYS"."MV$_01DD0000"
  6. REFRESH FAST WITH ROWID
  7. ENABLE QUERY REWRITE
  8. AS SELECT HR.TBIG.TEXT C1, MAX("HR"."TBIG"."LINE") M1, COUNT(*) M2 FROM HR.TBIG
  9. GROUP BY HR.TBIG.TEXT;

  10. begin
  11. dbms_stats.gather_table_stats('"SYS"','"MV$_01DD0000"',NULL,dbms_stats.auto_sample_size);
  12. end;
  13. /

  14. CREATE INDEX "SYS"."MV$_01DD0000_IDX$_01DD0000"
  15. ON "SYS"."MV$_01DD0000"
  16. ("M1")
  17. COMPUTE STATISTICS;
复制代码
  1. <p>CREATE MATERIALIZED VIEW LOG ON
  2. "HR"."TBIG"
  3. WITH ROWID, SEQUENCE("LINE","TEXT")
  4. INCLUDING NEW VALUES;

  5. CREATE MATERIALIZED VIEW "SYS"."MV$_01DD0000"
  6. REFRESH FORCE WITH ROWID
  7. ENABLE QUERY REWRITE
  8. AS SELECT HR.TBIG.TEXT C1, MAX("HR"."TBIG"."LINE") M1, COUNT(*) M2 FROM HR.TBIG
  9. where length(TEXT) >=100
  10. GROUP BY HR.TBIG.TEXT
  11. having max(line) >=60</p><p>;

  12. begin
  13. dbms_stats.gather_table_stats('"SYS"','"MV$_01DD0000"',NULL,dbms_stats.auto_sample_size);
  14. end;
  15. /

  16. CREATE INDEX "SYS"."MV$_01DD0000_IDX$_01DD0000"
  17. ON "SYS"."MV$_01DD0000"
  18. ("M1")
  19. COMPUTE STATISTICS;



  20. drop  MATERIALIZED VIEW "SYS"."MV$_01DD0000";
  21. </p>
复制代码
QQ图片20190824105116-1.png
快速调优有隐式的SQL调优集。

SPA的结果:


QQ图片20190824110143-2.png





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Bo's Oracle Station   

GMT+8, 2024-5-10 01:26 , Processed in 0.147113 second(s), 27 queries .

快速回复 返回顶部 返回列表