Index- 善用索引

23
INDEX- 善善善善

description

Index- 善用索引. EX: 圖書館的索書編號 索引的結構 LIKE Balance Tree. What is “Index”. Clustered v.s . Non-clustered Clustered. 叢集索引 & 非叢集索引. 叢集索引 & 非叢集索引 cont. Clustered v.s . Non-clustered Non-Clustered. In Clustered &Non-clustered 唯一索引 (Unique index) 任何兩筆紀錄的索引值不可相同 最常用 在 Primary Key 的欄位上 - PowerPoint PPT Presentation

Transcript of Index- 善用索引

Page 1: Index-  善用索引

INDEX- 善用索引

Page 2: Index-  善用索引

WHAT IS “INDEX” EX: 圖書館的索書編號 索引的結構

LIKE Balance Tree

Page 3: Index-  善用索引

叢集索引 & 非叢集索引 Clustered v.s. Non-clustered

ClusteredID Product Price Manufact

urer1023 電冰箱 8700 日立1101 電暖器機 1900 日立1244 電腦 43000 愛買1300 除濕機 1500 大同1632 吹風機 350 鬼屋

Page 4: Index-  善用索引

叢集索引 & 非叢集索引 CONT.

• Clustered v.s. Non-clustered– Non-Clustered

ID Product Price Manufacturer

1023 電冰箱 8700 日立1101 電暖器機 1900 日立1244 電腦 43000 愛買1632 吹風機 350 鬼屋1300 除濕機 1500 大同

Page 5: Index-  善用索引

UNIQUE In Clustered &Non-clustered 唯一索引 (Unique index)

任何兩筆紀錄的索引值不可相同 最常用在 Primary Key 的欄位上 建議同時 NOT NULL

Page 6: Index-  善用索引

COMPOSITE 兩個或多個欄位組合成為索引

(Composite index) 若同時是唯一索引,則不可重複的是 ?

Page 7: Index-  善用索引

自動設立非索引叢集的唯一索引 CREATE TABLE TABLE_1 ( ProductID smallint NOT NULL, ProductName char(30) UNIQUE, Price smallmoney, Manufacturer char(30) )

Page 8: Index-  善用索引

屬性表 包含的資料行

包含索引外的其他欄位 忽略重複的索引欄位

無論是否都拒絕重複值 重新計算統計資料

索引變動時是否自動更新 索引頁預留空間 填滿因數

末節點所使用的空間百分比

Page 9: Index-  善用索引

PRIMARY KEY DEMOCREATE TABLE TABLE_2 ( ProductID smallint NOT NULL Primary

Key, ProductName char(30), Price smallmoney, Manufacturer char(30) )

Page 10: Index-  善用索引

建立索引的注意事項 一個資料表只能有 1 個叢集索引

可組合多個欄位 索引最多使用十六個欄位 總長度需在 900 byte 之內 一個資料表最多 249 個非叢集索引 內容少時不建議使用 primary key 以外的索引,會浪費時間空間成本 同質性高的欄位不適合成為索引 EX: 性別

Page 11: Index-  善用索引

建立索引 語法 CREATE INDEX Index_name ON table_name (column1,…..)

Page 12: Index-  善用索引

建立索引 語法 CREATE TABLE TABLE_3 ( c1 int NOT NULL Primary key, c2 char(4), c3 char(6), c4 char(30) ) --------------------------------- CREATE INDEX MyIndex_1 ON Table_3 (c1) CREATE INDEX MyIndex_2 ON Table_3 (c2, c3)

Page 13: Index-  善用索引

