tempdb資料庫是SQL Server用於臨時或者開關操作的資料庫。對tempdb所做的很多最佳化都是在透明的情況下,讓處理加速,本文就介紹tempdb對SQL Server 2005的影響以協助大家利用這些來寫出更好的、更先進的SQL Server 2005代碼。
SQL Server 2005版本中的所有變化可以寫成一本書,事實上,已經被寫成了好幾本書。其中,最重要的變化不是功能上的變化;這些變化發生在使用者或者管理員無法立刻感覺到的內部的行為上。這就是說,瞭解到它們是什麼,它們在什麼狀況下會表現出來,將會很有用。
這些的隱藏起來的效能提升中最好的一個例子就是tempdb資料庫——SQL Server用於臨時或者開關操作的資料庫。對tempdb所做的很多最佳化都是在透明的情況下,讓處理加速:
◆當暫存資料表被建立的時候,暫存資料表會被緩衝起來加速效能。然而,有一些表明確的不會被緩衝:
◆關聯著顯式DDL的暫存資料表
◆關聯著命名的約束的暫存資料表
◆作為動態產生的SQL語句的一部分的暫存資料表——例如,預存程序sp_executeSQL的環境中
◆工作表的緩衝得到提升。為了節約了空間,會被反覆執行的執行計畫中的工作表被截短了;現在只有工作表中的前九個頁面才會保留。
◆很多其他類型的臨時對象也被緩衝以提高速度:當在預存程序、函數或者觸發器中使用時,資料表值函式,表變數和局部暫存資料表都會被緩衝。對於某種特定的臨時對象的編目條目不會被立即丟棄,而是緩衝以備將來的重用(一段時間之後,最少使用的對象將從緩衝中清除)。
◆對於tempdb中記錄的一些修改將不再被記錄到日誌中,這樣可以降低tempdb產生的日誌和裝置的I/O流量。INSERT操作只會記錄插入的記錄,DELETE操作只會記錄被刪除的記錄。只有UPDATE操作才會同時記錄原值和更新之後的值。(根據Microsoft的內部資料,在此之前的版本,三種操作都會記錄操作之前的值和操作之後的值)
◆重新設計tempdb的檔案被均衡寫入的方式,減少對系統資源的競爭。均衡寫入意味著每一個tempdb檔案(假設存在多個檔案)會被同時寫入。因此,如果每個物理檔案分散到不同的磁頭上,那麼對這些檔案的寫入可以更加有效率的平行處理。建議你為一個SQL Server在每一個CPU建立一個臨時檔案,並且將每個臨時檔案放在不同的磁頭上。
◆如果一個暫存資料表從tempdb中被丟棄,它會在後台進行處理以降低主機程式的等待時間。實際上,它會被立即處理。
不僅僅是效能,一些變化也影響到了SQL Server 2005的統計收集操作:
◆SQL Server 2005的動態管理檢視(Dynamic Management Views)報告關於tempdb空間使用方式的統計資料,可以通過查詢檢索到這些資料。例如,SELECT SUM (unallocated_extent_page_count)*8 as [Free Space] FROM sys.dm_db_file_space_usage會返回tempdb檔案中以kilobytes計算的自由空間總數。
◆Trace標誌TF-1118(表示分配整個的extents給每個tempdb對象)已經被重新改造,減少資源的競爭。你可以用它作trace檢查而不用擔心對tempdb效能產生影響。
◆兩個新的效能指標,暫存資料表建立率(Temp Tables Creation Rate)和暫存資料表銷毀計數(Temp Tables for Destruction),在SQL Server 2005中出現。它們分別指示每秒鐘建立多少個暫存資料表和多少個暫存資料表在排隊銷毀。
這些變化可以讓程式員對tempdb實際的運行方式有一些洞察,而不是被它表面上的行為所蒙蔽——毫無疑問,一個創新的程式員可以利用這些來寫出更好的、更先進的SQL Server 2005代碼。