SAA(Sql Access Advisor)工具的使用
- SAA可以做什么:
- 在给定的负载上推荐一些物化视图,物化视图日志和索引;
- 推荐的索引包括Bitmap索引,基于函数的索引和B-Tree索引;
- 推荐如何创建物化视图,以至于可以实现快速刷新和查询重写;
- SAA的使用模型:
- SQL的来源:
- SQL Cache:即当前v$sql视图中记录的sql语句;
- User-defined:自定义一个表,记录执行的sql语句和执行sql语句的用户,然后把这个表传给SAA;
- STS:使用Sql Tuning Set,主要是从负载中获得;
- 给出的建议:
- Simultaneously considers index solutions, materialized view solutions, or combinations of both;
- Considers storage for creation and maintenance costs;
- Does not generate drop recommendations for partial workloads;
- Optimizes materialized views for maximum query rewrite usage and fast refresh;
- Recommends materialized view logs for fast refresh;
- Combines similar indexes into a single index;
- Generates recommendations that support multiple workload queries;
- 架构图;
- 推荐的两种方式:Comprehensive和Limited;
- Add new index on table or materialized view;
- Drop an unused index;
- Modify an existing index by changing the index type;
- Modify an existing index by adding columns at the end;
- Add a new materialized view;
- Drop an unused materialized view;
- Add a new materialized view log;
- Modify an existing materialized view log to add new columns or clauses;
- Comprehensive可以分析1-8所有的推荐;
- Limited只能分析1,4,5,7,8推荐;
- SQL的来源:
- 使用SAA需要的权限:
- ADVISOR的系统权限;
- 目标表的SELECT权限,而且这个权限不能从一个角色中获得;
- 使用SAA工具:
- 执行负载;
- 使用EM中图形化界面;
- 使用脚本调用DMBS_ADVISOR包;
- 使用DMBS_ADVISOR包:
- 步骤:
- 创建一个任务,并定义参数;
- 定义负载;
- 生成一些建议;
- 查看并应用建议;
- SAA的工作流;
- 创建一个任务:DBMS_ADVISOR.CREATE_TASK(DBMS_ADVISOR.SQLACCESS_ADVISOR, :task_id, :task_name);
- 设置SAA的参数:
- 设置任务的参数:DBMS_ADVISOR.SET_TASK_PARAMETER(:task_name, parameter, value);
- 设置负载的参数:DBMS_ADVISOR.SET_SQLWKLD_PARAMETER(:workload_name, parameter, value);
- 创建模板:DBMS_ADVISOR.CREATE_TASK(DBMS_ADVISOR.SQLACCESS_ADVISOR, :task_id, :task_name, template=>:template_name, is_template=>’TRUE’);
- 创建一个负载:DBMS_ADVISOR.CREATE_SQLWKLD(:workload_name);
- SQL Tuning Sets:DBMS_ADVISOR.IMPORT_SQLWKLD_STS();
- 用户自定义负载:DBMS_ADVISOR.IMPORT_SQLWKLD_USER();
- SQL Cache:DBMS_ADVISOR.IMPORT_SQLWKLD_SQLCACHE();
- 单条的SQL语句:DBMS_ADVISOR.ADD_SQLWKLD_STATEMENT();
- 某个用户下的SQL语句:DBMS_ADVISOR.IMPORT_SQLWKLD_SCHEMA();
- 删除负载:DBMS_ADVISOR.DELETE_SQLWKLD(:workload_name);
- 任务与负载关联:DBMS_ADVISOR.ADD_SQLWKLD_REF(:task_name, :workload_name);
- 生成建议并把建议保存在SAA的资源库:DBMS_ADVISOR.EXECUTE_TASK(:task_name);
- 相应的视图为:dba/user_advisor_recommendations;
- 或者使用dbms_advisor.get_task_script生成相应的脚本;
- SAA的主要建议有:
- 创建/删除物化视图;
- 创建/删除物化视图日志;
- 创建/删除索引;
- 收集统计信息;
- 生成SQL脚本:
- 创建DIRECTORY;
- 授权给用户;
- 生成脚本;
- 步骤:
- 如果只是想调优一条SQL语句的话,可以执行快速调优,使用DBMS_ADVISOR.QUICK_TUNE()过程;
- 对于物化视图的优化:
- DBMS_MVIEW.EXPLAIN_MVIEW:查看使用/不使用物化视图的原因;
- DBMS_MVIEW.EXPLAIN_REWRITE:为没有么有使用查询重写,如果使用了,使用的哪个物化视图;
- DBMS_ADVISOR.TUNE_MVIEW:生成快速刷新物化视图和生成查询重写的建议;
ALTER USER sh IDENTIFIED BY oracle ACCOUNT UNLOCK;
GRANT DBA TO sh;
ALTER SYSTEM FLUSH shared_pool;
ALTER SYSTEM FLUSH buffer_cache;
CONNECT sh/oracle;
SET autotrace traceonly stat;
SELECT c.cust_last_name, SUM(s.amount_sold) AS dollars, SUM(s.quantity_sold) AS quantity
FROM sales s, customers c, products p
WHERE c.cust_id = s.cust_id AND
s.prod_id = p.prod_id AND
c.cust_state_province IN (‘Dublin’, ‘Galway’)
GROUP BY c.cust_last_name;
SELECT c.cust_id, SUM(amount_sold) AS dollar_sales
FROM sales s, customers c
WHERE s.cust_id = c.cust_id
GROUP BY c.cust_id;
SELECT SUM(unit_cost) FROM costs GROUP BY prod_id;
SELECT * FROM customers WHERE cust_postal_code = ‘83786’;
.png)
.png)
.png)
.png)
.png)
VARIABLE v_task_name VARCHAR2(255);
VARIABLE v_wkld_name VARCHAR2(255);
EXECUTE :v_task_name := ‘my_task’;
EXECUTE :v_wkld_name := ‘my_sql_wkld’;
BEGIN
dbms_advisor.delete_sqlwkld_ref(:v_task_name, :v_wkld_name);
dbms_advisor.delete_sqlwkld(:v_wkld_name);
dbms_advisor.delete_task(:v_task_name);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
EXECUTE DBMS_ADVISOR.CREATE_TASK(DBMS_ADVISOR.SQLACCESS_ADVISOR, :v_task_id, :v_task_name);
5.查看当天前的优化任务;
SELECT * FROM user_advisor_tasks;
6.设置任务的参数,生成所有建议,并使用综合模式;
EXECUTE dbms_advisor.set_task_parameter(:v_task_name, ‘EXECUTION_TYPE’, ‘FULL’);
EXECUTE dbms_advisor.set_task_parameter(:v_task_name, ‘MODE’, ‘COMPREHENSIVE’);
EXECUTE dbms_advisor.add_sqlwkld_ref(:v_task_name, :v_wkld_name);
10.导入负载,使用SQL Cache的模式;
VARIABLE v_saved_stmts NUMBER;
VARIABLE v_failed_stmts NUMBER;
EXECUTE DBMS_ADVISOR.IMPORT_SQLWKLD_SQLCACHE(:v_wkld_name, ‘APPEND’, 2, :v_saved_stmts, :v_failed_stmts);
SELECT * FROM user_advisor_sqlw_stmts;
EXECUTE DBMS_ADVISOR.EXECUTE_TASK(:v_task_name);
SELECT * FROM user_advisor_recommendations;
DROP DIRECTORY ADVISOR_RESULTS;
CREATE OR REPLACE DIRECTORY ADVISOR_RESULTS AS ‘/home/oracle’;
GRANT READ, WRITE ON DIRECTORY ADVISOR_RESULTS TO sh;
EXECUTE DBMS_ADVISOR.CREATE_FILE(DBMS_ADVISOR.GET_TASK_SCRIPT(:v_task_name), ‘ADVISOR_RESULTS’, ‘advscript.sql’);
VARIABLE v_task_name VARCHAR2(30);
EXECUTE :v_task_name := ‘quick_task’;
EXECUTE dbms_advisor.quick_tune(dbms_advisor.sqlaccess_advisor, :v_task_name, ‘SELECT AVG(amount_sold) FROM sh.sales WHERE promo_id=10’);