資料庫優化 ORACLE動態繫結變數

2021-05-24 00:42:24 字數 1471 閱讀 6896

oracle 將已解析、已編譯的sql 連同其他內容儲存在共享池(shared pool)中,這是系統全域性區(system global area ,sga)中乙個非常重要的共享記憶體結構。但是已解析,已編譯的sql要想實現其復用有乙個前提,要求開發人員在大多數情況下都會使用繫結變數。

繫結變數(bind variable)是查詢中的乙個佔位符。

例如比較如下sql語句:

select * from table where id = 1與

my_id := 1

select * from table where id = my_id

對於第乙個sql語句,在查詢中使用直接量(常量),那麼每個查詢都將是乙個全新的查詢,在資料庫看來以前從未見過,必須對查詢進行解析、限定(命名解析)、安全性檢查、優化等。簡單地講,就是你執行的每條不同的語句都要在執行時進行編譯。(解析包含有硬編碼變數的語句稱為硬解析)

而對於第二個查詢使用了乙個繫結變數my_id,變數值在查詢執行時提供。這個查詢只編譯一次,隨後會把查詢計畫儲存在乙個共享池(庫快取)中,以便以後獲取和重用這個查詢計畫,(重用已解析的查詢計畫稱為軟解析)。

軟解析與硬解析之間的區別主要表現在以下幾個方面:

1、與軟解析相比硬解析需要的時間更長,而且要消耗更多的資源,硬解析會減少系統能支援的使用者數。

2、硬解析乙個查詢時,資料庫會更長時間地占用一種低階序列化裝置,這稱為閂(latch),這些閂能保護oracle共享記憶體中的資料結構不會同時被兩個程序修改,而且如果有人正在修改資料結構,則不允許另外的人再來讀取。對這些資料結構加閂的時間越長、越頻繁,排隊等待閂的程序就越多,等待佇列也越長。你可能開始獨佔珍貴的資源。有時你的計算機顯然利用不足,但是資料庫中的所有應用都執行得非常慢。造成這種現象的原因可能是有人佔據著某種序列化裝置,而其他等待序列化裝置的人開始排隊,因此你無法全速執行。資料庫中只要有乙個應用表現不佳,就會嚴重地影響所有其他應用的效能。如果只有乙個小應用沒有使用繫結變數,那麼即使其他應用原本設計得很好,能適當地將已解析的sql放在共享池中以備重用,但因為這個小應用的存在,過一段時間就會從共享池中刪除已儲存的sql。這就使得這些設計得當的應用也必須再次硬解析sql。

**實現例項:

1、oracle自己預設實現的繫結變數:

for i in 1..1000 loop

select count(*) into my_count from table where my_type = i;

end loop;

在上面的情況,oracle會自己繫結變數,即,如果引數儲存在乙個陣列中,select語句放在乙個迴圈中,select 語句只會編譯一次。

2、動態繫結變數

my_type:='type1';

my_count := 0;

my_sql:='select count(*) into :x from table where type = :y'

execute immediate my_sql into my_count using my_type;

Oracle資料庫優化

1.使用索引 當sql中含有max min order by 時增速明顯。建立索引應用於join where order by排序的字段上,避免建立在含有大量重複的字段上,例如某個具有列舉型別的字段,避免索引所在的字段含有 null 值 索引會降低 insert update 的速率 2.選取最適用...

優化Oracle資料庫效能

優化策略 為了保證oracle資料庫執行在最佳的效能狀態下,在資訊系統開發之前就應該考慮資料庫的優化策略。優化策略一般包括伺服器作業系統引數調整 資料庫引數調整 網路效能調整 應用程式sql語句分析及設計等幾個方面,其中應用程式的分析與設計是在資訊系統開發 分析評價oracle資料庫效能主要有資料庫...

oracle 資料庫例項優化

1 將sga鎖定在物理記憶體中,設定引數lock sga true sql alter system set lock sga true scope spfile 2 啟動資料庫例項時,將整個sga鎖定在物理記憶體中 sql alter system set pre page sga true sc...