進階建立索引CREATE [Unique] -- 指定唯一[CLUSTERED| NONCLUSTERED] -- 叢集與否INDEX Index_nameON table_name (column1[ASC|DESC][,….. n]) -- 指定升降冪[Include(column[…,n])] -- 將其他資料行包含於此索引內[WITH [PAD_INDEX] -- 索引頁面預留空間[,FillFactor = x] – 填滿因數[,Ignore_DUP_Key] – 忽略重複值[,Drop_Existing] – 忽略現成的索引[,Statistics_NoRecompute] -- 不重新計算統計值[ON FileGroup] – 儲存的檔案群組

Page 14: Index-  善用索引

進階建立索引CREATE TABLE TABLE_4 ( ProductID smallint NOT NULL Primary Key, ProductName char(30), Price smallmoney, Manufacturer char(30) )

CREATE UNIQUE NONCLUSTERED INDEX index_3 ON TABLE_4 (ProductName) INCLUDE (price) WITH PAD_INDEX, FILLFACTOR=30, IGNORE_DUP_KEY

EXEC sp_helpindex table_4

Page 15: Index-  善用索引

刪除索引 DROP INDEX Table_Name.index_name

DROP INDEX Table_4.index_3

Page 16: Index-  善用索引

刪除索引 CONT. CREATE TABLE MyTable ( ProductID smallint NOT NULL Primary key, ProductName char(30) UNIQUE, Price smallmoney, Manufacturer char(30) )

EXEC sp_helpindex MyTable

---A

DROP INDEX MyTable.PK__MyTable__7D439ABD DROP INDEX MyTable.UQ__MyTable__7E37BEF6

--- B

ALTER TABLE MyTable DROP CONSTRAINT PK__MyTable__7D439ABD ALTER TABLE MyTable DROP CONSTRAINT UQ__MyTable__7E37BEF6

Page 17: Index-  善用索引

修改或重建索引 DROP_EXISTING => 代替原來已存在的索引 ( 建議使用 )

維持原來索引的名稱,針對要改的細項做更改即可

Page 18: Index-  善用索引

重建索引 DBCC DBREINDEX

(‘DataBaseName.Schema.table_name’,Index_Name, FillFactor)

[WITH NO_INFOMSGS] -- 不顯示訊息

EX:DBCC DBREINDEX ( 客戶 , PK_ 客戶 ,70)

Page 19: Index-  善用索引

替檢視表建立索引 SET ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS ON SET NUMERIC_ROUNDABORT OFF GO

CREATE VIEW dbo.產品日報 WITH SCHEMABINDING AS SELECT 下單日期 AS 日期, 書籍編號 AS 書號, SUM (數量) AS 每日銷售量 , COUNT_BIG (*) AS 每日訂單數 FROM dbo.訂單 INNER JOIN dbo.訂購項目 ON 訂單.訂單編號 = 訂購項目.訂單編號 GROUP BY 下單日期 , 書籍編號 GO

SELECT * FROM 產品日報

Page 20: Index-  善用索引

替檢視表建立唯一性叢集索引 CREATE UNIQUE CLUSTERED INDEX PK_產品日報 ON 產品日報 ( 日期 , 書號 )

Page 21: Index-  善用索引

建立非叢集索引 CREATE INDEX IX_ 書號 ON 產品日報 ( 書號 ) INCLUDE ( 日期 , 每日銷售量 )

Page 22: Index-  善用索引

索引查詢範例 ---使用主索引查詢SELECT 日期 , 書號 , 每日銷售量 , 每日訂單數 FROM 產品日報WHERE 日期 = '2005/9/11' ORDER BY 日期 ---直接在VIEW以書號抓資料SELECT 日期 , 書號 , 每日銷售量FROM 產品日報WHERE 書號 = 2

---直接在VIEW以PK去抓資料SELECT 下單日期 , SUM(數量) AS 銷售量 FROM 訂單 INNER JOIN 訂購項目ON 訂單 .訂單編號 = 訂購項目 .訂單編號GROUP BY 下單日期 , 書籍編號ORDER BY 下單日期

Page 23: Index-  善用索引

刪除檢視表的索引 當刪除了檢視表中的主索引時,所有的非叢集索引會一併刪除 !