規劃、建立與維護索引
「索引」(INDEX)於關聯式資料庫中最主要的功能有兩項,第一項是確保資料的獨一性,第二項是提昇資料的存取速度。
※準備工作-移轉資料庫
在範例光碟之Ch7目錄中提供一個資料庫IndexTuneDemo,欲移至SQL Server
供使用,將主資料檔IndexTuneDemo_Data.MDF與記錄檔IndexTuneDemo_Data.LDF複製到磁碟目錄C:\Program Files\Microsoft SQL Server\MSSQL\Data\中,然後再執行(在Query
Analyzer工具)下列程式以便附加於SQL Server中:
/* 檔案名稱: BuildIndexTuneDemo.sql */
EXEC sp_attach_db @dbname = N'IndexTuneDemo',
@filename1 = N'C:\Program Files\Microsoft
SQL Server\MSSQL\Data\
IndexTuneDemo_Data.mdf',
@filename2 = N'C:\Program
Files\Microsoft SQL Server\MSSQL\Data\ IndexTuneDemo_Log.ldf'
※索引的基本概念
一個資料表的索引與一本書的索引有點類似。假如目前是在一個極龐大的資料表中作業,所有的資料庫程式在搜尋所需要的某一筆資料記錄時,都將會耗費極長的時間來掃描整個資料表。然如果事先替此資料表編製索引,則程式在搜尋客戶編號時將會非常快速。
一般而言,會將據以建立索引的欄位稱之為「鍵值欄」,而鍵值欄位於索引中的資料則稱之為「鍵值」。
能善用索引(亦即替適當的欄位建立索引),能大幅提昇下列作業的速度:
1.
查詢作業中之WHERE引數的資料篩選
◆
若能事先替欄位EmpID建立索引,將能提昇查詢的速度:
SELECT * FROM employee WHERE EmpID = ‘ATE3902F’
-或-
SELECT * FROM employee WHERE Salary
BETWEEN 60000 AND 70000
-或-
SELECT * FROM employee WHERE Salary >= 60000 AND Salary <=
70000
◆
惟如果於WHERE引數中使用LIKE運算子來要求欄位內容符合特定格式者,則若以萬用字元開頭者將不會使用索引。
SELECT * FROM employee WHERE name
LIKE ‘%仁’
2.
查詢作業中之ORDER BY引數的資料排序
◆
當要求以特定的次序來顯示資料記錄時,若能替排序的基準欄位建立索引,將能提昇其速度。
SELECT name FROM employee ORDER BY name
3.
GROUP BY引數的資料分組
當進行分組加總小計時,若能替分組的基準欄位建立索引,將能提昇其速度。所以若能事先替欄位department建立索引,將能提昇查詢的速度:
SELECT department,avg(salary) FROM employee
GROUP BY department
4.
連結資料表
如果客戶資料存放於資料表Customers,訂單資料存放於資料表Orders,兩者透過CustomerID欄位中的客戶編號來連結,可用下面敘述來查詢出每一位客戶的定單資料:
SELECT * FROM Customers
INNER JOIN Orders
ON Customers.CustomerID
= Orders.CustomerID
上述命令若能替資料表Customers根據CustomerID欄位建立一個索引,並且亦替資料表Orders根據CustomerID欄位建立一個索引,將使得資料表的連結速度大幅提昇。
所以若使用FOREIGN
KEY條件約束替資料表建立關聯性連結,其最主要目的是要確保彼此之間的參考完整性,但是建立關聯性連結並非使用SELECT命令查詢關聯性資料表的必要條件。因此如果欲使用SELECT命令所查詢的多個資料表間並未建立關聯性連結,則可分別於每一個資料表替連結的欄位建立一個索引,以便提昇查詢時的連結速度。
5.
索引能提昇WHERE引數的資料篩選速度,也就是說,索引也能提昇更新與刪除資料記錄的速度,畢竟SQL Server在更新與刪除某一筆資料記錄前,必須先找到它。
下例若能事先替欄位EmpID建立一個索引,將能大幅提昇更新的速度:
UPDATE employee SET name = ‘章立民’ , salary
= 80000
WHERE EmpID = ‘M123456781’
沒有留言:
張貼留言