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代碼。