All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
在SQL Server2005中还原数据库_[SQL Server教程]
发布一个好用的类SafeConvert,,用于值类型装换_.net资料_编程技术
Asp.net下实现隐藏真实下载地址(可以实现简单的防盗链)_[Asp.Net教程]
ASP.NET,AJAX正式版带来的Validator问题及解决方案_[Asp.Net教程]
PHP代码:从数据表里塞选出重复的数据_php资料_编程技术
下一代ADO.NET:ADO.NET,Entity,Framework_[Asp.Net教程]
如何在web.config中建立公用的的数据库连接_[Asp.Net教程]
Visual,Studio,2008,简体中文版,测试版2,下载地址_[Asp.Net教程]
黑客教程系列之微型PHP木马的探讨_php资料_编程技术
SQL,Server,7.0,入门(一)_mssql学习_编程技术
Reading number is top 10 pictures
Rendez-vous Sleep with actress, three days to earn 600000
XuRe xuan cool and refreshing photoes1
乳娘帕梅拉安德森2
接财神,大吉大利,财源滚滚来
新版武松打虎
怀春少女-石一伊
关于海盗的研究2
Kim jong il's mistress, national beauty JinYuJi actor1
中国的阶级现状
Chinese paper-cut grilles art appreciation5
Download software ranking
C#高级编程(第4版)
matrix3
星际争霸1.08硬盘免安装版
VC++6.0培训教程
matrix2
Unix video tutorial4
SP4 for SQL2000
C#程序员参考手册
豪门浪荡史
Jinling thirteen stock
归海一刀 published in(发表于) 2014/2/3 6:35:50 Edit(编辑)
SQL Server 索引基础知识(2)----聚集索引,非聚集索引_[SQL Server教程]

SQL Server 索引基础知识(2)----聚集索引,非聚集索引_[SQL Server教程]

SQL Server 索引基础知识(2)----聚集索引,非聚集索引_[SQL Server教程]


由于需要给同事培训数据库的索引知识,就收集整理了这个系列的博客。发表在这里,也是对索引知识的一个总结回顾吧。通过总结,我发现自己以前很多很模糊的概念都清晰了很多。


不论是 聚集索引,还是非聚集索引,都是用B+树来实现的。我们在了解这两种索引之前,需要先了解B+树。如果你对B树不了解的话,建议参看以下几篇文章:

BTree,B-Tree,B+Tree,B*Tree都是什么
http://blog.csdn.net/manesking/archive/2007/02/09/1505979.aspx


B+ 树的结构图:



B+ 树的特点:



  • 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
  • 不可能在非叶子结点命中;
  • 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

B+ 树中增加一个数据,或者删除一个数据,需要分多种情况处理,比较复杂,这里就不详述这个内容了。


聚集索引(Clustered Index)



  • 聚集索引的叶节点就是实际的数据页
  • 在数据页中数据按照索引顺序存储
  • 行的物理位置和行在索引中的位置是相同的
  • 每个表只能有一个聚集索引
  • 聚集索引的平均大小大约为表大小的5%左右

下面是两副简单描述聚集索引的示意图:

在聚集索引中执行下面语句的的过程:

select * from table where firstName = 'Ota'

在聚集索引中搜索

一个比较抽象点的聚集索引图示:


聚集索引单个分区中的结构


非聚集索引 (Unclustered Index)


  • 非聚集索引的页,不是数据,而是指向数据页的页。
  • 若未指定索引类型,则默认为非聚集索引
  • 叶节点页的次序和表的物理存储次序不同
  • 每个表最多可以有249个非聚集索引
  • 在非聚集索引创建之前创建聚集索引(否则会引发索引重建)

在非聚集索引中执行下面语句的的过程:

select * from employee where lname = 'Green'


一个比较抽象点的非聚集索引图示:


非聚集索引的级别

什么是 Bookmark Lookup

虽然SQL 2005 中已经不在提 Bookmark Lookup 了(换汤不换药),但是我们的很多搜索都是用的这样的搜索过程,如下:
先在非聚集中找,然后再在聚集索引中找。


在 http://www.sqlskills.com/ 提供的一个例子中,就给我们演示了 Bookmark Lookup 比 Table Scan 慢的情况,例子的脚本如下:

