1. 程式人生 > >SQL Server查詢優化(優化索引和查詢)

SQL Server查詢優化(優化索引和查詢)

現在已經知道了哪些查詢模式需要進行優化,可以著手更具體的查詢優化步驟了。這一步會設計到索引優化和查詢程式碼優化。

SQL Server的資料庫引擎顧問是一種工具。它可對輸入的工作負荷進行分析,在此基礎上為資料庫優化提供建立。沒有聚集索引的表被稱為,擁有聚集索引的表叫聚集索引表(或聚集表)。

索引是一種用於排序和搜尋的結構。在查詢資料庫時,索引可以減少對I/O的消耗。

頁和區

頁是SQL Server儲存資料的基本單元,大小為8KB。它可以包含表,索引,分配點陣圖,可用空間資訊等。頁是SQL Server可以讀寫的最小I/O單元。即使只需訪問一行, SQL Server也要把整個頁載入到快取,再從快取中讀取資料。對於基本資料操作所涉及的查詢,其開銷主要是I/O開銷。

區是由8個物理上連續的頁組成的單元。當表或索引需要更多的空間儲存資料時,SQL Server會為物件分配一個完整的區。對於包含少量資料的物件,有一個例外:如果物件不足64KB,則當需要更多的空間時,SQL Server通常分配一個單獨的頁,而不是整個區。

表的組織方式

表有兩種組織方式:B。從技術上來說,當在表上建立一個聚集索引時,表就組織成一個B樹;否則就組織成一個堆。所以表的組織方式也稱為HOBT(Heap Or B Tree)。無論如何組織,表都可以定義0個或多個非聚集索引,而非聚集索引又會組織成B樹。

(heap)是不含聚集索引的表。它被稱之為堆是由於它儲存的資料不按照任何順序組織,而是按分割槽對資料進行組織。在一個堆中,用於儲存資料之間關係的唯一結構是一個索引分割槽對映(IAM,Index Allocation Map)的點陣圖頁。

聚集索引

SQL Server中所有的索引都組織為B結構,B樹是平衡樹的一種特例。平衡樹的定義是“不存在葉子節點比其他葉子節點到根的距離要遠的多的樹”。它在葉子節點中維護整個表的所有資料。聚集索引不是資料的副本,而是資料本身。

當SQL Server需要對索引的頁層執行無需掃描時,可以使用IAM頁,這種掃描稱為分配順序掃描(allocation order scan)。而按照索引順序完成的掃描稱為索引順序掃描(index order scan)。如果索引的碎片級別較高,則順序掃描要慢得多。

當SQL Server需要導航到位於葉級的特定鍵時,它總是從根頁開始,使用一種稱為索引查詢

(index seek)的訪問方法。這些讀操作的I/O稱為隨機I/O,其讀取次數和索引級別是一樣多的。

堆上的非聚集索引

非聚集索引也結構化為一顆B樹,而且在許多方面都和聚集索引類似。唯一的區別是非聚集索引的葉級行只包含索引鍵和特定的行定位符(row locator)。行定位符它是一個8位元組的物理指標(RID),它由資料庫中檔案號,檔案中的目標頁號,目標頁的行號組成。因此SQL Server必須在查詢操作之後,執行一個RID的查詢操作,對於大量的資料而言,開銷會非常高。

聚集表上的非聚集索引

在聚集表上建立的非聚集索引和在堆上建立的非聚集索引,唯一的區別是:前者的行定位符是一個稱為聚集鍵的值,而不是RID。其原理是指向邏輯的行,而不是物理的行。