蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 597, 评论 - 4064, 引用 - 276

导航

关于

这里是我的技术Blog,下一代CSDN社区Blog在 http://blog.csdn.net/ghj1976/

标签

每月存档

最新留言

  • re:学习笔记:7种结构型设计模式简单对比
    <p>最新在家创业系统 ----刚从国外引进,市场巨大。 ----在家可经营所有国家生意,事业规模宏大。 ----不需求人与说服;不用放厚脸皮去推销。 ----极小投资;零风险;成...
    by jackielongteng(注册) on 2009/6/14 13:43:56
  • re:作用域
    <p>☆                    &deg;∵☆       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...
    by jackielongteng(注册) on 2009/6/14 13:03:25
  • re:Html标签嵌套对展示性能的影响
    <p><strong>所有的浏览器都按照你提到的浏览器解析Html规则来解析嘛?</strong></p>
    by Cola(注册) on 2009/6/12 23:07:28
  • re:Html5
    <p>目前来说,HTML5还只是一个梦想,呵呵:)</p>
    by 开心就好(注册) on 2009/6/11 16:31:54
  • re:多线程与SqlConnection.Close
    <p>好服月租型IT服务台,与你共成长! 月租型ITSM软件,注册即可免费体验! 详情请登录官方网站:<a href="http://www.servicezon.co...
    by qzhibo(注册) on 2009/6/3 15:14:21
  • re:多线程Singleton单件模式
    <pre><span style="color: #0000ff;">//Another way public</span> <sp...
    by Yaojian(注册) on 2009/4/22 14:02:35
  • re:Thread.Sleep(0)
    <p>学习了~</p>
    by shuitong888(注册) on 2009/4/8 14:29:24
  • re:Html标签嵌套对展示性能的影响
    <p>DIV固然好 但IE6,7,8 firefox,safari ....做美工的人要累死.</p>
    by ryq1(注册) on 2009/4/3 14:16:25
  • re:用.net 编码实现朗读文本的方法
    <p>我第一次 按键时 能听到声音,但是第二次按键时,没反应。网页一直在 loading.&nbsp;是什么原因?</p>
    by tracytang949(注册) on 2009/3/27 7:01:09
  • re:information_schema.routines与sysobjects
    <p>用sys.procedures多好。</p>
    by luke(注册) on 2009/3/16 16:45:49
  • re:SQL Server 2005 配置发送邮件
    <p>&lt;A href="<a href="http://www.3rt.info">http://www.3rt.info</...
    by ives007(注册) on 2009/2/26 16:47:00
  • re:推荐 Gemini 这个bug管理工具
    <p>你好!首先非常感谢推荐使用Gemini,这段时间在使用Gemini,有些问题想请教以下。</p> <p>1.Create Issue 以后,设置了Visib...
    by CowboyRyan(注册) on 2009/2/20 15:45:08
  • re:推荐 Gemini 这个bug管理工具
    <p>你好!首先非常感谢推荐使用Gemini,这段时间在使用Gemini,有些问题想请教以下。</p> <p>1.Create Issue 以后,设置了Visib...
    by CowboyRyan(注册) on 2009/2/20 15:32:06
  • re:虚机搭配NLB负载平衡时碰到"没有接口可用于安装新的群集"的解决方案
    <p>google newsid</p>
    by iads(注册) on 2009/2/13 17:25:07
  • re:try catch 与线程
    <p>确实是这样的。因为异常机制本质上是堆栈操作,而各线程的堆栈是独立的。</p>
    by st_szr(注册) on 2009/1/21 9:46:05
  • re:try catch 与线程
    <p>没啥啊,线程就是新启动了一个,当然异常不会影响到原有的线程了。</p> <p>你应该在线程里面合适的位置写上自己的捕获代码就行了。</p>
    by laozizhu(注册) on 2009/1/19 16:33:21
  • re:我的2008,征服天堂
    <p>蝈蝈,可惜我帮不了你啊!</p>
    by laozizhu(注册) on 2009/1/19 16:25:45
  • re:try catch 与线程
    <p>呃&hellip;&hellip;是这样的。可怎么处理呢?</p>
    by Anders Liu(注册) on 2009/1/19 11:58:05
  • re:我的2008,征服天堂
    <p>博主是不是去了师部 做了侦查营长呢?</p>
    by huobazi(注册) on 2009/1/9 14:15:33
  • re:我的2008,征服天堂
    <p>@ghj1976:看来真的危机了</p>
    by 开心就好(注册) on 2009/1/9 10:17:37
  • re: 网络带宽的单位
    不过传输的时候,往往还有压缩。
    by luke(匿名) on 2008/12/15 11:00:21
  • re: 网络带宽的单位
    除10不仅仅是为了方便,在传输中,往往加上控制位,所以一个字节往往需要10Bit.
    by 关门放狗(匿名) on 2008/12/13 16:01:30
  • re: 多缓存并存
    对跨进程甚至跨服务器缓存的性能比较怀疑,进程通信和跨服务器通信代价不菲。即使有已有进程外数据可用,如果考虑在进程做份缓存,定期再进程间同步是否更佳?
    by jinglecat(匿名) on 2008/12/12 18:00:05
  • re: 网络带宽的单位
    好像还有一个为了方便换算,厂家使用的是 除10的处理方式的说法:于是100Mb/sec = 100M / 10 = 10M Byte/sec 所以我通常都是用除10而不是除8来做运算的。
    by kentliu(匿名) on 2008/12/11 11:38:55
  • re: 网络带宽的单位
    又不是大S小s
    by luke(匿名) on 2008/12/10 12:04:50

