2017年10月11日 星期三

規劃、建立與維護索引

規劃、建立與維護索引
「索引」(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’


沒有留言:

用頭腦去思考,不要人云亦云才好, 宗教信徒就是依賴與自私心態(求東求西)的人, 光是這點就很容易暴露弱點了, 難怪seafood吃飽飽,哈哈。 續上, 除了依賴與自私心態(兩者都是人性)之外。 另外也有很大一部份的人,是人云亦云的思考邏輯, 所以宗教才能譁眾取寵。