學習SQL Server 的任務排程

iSQlServer發表於2009-02-03
每個 Microsoft® SQL Server™ 2000 例項都是一個單獨的作業系統程式。每個例項都有可能必須處理來自使用者的成千上萬個併發請求。SQL Server 2000 例項使用 Microsoft Windows® 執行緒(有時是纖程)有效地管理這些併發任務。每個 SQL Server 2000 例項始終為系統程式執行多個執行緒:每個伺服器 Net-Library 的一個或多個執行緒,處理日誌請求的網路執行緒,和與服務控制管理器進行通訊的訊號執行緒。

  每個 SQL Server 例項都有一個內部層,它實現類似於作業系統的環境,用於排程和同步併發任務,而無須呼叫 Windows 核心。這個內部層可以象處理執行緒那樣有效地排程纖程。每個 SQL Server 例項都為使用者連線維護一個執行緒池或纖程池。該池的最大大小由 max worker threads 伺服器配置選項控制。

  伺服器配置 lightweight pooling 選項控制 SQL Server 2000 例項是使用執行緒還是纖程。預設情況下,lightweight pooling 的設定為 0,在該設定下 SQL Server 例項對每個併發使用者命令排程一個執行緒,直到到達 max worker threads 的值。如果 lightweight pooling 的設定為 1,那麼 SQL Server 使用纖程而不是執行緒。這稱為以纖程模式執行。在纖程模式下,SQL Server 例項為每個 CPU 分配一個執行緒,然後為每個併發使用者命令分配一個纖程,最大可以達到 max worker threads 的值。SQL Server 例項在使用執行緒或纖程時使用相同的演算法排程和同步任務。SQL Server 2000 個人版和 SQL Server 2000 Desktop Engine 不支援纖程。

  SQL 批處理是一組一個或多個 Transact-SQL 語句,由客戶端傳送到 SQL Server 例項作為一個單元執行。SQL Server 例項從客戶端收到批處理時,將每個批處理與工作池中的可用執行緒或纖程相關聯。如果沒有可用執行緒或纖程且未達到 max worker threads 的值,SQL Server 例項將給新批處理分配新執行緒或纖程。如果沒有可用執行緒或纖程但已達到 max worker threads 的值,例項將一直阻塞新批處理直到有執行緒可用。執行緒或纖程與批處理相關聯後將一直保持關聯狀態,直到批處理生成的結果集已全部返回給客戶端。這時,執行緒或纖程被釋放,可以排程到下一個可用批處理。

  雖然執行緒和纖程在使用資源方面無足輕重,但它們仍要消耗資源。在有成百上千個使用者連線的系統中,給每個連線分配一個執行緒或纖程所消耗的資源足以降低 SQL Server 的效率。而且沒必要給每個使用者連線分配一個執行緒或纖程,因為大多數連線實際上都花大量時間等待從客戶端接收批處理。SQL Server 例項的工作執行緒池的大小隻需滿足同時在此例項內活動地執行批處理的使用者連線數。保留 max worker threads 的預設值 255 可使 SQL Server 例項有效地將使用者連線對映到許多執行緒或纖程上,這樣不會消耗太多資源。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-545147/,如需轉載,請註明出處,否則將追究法律責任。

相關文章