SqlServer2008实例31管理超大型索引之为行的子集做索引

    SQL Server 2008引入了创建筛选非聚集索引的能力,以支持仅请求少量袁行的查询。现在可以使用包含筛选谓词的CREATE INDEX命令通过只对满足特定条件的行进行索引来减少索引大小。减少索引大小节省了磁盘空间,并潜在地提升了查询性能,因为只需要读取一小部分必须处理的索引条目。
    筛选谓词允许使用几个比较运算符,包括IS、IS NOT、=、<>、>、<等。例如,为AdventureWorks数据库中的一个比较大的表Sales .SalesOrderDetail添加筛选索引。假设有一个对UnitPrice列操作的普通查询:

USE AdventureWorks
GO

SELECT SalesOrderID
FROM Sales.SalesOrderDetail
WHERE UnitPrice BETWEEN 150.00 AND 175.00

    然后再假设执行这个查询的人是唯一一个在搜索谓词中使用UnitPrice列的人,并且当他执行这个查询时,只关心$150到$175之间的值。为这个列创建的完整的索引可能会被认为是浪费。如果这个查询经常被执行,并且每次都对基础表实施全聚集索引扫描,这可能会引起性能问题。可以按如下方式创建筛选索引:

USE AdventureWorks
GO

CREATE NONCLUSTERED INDEX NCI_UnitPrice_SalesOrderDetail
ON Sales.SalesOrderDetail (UnitPrice)
WHERE UnitPrice >=1500.00 AND UnitPrice <=175.00

    假定以两个不同的ID查询产品,查询所有订单数量大于10的记录,但是,这不是希望的筛选情景——仅仅是产品ID的筛选:

USE AdventureWorks
GO

SELECT SalesOrderDetailID
FROM Sales.SalesOrderDetail
WHERE ProductID IN(776,777) AND OrderQty > 10

    这个查询实施了聚集索引扫描。可以通过增加筛选索引来提升性能,这样查询就会使用非聚集索引进行索引查找,而不是使用聚集索引扫描。下面是创建筛选索引的方法:
 

USE AdventureWorks
GO 

CREATE NONCLUSTERED INDEX NCI_ProductID_SalesOrderDetail
ON Sales.SalesOrderDetail (ProdcutID,OrderQty)
WHERE ProductID IN(776,777)

 

你可能感兴趣的:(#,SqlServer2008实例)