轉(zhuǎn)帖|其它|編輯:郝浩|2010-07-14 11:58:27.000|閱讀 649 次
概述:在典型的SQL服務(wù)器性能優(yōu)化實(shí)踐中,我們經(jīng)常使用JDBC驅(qū)動(dòng)程序來(lái)識(shí)別哪一位用戶使用的SQL服務(wù)器資源最多。使用JDBC驅(qū)動(dòng)程序中的字符數(shù)據(jù)類型屬性轉(zhuǎn)換可以節(jié)省SQL服務(wù)器資源。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷售中 >>
在典型的SQL服務(wù)器性能優(yōu)化實(shí)踐中,我們經(jīng)常使用JDBC驅(qū)動(dòng)程序來(lái)識(shí)別哪一位用戶使用的SQL服務(wù)器資源最多。使用JDBC驅(qū)動(dòng)程序中的字符數(shù)據(jù)類型屬性轉(zhuǎn)換可以節(jié)省SQL服務(wù)器資源。
查詢語(yǔ)句對(duì)于常使用JDBC驅(qū)動(dòng)程序的用戶來(lái)說(shuō)并不陌生。
SELECT contact FROM tbl_Customers WHERE ID = @P0
這種查詢僅需要3毫秒的時(shí)間即可以得到結(jié)果,看起來(lái)并不是太慢。但在使用這個(gè)語(yǔ)句對(duì)SQL服務(wù)器進(jìn)行查詢的時(shí)候,已經(jīng)經(jīng)歷了數(shù)百萬(wàn)次計(jì)算,并且在這個(gè)過(guò)程中,將限制SQL其他程序運(yùn)行對(duì)數(shù)據(jù)庫(kù)資源的使用。為了了解整個(gè)運(yùn)行過(guò)程,讓我們看一下這個(gè)語(yǔ)句所牽扯到的SQL查詢計(jì)劃后臺(tái)的運(yùn)行程序。您會(huì)發(fā)現(xiàn),這個(gè)過(guò)程其實(shí)比想象的要復(fù)雜許多。(這里僅提供執(zhí)行計(jì)劃中的最重要的一部分):
Nested Loops(Inner Join, OUTER REFERENCES:([Expr1004],
|--Compute Scalar(DEFINE:(([Expr1004],[Expr1005],[Expr1003])=GetRangeThroughConvert([@P0)
| |--Constant Scan
|--Clustered Index Seek(OBJECT:([Prod].[dbo].[tbl_Customers]..[ID].. SEEK:( [ID] >
[Expr1008] AND [ID] < [Expr1009]),
WHERE:(CONVERT_IMPLICIT(nvarchar(255), [ID],0)=[@P0])
在整個(gè)查詢過(guò)程中,程序運(yùn)行了嵌套循環(huán)。這是對(duì)一個(gè)文件的單一查找,為何SQL服務(wù)器在編譯查詢計(jì)劃是會(huì)使用嵌套循環(huán)程序而不是直接通過(guò)索引尋找相應(yīng)的文件參數(shù)值?如果仔細(xì)分析一下上面的后臺(tái)運(yùn)行程序,您會(huì)發(fā)現(xiàn)在上述程序語(yǔ)句中有一個(gè)隱形的嵌套循環(huán)語(yǔ)句:
CONVERT_IMPLICIT(nvarchar(255), [ID],0)
這個(gè)語(yǔ)句就是為什么SQL服務(wù)器會(huì)重復(fù)引用嵌套程序的原因所在。為了盡量減少客戶端Java本地字符串之間的轉(zhuǎn)換,Java程序是按照統(tǒng)一碼編寫(xiě)的。這就使得用戶在使用JDBC驅(qū)動(dòng)程序?qū)QL服務(wù)器進(jìn)行查詢或操作時(shí),所有的varchar()會(huì)在默認(rèn)狀態(tài)下變?yōu)閚varchar()變量。而在SQL程序運(yùn)行中nvarchar()變量的運(yùn)行優(yōu)先級(jí)高于varchar()變量。SQL服務(wù)器自身并不能將nvarchar()變量轉(zhuǎn)換為varchar()變量,所以執(zhí)行兩種語(yǔ)句代碼之間的轉(zhuǎn)換時(shí)會(huì)發(fā)生一些錯(cuò)誤。如@P0本身是varchar()變量,但鏈接傳送給SQL數(shù)據(jù)庫(kù)時(shí)會(huì)以nvarchar()變量的形式傳送。
那么,我們?nèi)绾问沟肑DBC驅(qū)動(dòng)程序停止這一轉(zhuǎn)換呢?在JDBC驅(qū)動(dòng)程序?qū)傩灾杏幸粋€(gè)按照“統(tǒng)一碼字符串參數(shù)發(fā)送鏈接命令“(sendStringParametersAsUnicode)的選項(xiàng)。在默認(rèn)狀態(tài)下,這個(gè)選項(xiàng)的選擇是,我們可以手動(dòng)的將其改為否。這樣問(wèn)題就得到了解決。@P0會(huì)按照varchar()變量進(jìn)行發(fā)送,從而不再參與到嵌套循環(huán)查詢過(guò)程中。
如果用戶希望同時(shí)傳送varchar()和nvarchar()變量時(shí),可以先將“統(tǒng)一碼字符串參數(shù)發(fā)送鏈接命令”的選項(xiàng)設(shè)置為否。另外增加保證nvarchar()變量傳輸?shù)恼Z(yǔ)句:
pStmt.setObject(2,Id,Types.NVARCHAR);
在對(duì)鏈接字符串屬性進(jìn)行修改后,整個(gè)過(guò)程運(yùn)行的時(shí)間可以由3毫秒縮減為1.5毫秒。總工作量可以提高20%。沒(méi)想到吧,一個(gè)小小的設(shè)置可以帶來(lái)那么大的后臺(tái)運(yùn)行變化
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載