CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name 
    ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) 
[ WITH < index_option > [ ,...n] ] 
[ ON filegroup ]
< index_option > :: = 
    { PAD_INDEX | 
        FILLFACTOR = fillfactor | 
        IGNORE_DUP_KEY | 
        DROP_EXISTING | 
    STATISTICS_NORECOMPUTE | 
    SORT_IN_TEMPDB  
}
Examples
A. Use a simple index
This example creates an index on the au_id column of the authors table.
- Код: Выделить всё
- 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. Use a unique clustered index
This example creates an index on the employeeID column of the emp_pay table that enforces uniqueness. This index physically orders the data on disk because the CLUSTERED clause is specified. 
- Код: Выделить всё
- 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. Use a simple composite index
This example creates an index on the orderID and employeeID columns of the order_emp table.
- Код: Выделить всё
- 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. Use the FILLFACTOR option
 This example uses the FILLFACTOR clause set to 100. A FILLFACTOR of 100 fills every page completely and is useful only when you know that index values in the table will never change.
 
 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. Use the IGNORE_DUP_KEY
This example creates a unique clustered index on the emp_pay table. If a duplicate key is entered, the INSERT or UPDATE statement is ignored.
- Код: Выделить всё
- 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. Create an index with PAD_INDEX
This example creates an index on the author's identification number in the authors table. Without the PAD_INDEX clause, SQL Server creates leaf pages that are 10 percent full, but the pages above the leaf level are filled almost completely. With PAD_INDEX, the intermediate pages are also 10 percent full.
Note  At least two entries appear on the index pages of unique clustered indexes when PAD_INDEX is not specified.
- Код: Выделить всё
- 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. Create an index on a view
This example will create a view and an index on that view. Then, two queries are included using the indexed view.
- Код: Выделить всё
- 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
Lasciate ogni speranza, voi ch'entrate.