連接內存
SQL Server 為客戶端請求的每個連接保留三個數據包緩沖區。每個緩沖區的大小取決於 sp_configure 存儲過程指定的默認網絡數據包大小。如果默認網絡數據包大小小於 8 KB,則這些數據包的內存將由 SQL Server 的緩沖池提供。否則,該內存將由 SQL Server 的 MemToLeave 區域分配。
值得一提的是,.Net Framework Data Provider for SQL Server 的默認網絡數據包大小為 8KB,因此,與托管代碼客戶端連接關聯的緩沖區通常由 SQL Server 的 MemToLeave 區域提供。而典型的 ADO 應用程序卻不同,它們的默認數據包大小為 4 KB,因此緩沖區將由 SQL Server 緩沖池分配。
事件
連接後的客戶端請求通常分為兩種廣泛類別:語言事件和遠程過程調用。盡管還存在其他類別,但大多數由 SQL Server 客戶端發送到服務器的請求由以下兩種類型之一構成:語言事件是從客戶端發送到服務器的 一組 T-SQL。例如,如果調用 ADO Command 對象(其 CommandText 屬性設置為 T-SQL 查詢,CommandType 屬性設置為 adCmdText)的 Execute 方法,則查詢將作為語言事件提交給服務器。同樣,如果將 CommandType 設置為 adCmdTable 並調用 Execute 方法,則 ADO 將生成一個內部查詢(它將選擇 CommandText 屬性標識的表中的所有列),並將它作為語言事件提交給服務器。另一方面,如果將 CommandType 設置為 adStoredProc,則調用 Execute 將使 ADO 向服務器提交一個遠程過程調用請求,以執行 CommandText 屬性中列出的存儲過程。
為何要關心將請求作為語言事件還是作為 RPC 提交給服務器呢?通常,這是因為 RPC 的功能更為出色,特別是在重復調用具有不同篩選值的同一查詢時。盡管 SQL Server 可以自動將普通的語言事件請求參數化,但這種能力非常有限。它從不嘗試自動將某些類型的查詢參數化。這可能會導致基本相同的查詢產生不同的執行,從而只因為這些不同的執行提供不同的值,而導致在服務器上白白浪費計劃編譯的成本。這通常不是您所希望的結果 - 您希望針對查詢的第一次執行編譯一個新的計劃,然後將該計劃重復用於具有不同參數的執行。
而 RPC 則通過顯式參數化查詢(而不是依賴服務器參數化查詢)來支持計劃重復使用。為過程的第一次執行生成一個計劃後,隨後的執行將自動重復使用該計劃,即使它們提供的參數值不同。與通過語言事件調用存儲過程相比,使用 RPC 調用存儲過程不僅節省了計劃編譯所需的執行時間和 CPU 資源,還增強了 SQL Server 內存資源的利用率,因為它避免了冗余執行計