tempdb數(shù)據(jù)庫是sql server用于臨時或者開關操作的數(shù)據(jù)庫。對tempdb所做的很多優(yōu)化都是在透明的情況下,讓處理加速,本文就介紹tempdb對sql server 2005的影響以幫助大家利用這些來寫出更好的、更先進的sql server 2005代碼。
sql server 2005版本中的所有變化可以寫成一本書,事實上,已經(jīng)被寫成了好幾本書。其中,最重要的變化不是功能上的變化;這些變化發(fā)生在用戶或者管理員無法立刻感覺到的內部的行為上。這就是說,了解到它們是什么,它們在什么狀況下會表現(xiàn)出來,將會很有用。
這些的隱藏起來的性能提升中最好的一個例子就是tempdb數(shù)據(jù)庫——sql server用于臨時或者開關操作的數(shù)據(jù)庫。對tempdb所做的很多優(yōu)化都是在透明的情況下,讓處理加速:
◆當臨時表被創(chuàng)建的時候,臨時表會被緩存起來加速性能。然而,有一些表明確的不會被緩存:
◆關聯(lián)著顯式ddl的臨時表
◆關聯(lián)著命名的約束的臨時表
◆作為動態(tài)產(chǎn)生的sql語句的一部分的臨時表——例如,存儲過程sp_executesql的環(huán)境中
◆工作表的緩存得到提升。為了節(jié)約了空間,會被反復執(zhí)行的執(zhí)行計劃中的工作表被截短了;現(xiàn)在只有工作表中的前九個頁面才會保留。
◆很多其他類型的臨時對象也被緩存以提高速度:當在存儲過程、函數(shù)或者觸發(fā)器中使用時,表值函數(shù),表變量和局部臨時表都會被緩存。對于某種特定的臨時對象的編目條目不會被立即丟棄,而是緩存以備將來的重用(一段時間之后,最少使用的對象將從緩存中清除)。
◆對于tempdb中記錄的一些修改將不再被記錄到日志中,這樣可以降低tempdb產(chǎn)生的日志和設備的i/o流量。insert操作只會記錄插入的記錄,delete操作只會記錄被刪除的記錄。只有update操作才會同時記錄原值和更新之后的值。(根據(jù)microsoft的內部資料,在此之前的版本,三種操作都會記錄操作之前的值和操作之后的值)
◆重新設計tempdb的文件被均衡寫入的方式,減少對系統(tǒng)資源的競爭。均衡寫入意味著每一個tempdb文件(假設存在多個文件)會被同時寫入。因此,如果每個物理文件分散到不同的磁頭上,那么對這些文件的寫入可以更加有效率的并行處理。建議你為一個sql server在每一個cpu創(chuàng)建一個臨時文件,并且將每個臨時文件放在不同的磁頭上。
◆如果一個臨時表從tempdb中被丟棄,它會在后臺進行處理以降低主機程序的等待時間。實際上,它會被立即處理。
不僅僅是性能,一些變化也影響到了sql server 2005的統(tǒng)計收集操作:
◆sql server 2005的動態(tài)管理視圖(dynamic management views)報告關于tempdb空間使用情況的統(tǒng)計數(shù)據(jù),可以通過查詢檢索到這些數(shù)據(jù)。例如,select sum (unallocated_extent_page_count)*8 as [free space] from sys.dm_db_file_space_usage會返回tempdb文件中以kilobytes計算的自由空間總數(shù)。
◆trace標志tf-1118(表示分配整個的extents給每個tempdb對象)已經(jīng)被重新改造,減少資源的競爭。你可以用它作trace檢查而不用擔心對tempdb性能產(chǎn)生影響。
◆兩個新的性能指標,臨時表新建率(temp tables creation rate)和臨時表銷毀計數(shù)(temp tables for destruction),在sql server 2005中出現(xiàn)。它們分別指示每秒鐘新建多少個臨時表和多少個臨時表在排隊銷毀。
這些變化可以讓程序員對tempdb實際的運行方式有一些洞察,而不是被它表面上的行為所蒙蔽——毫無疑問,一個創(chuàng)新的程序員可以利用這些來寫出更好的、更先進的sql server 2005代碼。
新聞熱點
疑難解答
圖片精選