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