View
236
Download
5
Embed Size (px)
Citation preview
叢集索引 & 非叢集索引
Clustered v.s. Non-clustered Clustered
ID Product Price Manufacturer
1023 電冰箱 8700 日立1101 電暖器機 1900 日立1244 電腦 43000 愛買1300 除濕機 1500 大同1632 吹風機 350 鬼屋
叢集索引 & 非叢集索引 CONT.
• Clustered v.s. Non-clustered– Non-Clustered
ID Product Price Manufacturer
1023 電冰箱 8700 日立1101 電暖器機 1900 日立1244 電腦 43000 愛買1632 吹風機 350 鬼屋1300 除濕機 1500 大同
UNIQUE
In Clustered &Non-clustered 唯一索引 (Unique index)
任何兩筆紀錄的索引值不可相同 最常用在 Primary Key 的欄位上 建議同時 NOT NULL
自動設立非索引叢集的唯一索引
CREATE TABLE TABLE_1 ( ProductID smallint NOT NULL, ProductName char(30) UNIQUE, Price smallmoney, Manufacturer char(30) )
PRIMARY KEY DEMO
CREATE TABLE TABLE_2 ( ProductID smallint NOT NULL Primary
Key, ProductName char(30), Price smallmoney, Manufacturer char(30) )
建立索引的注意事項
一個資料表只能有 1 個叢集索引 可組合多個欄位
索引最多使用十六個欄位 總長度需在 900 byte 之內 一個資料表最多 249 個非叢集索引 內容少時不建議使用 primary key 以外的索引,
會浪費時間空間成本 同質性高的欄位不適合成為索引 EX: 性別
建立索引 語法 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)
進階建立索引
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] – 儲存的檔案群組
進階建立索引
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
刪除索引 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
重建索引 DBCC DBREINDEX
(‘DataBaseName.Schema.table_name’,Index_Name, FillFactor)
[WITH NO_INFOMSGS] -- 不顯示訊息
EX:DBCC DBREINDEX ( 客戶 , PK_ 客戶 ,70)
替檢視表建立索引 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 產品日報
索引查詢範例 ---使用主索引查詢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 下單日期