国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Oracle中的SQL語句共享研究

2015-01-29 00:36楊國勛
新媒體研究 2014年22期

楊國勛

摘 要 在軟件應(yīng)用系統(tǒng)設(shè)計和開發(fā)的過程中,容易被設(shè)計者所忽視的就是如何通過增加數(shù)據(jù)庫SQL語句共享來提高系統(tǒng)的整體性能,本文通過深入研究Oracle數(shù)據(jù)庫中SQL語句的解析過程,分析了SQL語句不能共享的主要原因,并給出如何增加SQL語句共享率的解決方案。

關(guān)鍵詞 SQL語句共享;軟解析;硬解析

中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1671-7597(2014)22-0069-01

Oracle數(shù)據(jù)庫是目前在中大型軟件項目中應(yīng)用最為廣泛的數(shù)據(jù)庫之一,在這樣一些項目中需要處理的數(shù)據(jù)量是非常巨大的,而且用戶對應(yīng)用系統(tǒng)的性能要求比較高。提高系統(tǒng)的性能一方面是需要有一個良好的架構(gòu)設(shè)計,另一方面則是要提高底層數(shù)據(jù)庫系統(tǒng)的性能。數(shù)據(jù)庫性能的提升需要由經(jīng)驗豐富的DBA來配置和維護(hù),但更重要而且是容易被忽視的是程序員在編寫代碼時需要提高數(shù)據(jù)庫系統(tǒng)的SQL語句共享率,避免不必要的SQL語句硬解析,從而降低系統(tǒng)在進(jìn)行SQL語句解析花費的時間和資源。

1 SQL語句解析過程

Oracle處理客戶端應(yīng)用程序提交過來的SQL語句主要分為4個階段,SQL語句解析、參數(shù)綁定、執(zhí)行和獲取結(jié)果,其中SQL語句解析是其中非常重要的一個階段,理解這個階段的處理過程對于提高應(yīng)用系統(tǒng)整體性能有很好的幫助。

在SQL語句的解析階段,Oracle會進(jìn)行如下操作:

檢查SQL語法錯誤:檢查SQL語句中的關(guān)鍵字是否有拼寫錯誤,順序和位置是否正確等。

檢查SQL語義錯誤:檢查該SQL語句引用的對象是否存在,提交SQL語句的用戶是否具有訪問該對象的權(quán)限等。

SQL共享語句查詢:Oracle數(shù)據(jù)庫服務(wù)器管理程序會先在服務(wù)器會話緩存用戶全局區(qū)(UGA)中查詢是否有此SQL語句對應(yīng)的已打開的游標(biāo)(Open Cursor),如果有則通過已打開游標(biāo)中的指針找到在服務(wù)器共享池(Shared Pool)中的此SQL語句對應(yīng)游標(biāo)句柄并執(zhí)行,此時不需要對語句進(jìn)行解析,因為打開的游標(biāo)已經(jīng)被解析,而且游標(biāo)句柄已經(jīng)存在于服務(wù)器共享池的庫緩存(Library Cache)中。

如果游標(biāo)被關(guān)閉,則游標(biāo)的信息會被保存在會話關(guān)閉游標(biāo)的緩存中,此緩存的大小是由參數(shù)SESSION_CACHED_CURSORS決定的。當(dāng)系統(tǒng)在UGA中沒找到SQL語句對應(yīng)的已打開的游標(biāo),則會在已關(guān)閉游標(biāo)緩存中查詢,如找到匹配的已關(guān)閉游標(biāo),則會重新打開此游標(biāo),通過此游標(biāo)可以直接執(zhí)行SQL語句而不需要重新解析。

如果系統(tǒng)在UGA中沒找到此SQL語句的游標(biāo),則會根據(jù)SQL語句生成的Hash值在Shared Pool中的Hash鏈中查詢是否有此SQL語句對應(yīng)的游標(biāo)句柄,如果此游標(biāo)句柄能夠找到且游標(biāo)的其他信息沒有丟失,則可以執(zhí)行此SQL語句,此次查詢過程被系統(tǒng)記錄為一次解析,但不是真的解析,因此這個過程也被稱為軟解析。

