運用計畫緩衝的建議

2021-09-07 00:20:08 字數 2855 閱讀 6494

原文:

運用計畫緩衝的建議

計畫緩衝的基本目的是通過重用執行計畫來改進效能。因為,確認執行計畫確實可重用很重要。因為即席查詢的計畫可重用性效率低下,所以一般建議盡可能依賴預定義工作負載技術。為了確保計畫緩衝的高效實用,遵循以下建議。

一、明確地引數化查詢的可變部分

查詢一般執行多次,每次執行的唯一不同是可變部分的不同值。它們的計畫可以重用,但是,查詢的靜態和可變部分應該分離。雖然sql server有簡單引數化和強制引數化特性,但是它們有各種侷限性。應該始終使用標準的預定義工作負載結束明確地執行引數化。

二、使用儲存過程實現業務功能

如果已經明確地引數化查詢,將它放置在儲存過程中可能帶來最好的可重用性。因為只需要傳送引數和儲存過程的名稱,所以網路流量減少了。儲存過程預先編譯,它們執行得比即席查詢快速。儲存過程還能為包含在儲存過程中的一組查詢維護單一的引數化計畫,而不是維護大量單獨查詢的小型計畫。這避免了計畫緩衝被單獨查詢的計畫充滿。

三、使用sp_executesql程式設計以避免儲存過程維護

如果考慮儲存過程所需的物件維護,或者打算使用客戶端生成的查詢,則使用sp_executesql將查詢作為預定義工作負載提交。和儲存過程模式不同,sp_executesql不在資料庫中建立持續性物件。sp_executesql適合執行單一的查詢或小型批查詢。在儲存過程中實現完整的業務員邏輯還可使用sp_executesql作為乙個大的查詢串提交。但是,隨著業務邏輯複雜性的增加,為整個邏輯建立並維護乙個查詢字串將變得困難。

四、實現準備/執行模式以避免重傳查詢字串

sp_executesql需要在每次重新執行時通過網路傳送查詢字串。它還需要伺服器端查詢字串匹配,以確認對應執行計畫在過程緩衝中的開銷。在odbc或oledb(oledb.net)應用程式中,可以使用準備/執行模式以避免在多次執行中重傳查詢字串,因為只需要提交計畫控制代碼和引數。

在準備/執行模式中,因為計畫控制代碼返回給應用程式,該計畫可以被其他使用者連線重用--這並不僅限於建立該計畫的使用者。

五、避免即席查詢

不要使用即席查詢設計新的應用程式。為即席查詢建立的執行計畫不能在查詢以不同的可變部分值重新提交時重用。儘管sql server有簡單引數化和強制引數化特性來隔離查詢的可變部分,但因為sql server在引數化中的保守,這個特性只限於簡單查詢。為了更好的計畫可重用性,將查詢作為預定義工作負載提交。

六、對於動態查詢sp_executesql優於execute

在儲存過程或資料庫應用程式中動態生成的sql查詢字串應該使用sp_executesql而不是execute命令執行。execute命令不允許查詢的可變部分明確地引數化。

如執行以下語句:

declare

@nvarchar(3

)set@n=

'678

'declare

@sql

varchar(max

)set

@sql='

select * from persontenthousand

inner join province on persontenthousand.pid = province.id

where persontenthousand.id = '+

@n+''execute (@sql)

生成的是即席計畫:

而如果換成:

declare

@nnvarchar(3

)set@n=

776declare

@sql

nvarchar(max),@param

nchar(6

)set

@sql='

select * from persontenthousand inner join province on persontenthousand.pid = province.id where persontenthousand.id = @1

'set

@param

= n'

@1 int

'execute sp_executesql @sql,@param,@1

=@n

結果如下:

我們看到,結果中生成了乙個引數計畫。

七、小心地引數化查詢的可變部分

在把查詢的可變部分轉換為引數時要小心。一些變數的取值範圍可能急劇變化,以致某個計畫的取值範圍可能不適合於其他值,這可能導致引數嗅探。要根據情況的需要進行處理。

八、不要允許查詢中物件的隱含解析

sql server允許在不同的架構(schema)下建立多個相同名稱的資料庫物件。

例如,表t1可以使用兩個不同架構(u1和u2)在單獨的所有者下建立。大部分系統中預設的所有者是dbo(資料庫所有者)。

如果使用者u1查詢:

select

*from t1 where c1 =

1

sql server首先嘗試查詢使用者u1預設架構下是否存在表t1。如果沒有,則嘗試查詢dbo使用者的表t1是否存在。這種隱含解析使使用者u1可以在不同的架構下建立表t1的另乙個例項,並且臨時性訪問它(使用相同的應用程式**)而不影響其他使用者。

在生產伺服器上,建議使用架構所有者並且避免隱含解析。否則,使用隱含解析在生產伺服器上將增加如下的開銷:

MSSQL執行計畫的優化建議

執行計畫 提交sql語句,資料庫查詢優化器,經過分析生成,制定多個查詢方式,從中選擇資源使用最少的 資料庫制定執行計畫是按照使用資源最少,而不是時間最短 對應的意思 1 受影響的行數 2 影響的位元組數 3 影響的資料大小 執行計畫 1 table scan 全表掃瞄 效能最差 2 cluster ...

公告 關於出書的計畫以及徵求建議

首先感謝dudu對我的信任,讓我負責的出書工作 公告 由bruce zhang負責的出書工作 之所以在公告發布之後,到現在我才出來冒個泡,出個聲,是因為我這幾天也在考慮這個工作如何進行。我相信,在和電子工業出版社博文視點合作之後,會開創乙個新的局面,這將是乙個 win win 的結果。同時,對於園子...

有效測試的50條建議 編制測試計畫(6)

不同的測試工作又不同的測試目標,不同的測試階段也有不容的測試目標,我們必須清楚此次測試工作的目標是什麼,這個目標是基於系統必須要滿足的標準。對測試目標的了解,可以通過以下幾個方面 1,理解系統。理解系統不僅僅指此次的需求,必須從整個系統高度來了解正在測試的系統的功能性和非功能性的需求。我們可以利用設...