這是個終極問題,因為優化本身的複雜性實在是難以總結的,很多時候優化的方法並不是用到了什麼高深莫測的技術,而只是乙個思想意識層面的差異,而這些都很可能連帶導致效能表現上的巨大差異。
所以有時候我們應該先搞清楚需求到底是什麼,sql本身是否合理,這些思考很可能會使優化工作事半功倍。而本文是假設sql本身合理,從oracle提供給我們的一些技術手段來簡單介紹下oracle資料庫,該如何使用一些現有的技術來優化乙個sql執行的效能。
確定需要優化的sql文字及當前sql執行計畫
確定sql涉及的所有表及其索引的相關資訊
執行sql tuning advisor 得到調整建議供優化參考
收集表資訊
收集索引資訊
sql profile
物化檢視
確定查詢涉及到的所有表及其索引的相關基礎資訊。比如:
各表的資料量表和索引型別
表分割槽資訊,每個分割槽的資料量
索引字段
索引分割槽資訊
表關聯方式
結果集的數量
--普通表/分割槽表資訊
select * from dba_tables where table_name = 't2';
select * from dba_part_tables where table_name = 't2';
--普通表/分割槽表的每個分割槽大約__g大小
select (t.bytes/1024/1024) "mb", t.* from dba_segments t where segment_name = 't2';
--表資料量資訊
--普通表的資料量
select count(1) from t2; --____資料左右
--分割槽表的某個分割槽資料量
select count(*) from t2 partition(p20160101); --____資料左右
select count(*) from t2 partition(p20160102);
--表索引資訊
--普通表索引及各個索引的索引列
select * from dba_indexes where table_name = 't2';
select * from dba_ind_columns where index_name in (select index_name from dba_indexes where table_name = 't2')order by index_name, column_position;
--分割槽表索引及各個索引的索引列
select * from dba_part_indexes where table_name = 't2';
select * from dba_ind_columns where index_name in (select index_name from dba_part_indexes where table_name = 't2') order by index_name, column_position;
--索引段大小資訊
--select (t.bytes/1024/1024) "mb", t.* from dba_segments t where segment_name in (select index_name from dba_part_indexes where table_name = 't2') order by segment_name, partition_name;
執行sql tuning advisor 得到調整建議供優化參考, sql tuning advisor得到的優化建議僅供參考,具體如何做還需要結合業務實際情況。
例如收集zjy使用者下t2表的統計資訊。(t2是range分割槽表,按天分割槽,每天資料量大概80w,存放半年)
sql> execute dbms_stats.gather_table_stats(ownname => 'zjy', tabname => 't2', estimate_percent => dbms_stats.auto_sample_size, method_opt => 'for all columns size auto', cascade => true, degree => 16);
pl/sql procedure successfully completed
executed in 5896.641 seconds
統計資訊加鎖/解鎖
--鎖住表的統計資訊
exec dbms_stats.lock_table_stats('zjy','t2');
--解鎖表的統計資訊
exec dbms_stats.unlock_table_stats('zjy','t2');
例如只收集zjy使用者下t2表的索引idx_t2_1統計資訊。(idx_t2_1是分割槽索引,包含4個字段)
sql> execute dbms_stats.gather_index_stats(ownname => 'zjy', indname => 'idx_t2_1', estimate_percent => dbms_stats.auto_sample_size, degree => 8);
pl/sql procedure successfully completed
executed in 44.312 seconds
create index idx_t2_2 on t2(start_time) tablespace dbs_i_jingyu nologging parallel 12 online;
alter index idx_t2_2 noparallel;
alter index idx_t2_2 logging;
sql profile是10g中的新特性,作為自動sql調整過程的一部分。sql profile是乙個物件,它包含了可以幫助查詢優化器為乙個特定的sql語句找到高效執行計畫的資訊。這些資訊包括執行環境、物件統計和對查詢優化器所做評估的修正資訊。它的最大優點之一就是在不修改sql語句和會話執行環境的情況下影響查詢優化器的決定。sql profile中包含的並非單個執行計畫的資訊,sql profile不會固定乙個sql語句的執行計畫。當表的資料增長或者索引建立、刪除,使用同乙個sql profile的執行計畫可能會改變,而儲存在sql profile中的資訊會繼續起作用。所以,經過一段很長的時間之後,它的資訊有可能會過時,需要重新生成。
oracle的物化檢視可以用於預先計算並儲存(表連線或聚集等耗時較多的操作的)結果,所以合理使用物化檢視,會在執行查詢時避免進行這些耗時的操作,從而快速的得到結果。
Oracle 資料庫調優
通常我們在安裝完oracle資料庫以後本地就直接使用了,但是用在正式的生產環境上還是需要一點優化的,否則就會是預設的最低配機器配置。難以發揮伺服器的效能。這裡記錄一下比較常用的幾個引數 進入檔案 etc sysctl.conf kernel.shmmax 24051816858 記憶體的70 ker...
oracle資料庫調優筆記
select tablespace name,file id,bytes 1024 1024,file name from dba data files order byfile id selectgroup member from v logfile select from v logfile s...
ORACLE 資料庫調優 策略參考
oracle調優策略參考 工具採用了statspack 安裝statspack 建立乙個120m左右的表空間,如perfstat 在伺服器端用sqlplus 登入到sys as sysdba使用者 執行 rdbms admin spcreate 執行收集的方式 exec statspack.snap...