A. 使用簡單索引
下面的示例爲 authors 表的 au_id 列創建索引。
SET
NOCOUNT
OFF
USE
pubs
IF
EXISTS
(
SELECT
name
FROM
sysindexes
WHERE
name
=
'
au_id_ind
'
)
DROP
INDEX
authors.au_id_ind
GO
USE
pubs
CREATE
INDEX
au_id_ind
ON
authors (au_id)
GO
B. 使用唯一聚集索引
下面的示例爲 emp_pay 表的 employeeID 列創建索引,並且強制唯一性。因爲指定了
CLUSTERED
子句,所以該索引將對磁盤上的數據進行物理排序。
SET
NOCOUNT
ON
USE
pubs
IF
EXISTS
(
SELECT
*
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_NAME
=
'
emp_pay
'
)
DROP
TABLE
emp_pay
GO
USE
pubs
IF
EXISTS
(
SELECT
name
FROM
sysindexes
WHERE
name
=
'
employeeID_ind
'
)
DROP
INDEX
emp_pay.employeeID_ind
GO
USE
pubs
GO
CREATE
TABLE
emp_pay
(
employeeID
int
NOT
NULL
,
base_pay
money
NOT
NULL
,
commission
decimal
(
2
,
2
)
NOT
NULL
)
INSERT
emp_pay
VALUES
(
1
,
500
, .
10
)
INSERT
emp_pay
VALUES
(
2
,
1000
, .
05
)
INSERT
emp_pay
VALUES
(
3
,
800
, .
07
)
INSERT
emp_pay
VALUES
(
5
,
1500
, .
03
)
INSERT
emp_pay
VALUES
(
9
,
750
, .
06
)
GO
SET
NOCOUNT
OFF
CREATE
UNIQUE
CLUSTERED
INDEX
employeeID_ind
ON
emp_pay (employeeID)
GO
C. 使用簡單組合索引
下面的示例爲 order_emp 表的 orderID 列和 employeeID 列創建索引。
SET
NOCOUNT
ON
USE
pubs
IF
EXISTS
(
SELECT
*
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_NAME
=
'
order_emp
'
)
DROP
TABLE
order_emp
GO
USE
pubs
IF
EXISTS
(
SELECT
name
FROM
sysindexes
WHERE
name
=
'
emp_order_ind
'
)
DROP
INDEX
order_emp.emp_order_ind
GO
USE
pubs
GO
CREATE
TABLE
order_emp
(
orderID
int
IDENTITY
(
1000
,
1
),
employeeID
int
NOT
NULL
,
orderdate
datetime
NOT
NULL
DEFAULT
GETDATE
(),
orderamount
money
NOT
NULL
)
INSERT
order_emp (employeeID, orderdate, orderamount)
VALUES
(
5
,
'
4/12/98
'
,
315.19
)
INSERT
order_emp (employeeID, orderdate, orderamount)
VALUES
(
5
,
'
5/30/98
'
,
1929.04
)
INSERT
order_emp (employeeID, orderdate, orderamount)
VALUES
(
1
,
'
1/03/98
'
,
2039.82
)
INSERT
order_emp (employeeID, orderdate, orderamount)
VALUES
(
1
,
'
1/22/98
'
,
445.29
)
INSERT
order_emp (employeeID, orderdate, orderamount)
VALUES
(
4
,
'
4/05/98
'
,
689.39
)
INSERT
order_emp (employeeID, orderdate, orderamount)
VALUES
(
7
,
'
3/21/98
'
,
1598.23
)
INSERT
order_emp (employeeID, orderdate, orderamount)
VALUES
(
7
,
'
3/21/98
'
,
445.77
)
INSERT
order_emp (employeeID, orderdate, orderamount)
VALUES
(
7
,
'
3/22/98
'
,
2178.98
)
GO
SET
NOCOUNT
OFF
CREATE
INDEX
emp_order_ind
ON
order_emp (orderID, employeeID)
D. 使用
FILLFACTOR
選項
下面的示例使用
FILLFACTOR
子句,將其設置爲
100
。
FILLFACTOR
爲
100
將完全填滿每一頁,只有確定表中的索引值永遠不會更改時,該選項纔有用。
SET
NOCOUNT
OFF
USE
pubs
IF
EXISTS
(
SELECT
name
FROM
sysindexes
WHERE
name
=
'
zip_ind
'
)
DROP
INDEX
authors.zip_ind
GO
USE
pubs
GO
CREATE
NONCLUSTERED
INDEX
zip_ind
ON
authors (zip)
WITH
FILLFACTOR
=
100
E. 使用 IGNORE_DUP_KEY
下面的示例爲 emp_pay 表創建唯一聚集索引。如果輸入了重複的鍵,將忽略該
INSERT
或
UPDATE
語句。
SET
NOCOUNT
ON
USE
pubs
IF
EXISTS
(
SELECT
*
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_NAME
=
'
emp_pay
'
)
DROP
TABLE
emp_pay
GO
USE
pubs
IF
EXISTS
(
SELECT
name
FROM
sysindexes
WHERE
name
=
'
employeeID_ind
'
)
DROP
INDEX
emp_pay.employeeID_ind
GO
USE
pubs
GO
CREATE
TABLE
emp_pay
(
employeeID
int
NOT
NULL
,
base_pay
money
NOT
NULL
,
commission
decimal
(
2
,
2
)
NOT
NULL
)
INSERT
emp_pay
VALUES
(
1
,
500
, .
10
)
INSERT
emp_pay
VALUES
(
2
,
1000
, .
05
)
INSERT
emp_pay
VALUES
(
3
,
800
, .
07
)
INSERT
emp_pay
VALUES
(
5
,
1500
, .
03
)
INSERT
emp_pay
VALUES
(
9
,
750
, .
06
)
GO
SET
NOCOUNT
OFF
GO
CREATE
UNIQUE
CLUSTERED
INDEX
employeeID_ind
ON
emp_pay(employeeID)
WITH
IGNORE_DUP_KEY
F. 使用 PAD_INDEX 創建索引
下面的示例爲 authors 表中的作者標識號創建索引。沒有 PAD_INDEX 子句,SQL Server 將創建填充
10
%
的葉級頁,但是葉級之上的頁幾乎被完全填滿。使用 PAD_INDEX 時,中間級頁也填滿
10
%
。
說明 如果沒有指定 PAD_INDEX,唯一聚集索引的索引頁上至少會出現兩項。
SET
NOCOUNT
OFF
USE
pubs
IF
EXISTS
(
SELECT
name
FROM
sysindexes
WHERE
name
=
'
au_id_ind
'
)
DROP
INDEX
authors.au_id_ind
GO
USE
pubs
CREATE
INDEX
au_id_ind
ON
authors (au_id)
WITH
PAD_INDEX,
FILLFACTOR
=
10
G. 爲視圖創建索引
下面的示例將創建一個視圖,併爲該視圖創建索引。然後,引入兩個使用該索引視圖的查詢。
USE
Northwind
GO
--
Set the options to support indexed views.
SET
NUMERIC_ROUNDABORT
OFF
GO
SET
ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS
ON
GO
--
Create view.
CREATE
VIEW
V1
WITH
SCHEMABINDING
AS
SELECT
SUM
(UnitPrice
*
Quantity
*
(
1.00
-
Discount))
AS
Revenue, OrderDate, ProductID, COUNT_BIG(
*
)
AS
COUNT
FROM
dbo.
[
Order Details
]
od, dbo.Orders o
WHERE
od.OrderID
=
o.OrderID
GROUP
BY
OrderDate, ProductID
GO
--
Create index on the view.
CREATE
UNIQUE
CLUSTERED
INDEX
IV1
ON
V1 (OrderDate, ProductID)
GO
--
This query will use the above indexed view.
SELECT
SUM
(UnitPrice
*
Quantity
*
(
1.00
-
Discount))
AS
Rev, OrderDate, ProductID
FROM
dbo.
[
Order Details
]
od, dbo.Orders o
WHERE
od.OrderID
=
o.OrderID
AND
ProductID
in
(
2
,
4
,
25
,
13
,
7
,
89
,
22
,
34
)
AND
OrderDate
>=
'
05/01/1998
'
GROUP
BY
OrderDate, ProductID
ORDER
BY
Rev
DESC
--
This query will use the above indexed view.
SELECT
OrderDate,
SUM
(UnitPrice
*
Quantity
*
(
1.00
-
Discount))
AS
Rev
FROM
dbo.
[
Order Details
]
od, dbo.Orders o
WHERE
od.OrderID
=
o.OrderID
AND
DATEPART
(mm,OrderDate)
=
3
AND
DATEPART
(yy,OrderDate)
=
1998
GROUP
BY
OrderDate
ORDER
BY
OrderDate
ASC
--------------索引的使用-------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.