SQL體系結(jié)構(gòu)之SQLServer線程管理
對于SQLServer線程管理,可能很多剛剛接觸SQL數(shù)據(jù)庫的新人都比較陌生,下面就為您詳細介紹SQLServer線程管理,希望對您學(xué)習(xí)SQLServer線程管理方面能有所幫助。
復(fù)雜的應(yīng)用具有多個需要同步完成的任務(wù)或處理過程。一個進程具有一個執(zhí)行線程,執(zhí)行應(yīng)用的程序指令。我們將這個執(zhí)行線程簡稱為線程(thread)。SQLServer使用WindowsNT操作系統(tǒng)的線程,有時是SQLServer的纖維(見下面的討論),執(zhí)行并發(fā)任務(wù)(微軟的SQLServer桌面版不支持纖維)。線程由SQLServer啟動,然后WindowsNT在SQLServer可用的多個處理器(CPU)之間平均地分配線程??梢酝ㄟ^企業(yè)管理器,或通過設(shè)置SQLServer的配置參數(shù)affinitymask來配置SQLServer可以使用的處理器的數(shù)量。
大多數(shù)系統(tǒng)通過允許SQLServer使用系統(tǒng)中的所有CPU,工作得***。一個線程一個時間可以在系統(tǒng)的一個CPU上執(zhí)行。例如,具有四個CPU的系統(tǒng)可以并發(fā)執(zhí)行四個線程。當一個線程可能處于等待I/O操作完成的狀態(tài)時,另一個線程可以運行在相同的CPU上,即使在一個單CPU的系統(tǒng)中,也是如此。這樣一來增加了可以執(zhí)行的工作量。線程的管理是由WindowsNT核心代碼維護的。當一個線程移出一個CPU,另一個線程移入CPU時,發(fā)生一次環(huán)境切換(contextswitch)。環(huán)境切換是一個相當耗時的操作,因為它需要在應(yīng)用代碼的用戶模式與SQLServer線程管理代碼的核心模式之間進行切換,因此,設(shè)備環(huán)境切換越少越好。為減少環(huán)境切換,SQLServer具有一個稱為纖維(fibers)的新特性。
纖維是線程的子部件,缺省情況下,SQLServer并不使用纖維,但可以通過配置讓SQLServer使用纖維。纖維由運行在用戶模式的代碼來維護,因此,切換纖維比起切換線程的操作來,并不耗時,因為不需要在核心模式與用戶模式之間改變模式。纖維的調(diào)度表由SQLServer維護,而線程的調(diào)度表由WindowsNT維護;多個纖維可以運行在同一個線程上,并且纖維可以在線程中進行切換,而此時在CPU上執(zhí)行的線程不用切換環(huán)境。這樣大大降低了系統(tǒng)上的環(huán)境切換次數(shù)。如果你的系統(tǒng)執(zhí)行了許多環(huán)境切換,試試以纖維模式運行SQLServer。要這樣做,必須通過企業(yè)管理器選擇該選項,或者運行sp_configure并設(shè)置lightweightpooling(輕型池)參數(shù),它也是一個高級選項。
SQLServer維護線程池以執(zhí)行SQL語句。如果設(shè)置了纖維模式,將維護纖維池而不是線程池。池中的線程或纖維,稱為工作者線程(workerthread)。當在同一時間執(zhí)行多條SQL語句時,工作者線程池允許SQLServer更好地分配CPU的處理時間。也可以使用配置參數(shù)maxworkerthreads(***工作者線程)配置SQLServer可用的工作者線程的數(shù)量,***值為255(可以通過企業(yè)管理器配置,或使用sp_configure存儲過程配置)。
當發(fā)送一條SQL語句或一批語句給SQLServer執(zhí)行時,如果池中存在空閑線程,SQLServer為該語句或批語句分配一個工作者線程;如果沒有現(xiàn)存的空閑線程,并且尚未達到***工作者線程數(shù),SQLServer將為這個處理啟動一個新的線程;如果達到了***線程數(shù),并且沒有空閑線程,處理必須等待另一個批處理完成它的任務(wù)并釋放一個線程,這種等待通常時間不會太長。如果發(fā)現(xiàn)一個已達到***工作者線程限制的SQLServer錯誤,可以嘗試一下增大該參數(shù)值。然而,千萬記住,允許創(chuàng)建過多的線程會導(dǎo)致更多的開銷,最終會降低性能。
【編輯推薦】