Oracle-優化SQL語句

建議不使用(*)來代替全部列名sql

用truncate代替delete數據庫

  在SQL*Plus環境中直接使用truncate table便可;要在PL/SQL中使用,如:緩存

建立一個存儲過程,實現使用truncate命令動態刪除數據表函數

create or replace procedure trun_table(table_deleted in varchar2) as
cur_name integer;
begin
cur_name:=dbms_sql.open_cursor;
dbms_sql.parse(cur_name,'truncate table'||table_deleted||'drop storage',
dbms_sql.native);
dbms_sql.close_cursor(cur_name);
exception
when others then dbms_sql.close_cursor(cur_name);
raise;
end trun_table;
/性能

在確保完整性的狀況下多用commit語句測試

  commit所釋放的資源以下:大數據

回滾段上用於恢復數據的信息,撤銷表空間也只做短暫的保留優化

被程序語句得到的鎖操作系統

redo log buffer中的空間設計

Oracle爲管理上述資源的內部花費

 

儘可能減小表的查詢次數

  在含有子查詢的SQL語句中,要特別注意減小對錶的查詢

用[not]exists 代替[not]in

 

 

錶鏈接優化

  

驅動表的選擇

  驅動表是指最早被訪問的表(一般以全表掃描的方式被訪問);一般只有from 表後都創建索引,優化器才能按照(每一個表的物理大小、索引狀態,選擇花費最低的執行路徑)驅動表的規則來對待

 

where子句的鏈接順序

  Oracle採用自下而上的順序解析where子句,根據這個原理,表之間的鏈接必須寫在其餘where條件以前。那些能夠過濾掉最大數據記錄的條件必須寫在where子句的末尾,也就是在錶鏈接以前過濾掉的記錄越多越好

 

合理使用索引

  

什麼時候使用索引

  對於只從總行數中查詢2%-4%的表,能夠考慮建立索引,建立索引的基本原則

1.以查詢關鍵字爲基礎,表中的行隨機排序

2.包含的列數相對比較少的表

3.表中的大多數查詢都包含相對簡單的where從句

4.對於常常以查詢關鍵字爲基礎的表,而且該表中的行聽從均勻分佈

5.緩存命中率低,而且不須要操做系統權限

 

選擇複合索引主列

  若是在創建索引時採用了幾個列做爲索引,則在使用時也要按照創建時的順序來描述,也就是說,主列是最早被選擇的列

 

避免全表掃描大表

  會致使全表掃描的狀況:

1.所查詢的表沒有索引

2.須要返回全部的行

3.帶有like並使用%這樣的語句

4.對索引主列由條件限制,但使用了函數,則Oracle使用全表掃描

5.is null is not null !=等子句

 

監視索引是否被引用

  從Oracle9i開始,用戶能夠對索引進行監視,看看所建立的索引是否被使用

如:監視學生成績表studentgrade的grade_index索引是否被使用

alter index grade_index monitoring usage;

select * from v$object_usage;

 

優化器的使用

  

優化器的概念

  實際上,Oracle優化器在處理每個SQL語句準備執行以前,都須要進行許多步驟才能使SQL語句成爲可執行的語句,主要步驟以下:

1.語法檢查:檢查SQL語句的拼寫是否正確

2.語義分析: 覈實全部與數據字典不一致的表和列的名字

3.概要存儲檢查: 檢查數據字典,以肯定該SQL語句的概要是否存在

4.生成執行計劃:使用基於成本的優化規則和數據字典的統計表來決定最佳執行計劃

5.創建二進制代碼:基於執行計劃,Oracle生成了二進制執行代碼

 

Oracle11g中SQL執行計劃的管理

  Oracle11g使用基於成本的優化方式(Cost_Based Optimization,CBD),這裏的代價主要指CPU和內存,優化器主要參照的時表及索引的統計信息。統計信息給出表的大小、有多少行、每行的長度等信息。這些統計信息起初在數據庫內是沒有的,時用戶作analyze後纔出現的。不少時候,過時統計信息會令優化器作出一個錯誤的執行計劃,所以用戶應及時更新這些消息。

 

 

數據庫和SQL重演

  對於數據庫和SQL語句優化,Oracle11g中提出了兩個新特性——數據庫重演(Database Replay)和SQL重演(SQL Replay)

數據庫重演

  DatabaseReplay是指在產品環境的數據庫上捕獲全部負載,並能夠將之傳送至備份的(Standby)數據庫或有備份恢復的測試庫上,在測試環境中重演主庫的環境,這使得升級或軟件更新能夠進行預先的「真實」測試,或者能夠經過測試環境徹底再現真實環境的負載及運行狀況。

  通常使用這一特性,會帶來約5%性能負擔

SQL重演

    只捕獲SQL,經過SQL負載,應用程序能夠再現SQL影響

Flashback能夠向後閃回;Replay能夠向前推演。

 

Oracle性能顧問

 

 

  Oracle數據庫中有一位自動數據庫診斷監控程序(ADDM)形式的助理DBA,這種機器人式的DBA會不知疲倦地反覆搜索數據庫性能統計,以標識瓶頸、分析SQL語句,並據此提供多種改進性能的建議。Oracle自動SQL調整解決方案包括SQL調優顧問(SQL Tunning Advisor)和SQL訪問顧問(SQL Access Advisor),能夠爲應用程序提供綜合、自動、具備成本效益的解決方案,減小SQL的調整時間和管理成本

 

SQL調優顧問

Oracle10g引入的,爲了替代傳統的手動SQL調整

  處理對象包括那些響應時間很慢或者佔用CPU/DISK很高的SQL

SQL調優顧問收集這些SQL,而且給出本身的建議,它包括下面的部分:

1.這樣調整SQL的執行計劃

2.優化後效率的提高幅度

3.作出這條建議的理論原理

4.直接給出推薦使用的命令

 

用戶能夠選擇性地接受這些建議,而後去調優SQL;隨着SQL調優顧問的引入,用戶如今可讓Oracle優化器來自動調整SQL

 

SQL訪問顧問

  設計目的是得到有關基於實際頻率和使用類型(而非數據類型)進行分區、索引和建立物化視圖以改進模式設計的建議。它的特色:

1.分析整個負載而不只僅是單獨的SQL語句。

2.使訪問結構設計更加清晰,以優化應用程序性能。

3.建議建立和刪除某些索引、物化視圖和物化視圖日誌以提升性能

相關文章
相關標籤/搜索