USE CREDIT
go
-- These samples use the Credit database. You can download and restore the
-- credit database from here:
-- http://www.sqlskills.com/resources/conferences/CreditBackup80.zip
-- NOTE: This is a SQL Server 2000 backup and MANY examples will work on
-- SQL Server 2000 in addition to SQL Server 2005.
-------------------------------------------------------------------------------
-- (1) Create two tables which are copies of charge:
-------------------------------------------------------------------------------
-- Create the HEAP
SELECT * INTO ChargeHeap FROM Charge
go
-- Create the CL Table
SELECT * INTO ChargeCL FROM Charge
go
CREATE CLUSTERED INDEX ChargeCL_CLInd ON ChargeCL (member_no, charge_no)
go
-------------------------------------------------------------------------------
-- (2) Add the same non-clustered indexes to BOTH of these tables:
-------------------------------------------------------------------------------
-- Create the NC index on the HEAP
CREATE INDEX ChargeHeap_NCInd ON ChargeHeap (Charge_no)
go
-- Create the NC index on the CL Table
CREATE INDEX ChargeCL_NCInd ON ChargeCL (Charge_no)
go
-------------------------------------------------------------------------------
-- (3) Begin to query these tables and see what kind of access and I/O returns
-------------------------------------------------------------------------------
-- Get ready for a bit of analysis:
SET STATISTICS IO ON
-- Turn Graphical Showplan ON (Ctrl+K)
-- First, a point query (also, see how a bookmark lookup looks in 2005)
SELECT * FROM ChargeHeap WHERE Charge_no = 12345
go
SELECT * FROM ChargeCL WHERE Charge_no = 12345
go
-- What if our query is less selective?
-- 1000 is .0625% of our data... (1,600,000 million rows)
SELECT * FROM ChargeHeap WHERE Charge_no < 1000
go
SELECT * FROM ChargeCL WHERE Charge_no < 1000
go
-- What if our query is less selective?
-- 16000 is 1% of our data... (1,600,000 million rows)
SELECT * FROM ChargeHeap WHERE Charge_no < 16000
go
SELECT * FROM ChargeCL WHERE Charge_no < 16000
go
-------------------------------------------------------------------------------
-- (4) What's the EXACT percentage where the bookmark lookup isn't worth it?
-------------------------------------------------------------------------------
-- What happens here: Table Scan or Bookmark lookup?
SELECT * FROM ChargeHeap WHERE Charge_no < 4000
go
SELECT * FROM ChargeCL WHERE Charge_no < 4000
go
-- What happens here: Table Scan or Bookmark lookup?
SELECT * FROM ChargeHeap WHERE Charge_no < 3000
go
SELECT * FROM ChargeCL WHERE Charge_no < 3000
go
-- And - you can narrow it down by trying the middle ground:
-- What happens here: Table Scan or Bookmark lookup?
SELECT * FROM ChargeHeap WHERE Charge_no < 3500
go
SELECT * FROM ChargeCL WHERE Charge_no < 3500
go
-- And again:
SELECT * FROM ChargeHeap WHERE Charge_no < 3250
go
SELECT * FROM ChargeCL WHERE Charge_no < 3250
go
-- And again:
SELECT * FROM ChargeHeap WHERE Charge_no < 3375
go
SELECT * FROM ChargeCL WHERE Charge_no < 3375
go
-- Don't worry, I won't make you go through it all :)
-- For the Heap Table (in THIS case), the cutoff is: 0.21%
SELECT * FROM ChargeHeap WHERE Charge_no < 3383
go
SELECT * FROM ChargeHeap WHERE Charge_no < 3384
go
-- For the Clustered Table (in THIS case), the cut-off is: 0.21%
SELECT * FROM ChargeCL WHERE Charge_no < 3438
SELECT * FROM ChargeCL WHERE Charge_no < 3439
go

这个例子也就是 吴家震 在Teched 2007 上的那个演示例子。

小结:

这篇博客只是简单的用几个图表来介绍索引的实现方法:B+数, 聚集索引,非聚集索引,Bookmark Lookup 的信息而已。

参考资料:

表组织和索引组织
http://technet.microsoft.com/zh-cn/library/ms189051.aspx
http://technet.microsoft.com/en-us/library/ms189051.aspx

How Indexes Work
http://manuals.sybase.com/onlinebooks/group-asarc/asg1200e/aseperf/@Generic__BookTextView/3358


Bookmark Lookup
http://blogs.msdn.com/craigfr/archive/2006/06/30/652639.aspx


Logical and Physical Operators Reference
http://msdn2.microsoft.com/en-us/library/ms191158.aspx







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.