硬解析:如果此SQL語句在UGA和Shared Pool中都沒有找到匹配的游標(biāo),則Oracle服務(wù)器系統(tǒng)需要在Library Cache中為此SQL語句創(chuàng)建一個父游標(biāo)(parent cursor)和一個子游標(biāo)(child cursor)。父游標(biāo)中包含了SQL文本和對應(yīng)的Hash值,父游標(biāo)的信息可以通過視圖v$sqlarea查詢。子游標(biāo)中包含了使得這個SQL可以執(zhí)行的所有相關(guān)信息,如執(zhí)行權(quán)限、優(yōu)化器設(shè)置和執(zhí)行計劃等。子游標(biāo)的信息可以通過視圖v$sql進(jìn)行

查詢。

2 SQL語句無法共享原因分析

通過對SQL語句在Oracle中的解析過程研究可以知道,SQL語句無法共享主要是由兩個原因造成,父游標(biāo)無法共享以及子游標(biāo)無法共享。

1)父游標(biāo)無法共享。

父游標(biāo)能夠共享的前提條件是SQL語句對應(yīng)的Hash值要一致,Oracle系統(tǒng)在生成SQL語句Hash值的時候是會區(qū)分大小寫和空格,如下面幾條SQL語句雖然查詢含義一樣,但寫法沒有統(tǒng)一使得Hash值不一致而造成SQL語句無法共享。

select * from tb_student where id=1

select * from TB_STUDENT where id=1

select * from tb_student where id=1

2)子游標(biāo)無法共享。

當(dāng)SQL語句及其Hash值一致時就可以共享父游標(biāo),但有時會因為種種原因使得子游標(biāo)無法共享,此時同一個父游標(biāo)會有多個子游標(biāo),子游標(biāo)的個數(shù)可以通過視圖v$sqlarea的version_count字段查詢處理。在實際的項目中,要盡量避免version_count過高的情況。子游標(biāo)無法共享的一個常見原因是綁定變量不一致,這里的變量不一致,有可能是變量名不一致,也有可能是變量對應(yīng)的數(shù)據(jù)類型的長度不一致,例如,對于字符類型的字段,進(jìn)行綁定變量的時候,如果該變量值小于32字節(jié)的話,第一次會使用32字節(jié)的緩沖區(qū),第二次執(zhí)行這個SQL的時候,如果該值小于32字節(jié),那么可以共享這個子游標(biāo),如果大于32字節(jié)就無法共享,此時會在同一父游標(biāo)下創(chuàng)建一個新的子游標(biāo),同時分配128字節(jié)的緩沖區(qū)。子游標(biāo)另外一個無法共享的常見原因是SQL語句查詢選擇的優(yōu)化器模式不一致。子游標(biāo)無法共享的原因可以通過查詢視圖v$sql_shared_cursor進(jìn)行分析。

3 增加SQL語句共享率

通過上述分析,要增加SQL語句共享率,提高系統(tǒng)的整體性能可以從以下幾方面入手:

1)SQL語句在文本上必須完成相同,包括空格、換行、大小寫都必須完全相同,因此在項目組中要制定SQL語句的書寫規(guī)范,使得不同的程序員在編寫程序時按照統(tǒng)一的SQL語句規(guī)范來書寫,增加SQL語句共享,減少SQL語句硬解析的次數(shù),提高應(yīng)用程序的執(zhí)行效率。

2)在書寫SQL語句的時候盡量使用綁定變量的方式,并且保證變量名和變量數(shù)據(jù)類型字段長度一致。在進(jìn)行SQL語句查詢時,盡量選擇一致的優(yōu)化器模式。

3)設(shè)置SESSION_CACHED_CURSORS參數(shù)為一個恰當(dāng)?shù)闹担瑥亩WC被關(guān)閉的游標(biāo)能在服務(wù)器緩存中保存一段時間,增加SQL語句共享的幾率。

參考文獻(xiàn)

[1]張江.Oracle數(shù)據(jù)庫的性能優(yōu)化策略淺析[J].現(xiàn)代計算機(專業(yè)版), 2012(36).

[2]趙琛.Oracle服務(wù)器性能影響因素分析與優(yōu)化[J].電腦編程技巧與維護(hù),2011(20).endprint

武城县| 略阳县| 翁牛特旗| 上虞市| 星座| 邹平县| 阿荣旗| 始兴县| 龙胜| 抚远县| 松滋市| 陆川县| 温宿县| 商洛市| 秦安县| 榆树市| 万安县| 塔河县| 兴安盟| 手机| 贺兰县| 灵山县| 莲花县| 天镇县| 清涧县| 武冈市| 和林格尔县| 蒙城县| 喀喇沁旗| 蒙自县| 淳安县| 志丹县| 五莲县| 女性| 喀喇沁旗| 开平市| 孟村| 邯郸市| 长岭县| 招远市| 榆社县|