广告

 

       前几天给同事培训了聚集索引,非聚集索引的知识后,在一个同事新作的项目中,竟然出现了滥用聚集索引的问题。看来没有培训最最基础的索引的意义,代价,使用场景,是一个非常大的失误。这篇博客就是从这个角度来罗列索引的基础知识。

 

使用索引的意义

  • 索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。
  • 使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。

使用索引的代价

  • 索引需要占用数据表以外的物理存储空间。
  • 创建索引和维护索引要花费一定的时间。
  • 当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。

创建索引的列

  • 主键
  • 外键或在表联接操作中经常用到的列
  • 在经常查询的字段上最好建立索引

不创建索引的列

  • 很少在查询中被引用
  • 包含较少的惟一值
  • 定义为 text、ntext 或者 image 数据类型的列

 

Heaps是staging data的很好选择,当它没有任何Index时

  • Excellent for high performance data loading (parallel bulk load and parallel index creation after load)
  • Excellent as a partition to a partitioned view or a partitioned table

 

聚集索引提高性能的方法,在前面几篇博客中分别提到过,下面只是一个简单的大纲,细节请参看前面几篇博客。

何时创建聚集索引?

Clustered Index会提高大多数table的性能,尤其是当它满足以下条件时:

  • 独特, 狭窄, 静止: 最重要的条件
  • 持续增长的,最好是只向上增加。例如:
    • Identity
    • Date, identity
    • GUID (only when using newsequentialid() function)

聚集索引唯一性(独特型的问题)

由于聚集索引的B+树结构的叶子节点必须指向具体数据。如果你要建立聚集索引的列不唯一,并且你指定的创建的聚集索引是非唯一的聚集索引,则会有以下情况:
如果未使用 UNIQUE 属性创建聚集索引,数据库引擎 将向表自动添加一个四字节 uniqueifier 列。必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。

参看我的这篇博客:

SQL Server 索引基础知识(4)----主键与聚集索引
http://blog.joycode.com/ghj/archive/2008/01/04/113373.aspx

聚集索引持续向上增长的需求

具体来说下面两个问题要求建立聚集索引的列最好是持续向上增长的

1、缓存的命中率问题。(需要从B+树的结构分析)
2、连续和不连续的磁盘 I/O 操作对性能的影响 。

细节参看我的这篇博客:

SQL Server 索引基础知识(5)----理解newid()和newsequentialid()
http://blog.joycode.com/ghj/archive/2008/01/08/113521.aspx

至于,如果你的数据已经存在重复了,而且是不应该出现的,则可以参看下面这篇KB :

如何删除 SQL Server 表中的重复行
http://support.microsoft.com/kb/139444/zh-cn

 

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

非聚集索引由于B+树的节点不是具体数据页,有时候由于这个原因,会导致非聚集索引甚至不如表遍历来的快,参看我在下面这篇博客中给的例子
http://blog.joycode.com/ghj/archive/2008/01/02/113291.aspx

