標籤:targe 簡單 列表 task images set 使用 報告 exe
Oracle最佳化本身就是一件難度比較大的事情,所涉及的事情方方面面。下面說一下我的最佳化經驗(僅限於初學者使用):
很多書上說的最佳化經驗,都包括索引、表結構、標量子查詢以及資料庫層面的最佳化,但是80%的最佳化都可以是語句級的最佳化。最佳化的對象包括:procedure、function及Sql。
對於對Oracle資料庫很熟悉的人來說,最佳化基本不需要藉助任何工具就可以做到。但下面我說兩個工具用來進行Sql最佳化:dbms_profile和advisor兩個工具。
當然也可以通過執行計畫進行最佳化。
最後會簡單闡述ADDM報告需要重點關注的幾個地方。
1、dbms_profile這個工具在10g之前是沒有安裝的,需要手動執行$ORACLE_HOME/rdbms/admin/proftab.sql進行初始化。這個工具是用來收集procedure和function基於每條語句的所花費的時間,是概數。
2、advisor工具是針對每條sql語句,通過Oracle內建的最佳化器給出最佳化建議。
那麼對於兩個工具可以配合使用,使用dbms_profile進行對象過程語句的篩選,通過advisior進行語句級的最佳化。
一、dbms_profile的使用先不進行說明,以後詳解。
二、advisior使用舉例
1)定義task任務
declare
my_task_name varchar2(30);
my_sqltext clob;
begin
my_sqltext:=‘select a.*,b.deptno from emp a,dept b where a.deptno=b.deptno‘;
my_task_name:=dbms_sqltune.create_tuning_task
(sql_text => my_sqltext, ---最佳化的語句
user_name => ‘SCOTT‘, ---最佳化的所在使用者
scope => ‘COMPREHENSIVE‘, ---最佳化範圍(COMPREHENSIVE或者limited)
time_limit => 60, ---最佳化的時間限制
task_name => ‘tuning_sql_text‘, ---任務名稱
description => ‘task to‘); ---任務描述
end;
2)執行任務進行最佳化分析
begin dbms_sqltune.execute_tuning_task(‘tuning_sql_text‘); end;
3)查看是否已經得到結果
select * from user_advisor_tasks where task_name=‘tuning_sql_text‘;
4)查看最佳化結果
select dbms_sqltune.report_tuning_task(‘tuning_sql_text‘) from dual;
下面結果最佳化得到的結果,由於語句比較簡單,所以最佳化器沒有給出結果。
三、ADDM報告簡單說明
1)產生addm報告
有兩種方法,一是通過em工具產生;二是通過命令產生addm報告。以下是通過em工具產生的報告。
得到的結果如:
2)最佳化需要考慮的幾點是 a、Memory Target, b、I/O, c、Wait stats,在ADDM報告中就是如下幾點
需要觀測的是值異常的一些。
四、使用執行計畫進行最佳化
可以使用執行計畫進行sql的最佳化,方法有很多。可以通過dbms_xplan、plsql裡的計劃或者cmd中的set autotrace on等。
使用執行計畫進行sql最佳化需要瞭解的知識比較多:
1)瞭解位元影像索引、雜湊索引和b樹索引的區別及應用範圍
2)當然定界分割、散列分區、列表分區以及複雜的複合分區特點
3)sql語句解析順序、對索引的解析範圍
4)對hint的瞭解及應用
5)表中列索引的建立和索引空間和資料空間的規劃等
才可以通過執行計畫對sql進行更好地最佳化。
最佳化是一個非常複雜但同樣又是一件比較簡單的事情,其中涉及到的知識非常多,本文只是簡單列舉了常用的幾項最佳化方法,對於sql最佳化有時候是需要根據經驗進行最佳化的。
僅供參考。
本文原創,禁止轉載!
關於Oracle程式塊(主要為sql)最佳化方法小結