Oracle資料庫該如何著手優化乙個SQL

2022-08-02 13:57:10 字數 3292 閱讀 3603

這是個終極問題,因為優化本身的複雜性實在是難以總結的,很多時候優化的方法並不是用到了什麼高深莫測的技術,而只是乙個思想意識層面的差異,而這些都很可能連帶導致效能表現上的巨大差異。

所以有時候我們應該先搞清楚需求到底是什麼,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...