SQLSERVER如何使用递增排序的GUID做主键
场景:
产品表数据量较大想用Guid做表的主键,并在此字段上建立聚簇索引。 因为Guid是随机生成的,生成的值大小是不确定的,每次生成的数可能很大,也可能很小。这样会影响插入的效率
1.NEWSEQUENTIALID和newid()的区别
NEWSEQUENTIALID() 和 NEWID()都可以产生uniqueidentifier类型的,GUID.NEWID()产生的GUID是无序的,随机的。
而NEWSEQUENTIALID()是SQL SERVER2005新特性,NEWSEQUENTIALID是基于硬件(一定程度上)生成的GUID以十六进制间隔递增.
官方的解释?
SQL SERVER 2005中新增了一个NEWSEQUENTIALID的函数,MSDN的解释是:
在指定计算机上创建大于先前通过该函数生成的任何 GUID 的 GUID。
NEWSEQUENTIALID() 不能在查询中引用,不能执行类似SELECT NEWSEQUENTIALID()的语句;
它只能与 uniqueidentifier 类型表列上的 DEFAULT 约束一起使用。
只有当计算机没有网卡时,NEWSEQUENTIALID() 生成的 GUID 才在该特定计算机中是唯一的,反之只有当计算机有网卡时,生成的GUID才是全球唯一。
差异性?
1.newsequentialid 函数比起 newid 函数最大的好处是:如果你在一个 UNIQUEIDENTIFIER 字段上建立索引,使用
newid 产生的新的值是不固定的,所以新的值导致索引B+树的变化是随机的。而 newsequentialid
产生的新的值是有规律的,则索引B+树的变化是有规律的,以减少叶级别索引上的页争用。有规律和无规律就会带来性能的改进。
2.UNIQUEIDENTIFIER做主键(Primary Key)是一件很方便的事情,在数据合并等操作中有不可替代的优势
但是由于普通的GUID的分散性使得如果主键加上聚集索引(Clustered Index)会导致在插入记录时效率大大降低
原因很简单:
1、缓存的命中率问题
你可以参看我之前写的这篇文章:理解缓存 http://database.ctocio.com.cn/tips/219/7791219.shtml
当每次产生的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 的性能。
SQLSERVER如何使用递增排序的GUID做主键的更多相关文章
- GUID做主键真的合适吗
在一个分布式环境中,我们习惯使用GUID做主键,来保证全局唯一,然后,GUID做主键真的合适吗? 其实GUID做主键本身没有问题,微软的很多项目自带DB都是使用GUID做主键的,显然,这样做是没有问题 ...
- 使用Guid做主键和int做主键性能比较
使用Guid做主键和int做主键性能比较 在数据库的设计中我们常常用Guid或int来做主键,根据所学的知识一直感觉int做主键效率要高,但没有做仔细的测试无法 说明道理.碰巧今天在数据库的优化过程中 ...
- int 和guid做主键的时候性能的区别
1.在经常需要做数据迁移的系统中,建议用Guid.并且在相应的外键字段,也就是用来做连接查询的字段添加非聚集索引,对于改善性能有极大的好处.where条件的字段也可以适当添加非聚集索引. 2.在使用G ...
- SQL GUID和自增列做主键的优缺点
我们公司的数据库全部是使用GUID做主键的,很多人习惯使用int做主键.所以呢,这里总结一下,将两种数据类型做主键进行一个比较. 使用INT做主键的优点: 1.需要很小的数据存储空间,仅仅需要4 by ...
- Guid和Sequence做主键的比较
记得A项目组是一个物流管理系统,后台采用了Oracle数据库.在系统中的核心表托运单表中,关于主键采用何种数据类型,是 sequence 还是用GUID , 大家起了争论. 从网络搜索得到的结论看,一 ...
- 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...
- 【C语言】求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素
//求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素 #include <stdio.h> #include <string.h> int find_mi ...
- 【c语言】输入一个递增排序的数组的一个旋转,输出旋转数组中的最小元素
//旋转数组的最小数字 //题目:把一个数组最開始的若干个元素搬到数组的末尾.我们称之为数组的旋转. //输入一个递增排序的数组的一个旋转.输出旋转数组中的最小元素. //比如:数组{3.4,5,1, ...
- 开发反模式(GUID) - 伪键洁癖
一.目标:整理数据 有的人有强迫症,他们会为一系列数据的断档而抓狂. 一方面,Id为3这一行确实发生过一些事情,为什么这个查询不返回Id为3的这一行?这条记录数据丢失了吗?那个Column到底是什么? ...
随机推荐
- 常用MySQL图形化管理工具
MySQL的管理维护工具非常多,除了系统自带的命令行管理工具之外,还有许多其他的图形化管理工具,这里我介绍几个经常使用的MySQL图形化管理工具,供大家参考. MySQL是一个非常流行的小型关系型数据 ...
- 自定义制作iso镜像
下载"/etc/yum.repos.d/"下的MondoRescue软件库,文件名为"mondorescue.repo".请为你的Linux OS发行版本下载正 ...
- fopen函数和fread函数、fwrite函数
fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const ...
- [No000093]按住Alt 再按数字键敲出任意汉字和字符!
1.在notepad里,(中文系统下) 按住Alt 然后按52946最后放开Alt 按住Alt 然后按45230最后放开Alt 按住Alt 然后按50403最后放开Alt 你会看到"我爱你& ...
- Vue.js的入门
介绍 vue.js 是一个客户端js库,可以用来开发单页应用.为了一个项目的选型,我前前后后的看了angular.react.vuejs ,对前两者是佩服,对后者是爱.因为它简洁干净利索,并且还有高大 ...
- js变量问题
this指向问题,谁调用它,它就指谁!!! 1.var foo = 1; function bar() { foo = 10; return; function foo() {} } bar(); a ...
- [LeetCode] 4Sum II 四数之和之二
Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...
- [LeetCode] Word Break 拆分词句
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- 【WPF】 Timer与 dispatcherTimer 在wpf中你应该用哪个?
源:Roboby 1.timer或重复生成timer事件,dispatchertimer是集成到队列中的一个时钟.2.dispatchertimer更适合在wpf中访问UI线程上的元素 3.Dispa ...
- git详解
Git使用教程 source: http://www.cnblogs.com/tugenhua0707/p/4050072.html 一:Git是什么? Git是目前世界上最先进的分布式版本控制系 ...