SQL Server使用索引实现数据访问优化
2009-06-09 10:31:41 来源:WEB开发网SELECTSalesDate,SalesPersonIDFROMSalesWHEREProductID=112
首先让我们弄明白在数据库引擎怎么执行SQL语句的:
1.Sales表有在ProductID列一个非聚焦索引,所以,首先查询非聚焦索引树,发现包含ProductID=112的入口。
2.包含ProductID=112入口的索引页同样同样也包含了聚焦索引的值(所有的主健的值,即SalesID)
3.对于每一个主健(共400个),数据库引擎进入聚焦索引树来发现正确的行的位置
4.对于每一个主健,一旦发现正确的行的位置,数据库引擎会从匹配的行得到SalesDate和SalesPersonID的列的值。
请注意,在上述的步骤中,对于每一个ProductID=112的主键入口(共400个),数据库引擎必须搜索聚焦索引树400次,来检索附加的列(SalesDate,SalesPersonID)。
让我们猜想一下,如果非聚焦索引不但包含了聚焦索引的值(主健),同时还包含查询里标注的其他的2个列(SalesDate,SalesPersonID)的值,数据库引擎就不用执行上述的第3步和第4步,只须进入ProductID的列的非聚焦索引树,从索引页上读取3个列的值,这样运行的速度不是更快吗?
幸运的是,有一种办法来实施这种特点,这就是复合索引。你可以在表的列上创建复合索引,标明哪些列是和聚焦索引一起的应该附加存储的列。下面是一个在表Sales表的列ProductID创建复合索引的例子。
CREATEINDEXNCLIX_Sales_ProductID--Indexname
ONdbo.Sales(ProductID)--Columnonwhichindexistobecreated
INCLUDE(SalesDate,SalesPersonID)--Additionalcolumnvaluestoinclude
请注意,创建复合索引应当包含少数几个列,并且这些列经常在select查询里使用。在复合索引里包含太多的列不仅不会给你带来太多好处。而且由于使用相当多的内存来存储复合索引的列的值,其后果是内存溢出和性能降低。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››使用linux中的quota教程
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››使用jxl生成带动态折线图的excel
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
更多精彩
赞助商链接