繫結變數和游標共享

2021-08-29 20:47:35 字數 1782 閱讀 4730

變數繫結是oltp系統中乙個非常值得關注的技術點。良好的變數繫結會使oltp系統資料庫中的sql執行速度飛快,記憶體效率極高;不繫結變數可能會使oltp資料庫不堪重負,資源被sql解析嚴重消耗,系統顯得滯重而緩慢。

6.1 什麼是變數繫結,為什麼要做變數繫結

在介紹繫結變數以前,首先要介紹一下sql究竟是如何被執行的,知道了sql執行的具體細節之後,才能討論為什麼以及什麼時候要做變數繫結。

當乙個使用者與資料庫建立起了連線後,會向資料庫發出操作請求,也就是向資料庫傳送一條(或是幾條或乙個pl/sql包)sql語句。oracle在接到這條sql之後,首先會將這個sql做乙個hash函式運算,得到乙個hash值,然後到共享池中尋找是否有和這個hash值匹配的sql存在。如果找到了,oracle將直接使用已經存在的sql的執行計畫去執行當前的sql,然後將結果返回給使用者;如果在共享池中沒有找到相同hash值的sql,oracle會認為這是一條新的sql,將會按照下面的順序來執行:

a. 語法分析

主要看這條sql是否符合oracle規定的語法規則,如果發現語法有誤,將向使用者丟擲乙個錯誤資訊。

b. 語義分析

當語法分析通過以後,oracle將對這條sql做一些物件、許可權方面的檢查,檢視sql中操作的表是否存在,表中的列是否正確,使用者是否有操作這個物件的許可權等。這個階段會自動把oracle中的小寫轉為大寫(引號內的內容除外)(待確認)。

c. 生成執行計畫

這個過程oracle將通過一些列的操作,來做出最後sql的執行計畫,比如檢視操作物件的統計資訊,動態取樣等。

d. sql的執行

oracle按照上一步生成的執行計畫,實際地執行sql語句,並將結果返回給使用者。至此,一條sql語句執行完畢。

語法分析、語義分析、生成執行計畫這些工作十分消耗資源,所以通常稱為硬分析(hard parse),而直接通過相同hash值從共享池中獲取執行計畫則稱為軟分析(soft parse)。

繫結變數是什麼,為什麼要繫結變數?

繫結變數就其本質來說就是把本來需要oracle做硬分析的sql變成了軟分析,以減少oracle花費在sql解析上的時間和資源。

6.2 為什麼說oltp必須要求變數繫結而olap不應該繫結變數

oltp系統中,sql語句大多是比較簡單或操作的結果集都很小。如果在這些表上建立了索引,那麼這種極小結果集的操作使用索引最適合,並且幾乎所有sql的執行計畫中的索引都會毫無懸念地被選擇。在這種執行計畫幾乎是唯一的情況下,oracle使用變數來代替謂詞常量,使用同乙個執行計畫時合適的。

而olap系統再sql的操作中就複雜得多,olap資料庫上大多數時候執行的是一些報表sql,這些sql經常會用到聚合查詢(比如group by),而且結果集也非常龐大,在這種情況下,索引並不是必然的選擇,甚至有的時候全表掃瞄的效能會優於索引,即使相同的sql,如果謂詞條件不同,執行計畫都可能不同。

我們大致可以得出下面的結論:

(1) olap系統完全沒有必要繫結變數,那樣只會帶來負面的影響,比如導致sql選擇了錯誤的執行計畫,這個代價有時候是災難性的;讓oracle對每條sql做硬分析,確切地知道謂詞條件的值,這對執行計畫的選擇至關重要,這樣做的原因是,在olap系統中,sql硬分析的代價是可以忽略的,系統的資源基本上是用於做大的查詢,和查詢比較起來,sql解析消耗的資源顯得微不足道。所以得到乙個最優的執行計畫變得尤為重要。

(2) 在olap系統上,讓oracle確切地知道謂詞的數值至關重要。它直接決定了sql執行計畫的選擇,這樣做的方式就是不要繫結變數。

(3) 在olap系統中,表、索引的分析至關重要,因為它是oracle為sql做出正確的執行計畫的資訊**和依據,所以需要建立一套能夠滿足系統要求的對物件分析的定時執行任務。

Oracle游標繫結變數使用

3.2 繫結變數 using 只需要解析一次 begin execute immediate update emp set sal sal 2 where empno p empno using p eno commit end 注意 不能使用繫結變數替換實際的資料庫物件名 表,檢視,列等 只能替換...

游標資料修改和游標變數

修改游標資料 如果建立的游標需要執行更新或者刪除必須帶有for update子句,for update子句會將游標提取出來的資料進行行級鎖定,這樣在本會話更新期間,其他使用者的會話就不能對當前游標中的資料進行更新操作,for update有如下兩種形式 for update of 列,列.為游標中的...

ORACLE 游標和游標變數的區別

如何定義游標型別 type ref type name is ref cursor return return type 宣告游標變數 cursor name ref type name 從技術底層看,兩者是相同的。普通plsql cursor在定義時是 靜態 的。而ref cursors可以動態開...