蝈蝈俊.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

广告

 

在SQL Server 2005 中新增了一个函数:newsequentialid(),MSDN 中对这个函数的描述如下:

在指定计算机上创建大于先前通过该函数生成的任何 GUID 的 GUID。
NEWSEQUENTIALID() 不能在查询中引用。
NEWSEQUENTIALID() 只能与 uniqueidentifier 类型表列上的 DEFAULT 约束一起使用。

这个函数的具体用法在下面这篇博客中已经有详细的描述了。


使用NEWSEQUENTIALID解决GUID聚集索引问题
http://www.cnblogs.com/Mirricle/archive/2007/08/15/856726.html

简单来说,newsequentialid 函数比起 newid 函数最大的好处是:


如果你在一个 UNIQUEIDENTIFIER 字段上建立索引,使用 newid 产生的新的值是不固定的,所以新的值导致索引B+树的变化是随机的。
而 newsequentialid 产生的新的值是有规律的,则索引B+树的变化是有规律的。有规律和无规律就会带来性能的改进。

 

上面是一个粗略的描述,下面是比较详细点的解释:

(我们这里解释的更详细一些,是为了让大家对索引的基础知识了解得更深入些。)

 

B+ 树不考虑层级变化,增加数据的情况分以下几种情况:

The insert algorithm for B+ Trees 

Leaf Page Full

Index Page FULL


                                                  Action
NO NO Place the record in sorted position in the appropriate leaf page
YES NO

1. Split the leaf page
2. Place Middle Key in the index page in sorted order.
3. Left leaf page contains records with keys below the middle key.
4. Right leaf page contains records with keys equal to or greater than the middle key.

YES YES

1. Split the leaf page.
2. Records with keys < middle key go to the left leaf page.
3. Records with keys >= middle key go to the right leaf page.
4. Split the index page.
5. Keys < middle key go to the left index page.
6. Keys > middle key go to the right index page.
7. The middle key goes to the next (higher level) index.

IF the next level index page is full, continue splitting the index pages.

更多 B+ 树的算法请参看后面链接:  http://www.sci.unich.it/~acciaro/bpiutrees.pdf

对于数据库的索引来说,上面情况中,第三种情况发生的概率很低,更多的是 1,2 这两种情况。


数据库中增加记录时,对索引的B+树的操作,其实就是对 左右叶子节点,上级节点的操作。

而找到这几个节点后的操作,在实际上,都不是性能消耗最大的地方。性能消耗最大的地方在于搜索找到需要操作的叶子节点。

 

对于 B+ 树来说, 几层的B+ 树,找到叶子节点就需要找几个数据页。那为何说 Guid 有规律时速度要比无规律时候快呢?

原因很简单:

1、缓存的命中率问题
( 你可以参看我之前写的这篇博客:理解缓存 http://blog.joycode.com/ghj/archive/2007/09/01/107863.aspx )

当每次产生的Guid是有规律时,找到需要操作的叶子节点的几个中间节点,可能已经在之前的访问中被缓存了。

这样,系统不需要大量的读入缓存命中率很低的索引数据页,这样可以节省内存,同时提高搜索速度。

 

2、连续和不连续的磁盘 I/O 操作对性能的影响 

         我们都知道,现在很多业务逻辑的瓶颈是硬盘的速度。而硬盘速度提升的空间仍然不大。下面对硬盘读写操作的一些法则对我们优化跟硬盘I/O有关的方面很有帮助。

   请记住下面的经验法则:标准的 Wide Ultra SCSI-3 硬盘每秒钟可为 Windows 和 SQL Server 提供 75 个不连续(随机)的 I/O 操作和 150 个连续的 I/O 操作。这种硬盘的标称传输率在 40 MB/秒左右。请记住更有可能限制数据库服务器的传输率是每秒钟 75/150 I/O,而不是 40 MB/秒。

         读/写磁头和相关的磁盘取数臂需要移动才能在 SQL Server 和 Windows 所要求的硬盘盘片的位置上进行查找和操作。如果数据所在的硬盘盘片的位置不连续,硬盘驱动器要花多得多的时间才能将磁盘取数臂和读/写磁头移动到所有需要的硬盘盘片位置。如果所需要的数据全部位于硬盘盘片上的连续物理扇区,情况则相反,磁盘取数臂和读/写磁头只需进行很小的移动就能完成所需磁盘 I/O 操作。连续和不连续的情况下所花的时间有很大的差异,每个不连续的数据查找大约要花 50 毫秒,而连续的数据查找则只需大约 2-3 毫秒。请注意这些值是粗略估计出来的,具体值将取决于不连续的数据在磁盘上分布的疏密、硬盘盘片的旋转速度 (RPM) 以及硬盘的其它物理属性。主要要记住的一点是连续 I/O 有益于 SQL Server 性能。

   之前已提到标准的硬盘支持每秒 75 个不连续的 I/O 和每秒 150 个连续的 I/O。还要记住的重要一点是读或写 8KB 的时间与读或写 64 KB的时间几乎相同。在 8 KB 到 64 KB 范围之内,单个磁盘 I/O 传输操作所花的时间主要是磁盘取数臂和读/写磁头运动的时间。因此,从数学上来讲,当需要传输 64 KB 以上的 SQL 数据时,尽可能地执行 64 KB 磁盘传输是有益的,因为 64 KB 传输基本上与 8 KB 传输一样快,而每次传输的 SQL Server 数据是 8 KB 传输的 8 倍。请记住 Read-Ahead Manager 以 64 KB 字节片(也称为 SQL Server 扩展盘区)执行磁盘操作。Log Manager 也以较大的 I/O 传输量来执行连续写操作。要记住的主要事项是充分利用 Read-Ahead Manager,并将 SQL Server 日志文件与其它非连续存取的文件分开,以有效提高 SQL Server 的性能。

 

参考资料:

Using NewSequentialID Instead of NewID
http://www.sqlmag.com/Article/ArticleID/49960/sql_server_49960.html

NEWSEQUENTIALID()
http://technet.microsoft.com/en-us/library/ms189786.aspx

重新组织和重新生成索引
http://technet.microsoft.com/zh-cn/library/ms189858.aspx 

磁盘 I/O 性能
http://windows.chinaitlab.com/skill/9872.html

打印 | 张贴于 2008-01-08 15:07:00 | Tag:数据库开发管理心得

留言反馈

#SQL Server 索引基础知识(6)----索引的代价,使用场景 编辑
前几天给同事培训了聚集索引,非聚集索引的知识后,在一个同事新作的项目中,竟然出现了滥用聚集索引的问题。看来没有培训最最基础的索引的意义,代价,使用场景,是一个非常大的失误。这篇博客就是从这个角度来罗列索引的基础知识
2008-01-19 02:08:00 | [匿名用户:ASP.NET Chinese Blogs]
#回复: SQL Server 索引基础知识(5)----理解newid()和newsequentialid() 编辑
谢谢分享,正是我需要的
2008-01-16 21:11:00 | [匿名用户:ldidici]
#回复: SQL Server 索引基础知识(5)----理解newid()和newsequentialid() 编辑
请问啥叫hot page啊?>>


Luke 怡红公子 说:
简单的说,就是一页太多进程去访问
Luke 怡红公子 说:
不过我估计你们的访问量还到不了那么多
Luke 怡红公子 说:
如果每秒上千个并发,就会有这样的问题
2008-01-16 14:42:00 | [匿名用户:ghj1976]
#SQL Server 索引基础知识(6)----索引的代价,使用场景 编辑
2008-01-16 14:34:00 | [匿名用户:ghj1976]
#回复: SQL Server 索引基础知识(5)----理解newid()和newsequentialid() 编辑
请问啥叫hot page啊?
2008-01-15 15:14:00 | [匿名用户:xx]
#回复: SQL Server 索引基础知识(5)----理解newid()和newsequentialid() 编辑
这个要小心使用,把顺序数据放到一页上可能导致hot page。
2008-01-09 13:10:00 | [匿名用户:怡红公子]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode.MVC引擎 0.5.1.8