為了縮小讀取操作所涉及范圍,本文首先著眼于簡單的SELECT查詢,然后引入執行更新操作有關的附加過程。最后你會讀到,優化性能時SQLServer使用還原工具的相關術語和流程。
如圖所示,SQL Server被分為2個主要引擎:關系引擎和存儲引擎。關系引擎有時也被稱為查詢處理器,因為它的主要功能是查詢優化和執行。它包含檢查查詢語法和準備查詢樹的命令解析器;查詢優化器毫無疑問是任何數據庫系統中皇冠上的寶石;查詢執行器對執行(查詢計劃)負責。
存儲引擎對所有數據輸入、輸出管理負責。它包含用來處理行、索引、頁、分配和行版本等修改的輸入、輸出請求的存取方法;緩存區管理器,與SQL Server主要內存用戶緩沖池打交道。它還包含處理用來維持一致性(ACID)的數據鎖和管理事務日志的事務管理器。
緩沖池在進入查詢生命周期之前你需要知道的其它主要組件是緩沖池,在SQL Server中是最大的內存用戶。緩沖池里包含SQL Server中的所有不同緩存,包括計劃緩存和數據緩存,計劃緩存會接在透過它生命周期的查詢后的章節談到。
一個簡單的SELECT查詢在這個例子中,使用的查詢細節不重要——沒有join的簡單SELECT語句,因為你只是發起一起簡單的讀取請求。從客戶端開始,那里你首先接觸的組件是SQL Server網絡接口(SNI)。
SQL Server網絡接口(SNI)SQL Server網絡接口(SNI)是建立客戶端和服務器端網絡連接的協議層。它由數據庫引擎和SQL Server本地客戶(SQL Server Native Client:SNAC)都用到的一系列API組成。SNI代表在SQL Server 2000里建立的網絡庫和包含在操作系統里的微軟數據訪問組件(Microsoft Data access Components:MDAC)。
SNI不是被直接配置的;你要配置在客戶端和服務器端的網絡協議。SQL Server支持下列協議:
使用命名管道(Named Pipes)首先需要在為SQL Server配置管理器(SQL Server Configuration Manager)使它生效(如果你要遠程連接的話),然后創建一個使用命名管道(Named Pipes)作為協議連接到服務器的SQL Server別名。
命名管道(Named Pipes)使用TCP 445端口,在2個電腦間的任何防火墻里請確保這個端口被打開,包括Windows防火墻。
與命名管道(Named Pipes)一樣,使用VIA協議首先需要在為SQL Server配置管理器(SQL Server Configuration Manager)使它生效,然后創建一個使用虛擬接口適配器(Virtual Interface Adapter:VIA)作為協議連接到服務器的SQL Server別名.雖然SQL Server 2012還支持VIA協議,從以后的版本開始它會被移除,因為新安裝時需要避免這個協議被安裝。
不管使用哪種協議,一旦連接被建立,SQL Server網絡接口(SNI)在服務器上與表格數據流(TDS)終結點(下面會介紹)創建一個完全連接,用它來發送請求和接收數據。這里追隨透過它生命周期的查詢的目的是,你發送SELECT語句且在等待接收結果集。
表格數據流終結點(Tabular Data Stream(TDS) Endpoints)TDS是微軟所有最先由Sybase設計用來與數據庫服務器交互的協議。使用例如TCP/IP的網絡協議一旦連接被接通,與相關TDS終結點的聯系會被創建,它在客戶端與服務器端之間擔當著通信點。
每個網絡協議都有一個TDS終結點,并且還有一個會被專用網絡連接(dedicated administrator connection:DAC)使用。一旦連通性被創建,TDS消息會被用做客戶端與服務器端間的溝通。
SELECT語句是穿過TCP/IP協議(TCP/IP是默認協議)作為TDS消息發送給SQL Server。
協議層(PRotocal Layer)當SQL Server中的協議層(Protocal Layer)收到你的TDS包,它會倒轉SQL Server網絡接口(SNI)的工作,把包拆開找出里面包含的請求是什么。協議層(Protocal Layer)同樣對把結果和狀態消息打包并作為TDS消息發回給客戶端負責。
我們的SELECT語句在TDS包里標記為”SQL命令“類型的消息,因為它傳給下一個組件,命令分析器(Command Parser),開始走向執行的道路。
上圖顯示了我們的查詢現在到哪里了。在客戶端,語句被SQL Server網絡接口(SNI)打包在TDS包里并發送給SQL Server中的協議層(Protocal Layer),在那里被拆包,識別為SQL命令,這個代碼被SQL Server網絡接口(SNI)發送給命令解析器(Command Parser)。
命令分析器(Command Parser)命令分析器(Comamnd Parser)的角色是處理T-SQL語言事件(language events)。它首先檢查語法并通過協議層(protocol layer)返回給客戶端任何語法錯誤。如果語法是有效的,然后下一步就是生成查詢計劃(query plan)或查找已存在的計劃。查詢計劃(query plan)包含SQL Server將如何去執行這段代碼的細節。它通常被稱為執行計劃(execution plan)。
為了檢查查詢計劃(query plan),命令分析器(Comamnd Parser)會生成T-SQL的散列(hash)并核對計劃緩存(plan cache)來決定是否有合適的計劃已經存在。計劃緩存(plan cache)是在緩沖池(buffer pool)里用來緩存查詢計劃(query plan)的區域。如果找到匹配的,從緩存里這個計劃會被讀取并傳給查詢執行器(Query Executor)去執行。(下一篇將介紹如果沒有找到匹配會發生什么。)
新聞熱點
疑難解答