但是,非聚集索引有个特性,如果你要查询的内容,在非聚集索引中以及被覆盖到了,则不需要继续到聚集索引,或者RID中去寻找数据了,这时候就可以很大的提高性能,这就是 覆盖面(Covering) 的问题。

 

由于聚集索引叶子节点就是具体数据,所以 聚集索引的覆盖率是 100%,

通过提高覆盖面来提高性能的问题也就只有非聚集索引(Nonclustered Indexes)才存在。

当查询中所有的columns 都包括在index上时,我们说这个 index covers the query. Columns的顺序在此不重要

(Select 时候的顺序不重要,但是Index 建立的顺序可得小心了)。

 

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

比如下面的脚本, 虽然我们是对 Title, Revision 建立的非聚集索引,但是这个非聚集索引的叶子节点上还包含 FileName 字段的信息。

USE AdventureWorks;
GO
CREATE INDEX IX_Document_Title      
ON Production.Document (Title, Revision)      
INCLUDE (FileName); 

下面的代码就是测试 Covering 的.
我已经在每个查询使用的方式,逻辑读的个数都标在每个查询前面了。 
SET STATISTICS IO ON
-- Turn Graphical Showplan ON (Ctrl+K)

USE CREDIT
go
-- 逻辑读取144 次    Clustered Index Scan
SELECT m.LastName, m.FirstName, m.Phone_No
FROM dbo.Member AS m WITH (INDEX (0))
WHERE m.LastName LIKE '[S-Z]%'
go

--CREATE INDEX MemberLastName ON Member(LastName)
go
-- 逻辑读取6354 次 BookMark Lookup 
SELECT m.LastName, m.FirstName, m.Phone_No
FROM dbo.Member AS m WITH (INDEX (MemberLastName))
WHERE m.LastName LIKE '[S-Z]%'
go

--CREATE INDEX NCLastNameCombo ON Member(LastName, FirstName, Phone_No)
go
-- 逻辑读取21 次   Index Seek
SELECT m.LastName, m.FirstName, m.Phone_No
FROM dbo.Member AS m
WHERE m.LastName LIKE '[S-Z]%'
go

--CREATE INDEX NCLastNameCombo2 ON Member(FirstName, LastName, Phone_No)
go
-- 逻辑读取59 次     Index Scan
SELECT m.LastName, m.FirstName, m.Phone_No
FROM dbo.Member AS m WITH (INDEX (NCLastNameCombo2))
WHERE m.LastName LIKE '[S-Z]%'
go

-- If you want to clean up the indexes:
--DROP INDEX Member.MemberLastName
--DROP INDEX Member.NCLastNameCombo
--DROP INDEX Member.NCLastNameCombo2
 
 
参考资料

Teched 2007 上 吴家震 主讲的"微软SQL服务器Always-On Tech-nologies: 高级索引策略"  录像下载地址:
http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032364059&Culture=zh-CN
注意, 这个页面标示的是 "SharePoint 2007 网站性能调优" ,但是其实是高级索引策略,微软弄错文件了,害得我一个个下下来看,哪个是需要的录像.

 

打印 | 张贴于 2008-01-16 14:33:00 | Tag:数据库开发管理心得

留言反馈

#回复: SQL Server 索引基础知识(6)----索引的代价,使用场景 编辑
非常不错呀,有点 意思……
2008-01-22 21:53:00 | [匿名用户:gjx3]
#回复: SQL Server 索引基础知识(6)----索引的代价,使用场景 编辑
不错,最喜欢这些基础知识
2008-01-17 10:27:00 | [匿名用户:David Liu ]
#回复: SQL Server 索引基础知识(6)----索引的代价,使用场景 编辑
谢谢分享,正是我需要的
2008-01-16 21:10:00 | [匿名用户:ldidici]
#回复: SQL Server 索引基础知识(6)----索引的代价,使用场景 编辑
一看到计算机基础知识就知道是蝈蝈俊
2008-01-16 19:47:00 | [匿名用户:Nothing]
#回复: SQL Server 索引基础知识(6)----索引的代价,使用场景 编辑
写得不错。。。 支持一下。。。
2008-01-16 15:32:00 | [匿名用户:cw]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode.MVC引擎 0.5.1.8