處理單個 SQL 陳述式是 SQL Server 2005 執行 SQL 陳述式的最基本方法。
1. 最佳化 Select 語句(查詢最佳化工具)
SELECT 語句是非程式性的,它不規定資料庫伺服器檢索請求的資料的確切步驟。這意味著資料庫伺服器必須分析語句,以決定提取所請求資料的最有效方法。這稱之為“最佳化 SELECT 語句”。處理此過程的組件稱為“查詢最佳化工具”,最佳化器的操作主要包括輸入和輸出:輸入包括查詢、資料庫方案(表和索引的定義)以及資料庫統計資訊;輸出稱為“查詢執行計畫”,有時也稱為“查詢計劃”或直接稱為“計劃”。
訪問每個表中的資料一般也有不同的方法。如果只需要有特定索引值的幾行,資料庫伺服器可以使用索引。如果需要表中的所有行,資料庫伺服器則可以忽略索引並執行表掃描。如果需要表中的所有行,而有一個索引的鍵列在 ORDER BY 中,則執行索引掃描而非表掃描可能會省去對結果集的單獨排序。如果表很小,則對該表的幾乎所有訪問來說,表掃描可能都是最有效方法。
從潛在的多個可能的計劃中選擇一個最優執行計畫的過程稱為“最佳化”。查詢最佳化工具是 SQL Server 資料庫系統的最重要組件之一。雖然查詢最佳化工具在分析查詢和選擇計劃時要使用一些開銷,但當查詢最佳化工具選擇了有效執行計畫後,這一開銷將節省數倍。例如,兩家建築公司可能拿到一所住宅的相同設計圖。如果一家公司開始時先花幾天時間規劃如何建造這所住宅,而另一家公司不做任何規劃就開始施工,則花了時間規劃項目的那家公司很可能首先完工。
SQL Server 查詢最佳化工具是基於成本的最佳化器。就所使用的計算資源量而言,每個可能的執行計畫都具有相關成本。查詢最佳化工具必須分析可能的計劃並選擇一個預計成本最低的計劃。有些複雜的 SELECT 語句有成千上萬個可能的執行計畫。在這些情況下,查詢最佳化工具不會分析所有的可能組合,而是使用複雜的演算法尋找一個執行計畫:其成本合理地接近最低可能成本。
SQL Server 查詢最佳化工具不只選擇資源成本最低的執行計畫,還選擇能將結果集最快地返回給使用者且資源成本合理的計劃。例如,與串列處理查詢相比,平行處理查詢使用的資源一般更多但完成查詢的速度更快。因此如果不對伺服器的負荷產生負面影響,SQL Server 最佳化器將使用並存執行計劃返回結果。
查詢最佳化工具在估計從表或索引中提取資訊的不同方法所需的資源成本時,依賴於分發內容統計資訊。對列和索引保留有分發內容統計。這些統計資訊表明特定索引或列中的值的選擇性。例如,在一個代表汽車的表中,很多汽車出自同一製造商,但每輛車都有唯一的車牌號 (VIN)。VIN 索引比製造商索引更具選擇性。如果索引統計資訊不是當前的,則查詢最佳化工具可能無法對錶的目前狀態做出最佳選擇。有關保持索引統計資訊最新的詳細資料,請參閱索引統計資訊。
查詢最佳化工具很重要,因為它可以使資料庫伺服器針對資料庫內的更改情況進行動態調整,而無須程式員或資料庫管理員輸入。這樣程式員可以集中精力描述最終的查詢結果。他們可以相信每次運行語句時,查詢最佳化工具總能針對資料庫的狀態產生一個有效執行計畫。
2.處理 SELECT 語句
SQL Server 處理單個 SELECT 語句的基本步驟包括:
a.分析器掃描 SELECT 語句並將其分成邏輯單元(如關鍵字、運算式、運算子和標識符)。
b.產生查詢樹(有時稱為“序列樹”),以描述將來源資料轉換成結果集需要的格式所用的邏輯步驟。
c.查詢最佳化工具分析訪問源表的不同方法,然後選擇返回結果速度最快且使用資源最少的一系列步驟。更新查詢樹以確切地記錄這些步驟。查詢樹的最終、最佳化的版本稱為“執行計畫”。
d.關聯式引擎開始執行執行計畫。在處理需要基表中資料的步驟時,關聯式引擎請求儲存引擎向上傳遞從關聯式引擎請求的行集中的資料。
e.關聯式引擎將儲存引擎返回的資料處理成為結果集定義的格式,然後將結果集返回用戶端。
3.處理其他語句
上述處理 SELECT 語句的基本步驟也適用於其他 SQL 陳述式,例如 INSERT、UPDATE 和 DELETE。UPDATE 和 DELETE 語句必須把要修改或要刪除的行集作為目標。識別這些行的過程與識別組成 SELECT 語句結果集的源行的過程相同。UPDATE 和 INSERT 語句都可以包含嵌入式 SELECT 語句,以提供要更新或插入的資料值。
即使像 CREATE PROCEDURE 或 ALTER TABLE 這樣的資料定義語言 (Data Definition Language) (DDL) 語句也被最終解析為系統目錄表上的一系列關係操作,而有時則根據資料表解析(如 ALTER TABLE ADD COLUMN)。