WEB开发网
开发学院数据库MSSQL Server 详解SQL Server数据库索引 阅读

详解SQL Server数据库索引

 2008-10-24 10:09:33 来源:WEB开发网   
核心提示: 独特, 狭窄, 持续增长的,最好是只向上增加,详解SQL Server数据库索引(3),例如:•Identity•Date, identity•GUID (only when using newsequentialid() function)2.非聚集索引提高

独特, 狭窄, 持续增长的,最好是只向上增加。例如:

•Identity

•Date, identity

•GUID (only when using newsequentialid() function)

2.非聚集索引提高性能的方法

非聚集索引由于B树的节点不是具体数据页,有时候由于这个原因,会导致非聚集索引甚至不如表遍历来的快。但是,非聚集索引有个特性,如果你要查询的内容,在非聚集索引中以及被覆盖到了,则不需要继续到聚集索引,或者RID(heap结构中的行标识符)中去寻找数据了,这时候就可以很大的提高性能,这就是 覆盖面(Covering) 的问题。

由于聚集索引叶子节点就是具体数据,所以聚集索引的覆盖率是 100%, 通过提高覆盖面来提高性能的问题也就只有非聚集索引(Nonclustered Indexes)才存在。

当查询中所有的columns 都包括在index上时,我们说这个 index covers the query. Columns的顺序在此不重要(Select 时候的顺序不重要,但是Index 建立的顺序可得小心了)。

在 SQL Server 2005 中,为了提高这种 Covering 带来的好处,甚至可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。

补充:只有查询在具有高度选择性的情况下,非聚集索引才有优势。

三、使用聚集索引或非聚集索引的场景 (注:优先级依次为推荐,应,不应)

详解SQL Server数据库索引

四、主键和聚集索引的比较

详解SQL Server数据库索引

以下是一些大众点评网中测试使用的示例:

CHECKPOINT
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
declare @d datetime
set @d=getdate()
SELECT * FROM ASPNet_zSurvey.ZS_User WHERE UserAddDate>'2008-06-01' AND UserAddDate<'2008-06-10'
select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
--(45077 行受影响)
--表'ZS_User'。扫描计数1,逻辑读取1103 次,物理读取2 次,预读1090 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
--2543
CHECKPOINT
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
declare @d datetime
set @d=getdate()
SELECT * FROM ASPNet_zSurvey.ZS_User WITH (INDEX=IX_UserAddDate) WHERE UserAddDate>'2008-06-01' AND UserAddDate<'2008-06-10'
select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
--(45077 行受影响)
--表'ZS_User'。扫描计数1,逻辑读取45165 次,物理读取133 次,预读141 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
--3860

五、使用索引的代价

索引需要占用数据表以外的物理存储空间。

创建索引和维护索引要花费一定的时间。

当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。

上一页  1 2 3 

Tags:详解 SQL Server

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接