1.:newsequentialid 函数比起 newid 函数最大的好处是:如果你在一个 UNIQUEIDENTIFIER 字段上建立索引,使用 newid 产生的新的值是不固定的,所以新的值导致索引B+树的变化是随机的。而 newsequentialid 产生的新的值是有规律的,则索引B+树的变化是有规律的。有规律和无规律就会带来性能的改进。
2:UNIQUEIDENTIFIER做主键(Primary Key)是一件很方便的事情,在数据合并等操作中有不可替代的优势
但是由于普通的GUID的分散性使得如果主键加上聚集索引(Clustered Index)会导致在插入记录时效率大大降低
SQL SERVER 2005中新增了一个NEWSEQUENTIALID的函数,MSDN的解释是:
在指定计算机上创建大于先前通过该函数生成的任何 GUID 的 GUID。
NEWSEQUENTIALID() 不能在查询中引用。
注:即只能做为数据库列的DEFAULT VALUE,不能执行类似SELECT NEWSEQUENTIALID()的语句
只有当计算机没有网卡时,NEWSEQUENTIALID() 生成的 GUID 才在该特定计算机中是唯一的。
注:这句话是错误的,应该是只有只有当计算机有网卡时,生成的GUID才是全球唯一
您可以使用 NEWSEQUENTIALID() 生成 GUID 以减少叶级别索引上的页争用。
使用例子:
create table #dd
(
fid uniqueidentifier NULL DEFAULT (NEWSEQUENTIALID()),
fname
nvarchar
)
insert into #dd(fname)values(‘dddff’)
select * from #dd where fid > ‘D8407C7D-0E7C-DE11-94B0-001A4DDD5F17’ and fid<‘E2507993-0E7C-DE11-94B0-001A4DDD5F17’
但是使用NEWSEQUENTIALID却不是那么一帆风顺
-
如何获得生成的GUID
如果生成的GUID所在字段做为外键要被其他表使用,我们就需要得到这个生成的值
通常,PK是一个IDENTITY字段,我们可以在INSERT之后执行 SELECT SCOPE_IDENTITY()来获得新生成的ID
但是由于NEWSEQUENTIALID()不是一个INDETITY类型,这个办法是做不到了,而他本身又只能在默认值中使用,不可以事先SELECT好再插入,那么我们如何得到呢?有以下两种方法:
–1. 定义临时表变量
DECLARE @outputTable TABLE(ID uniqueidentifier)
INSERT INTO TABLE1(col1, col2)
OUTPUT INSERTED.ID INTO @outputTable
VALUES(‘value1’, ‘value2’)
SELECT ID FROM @outputTable
–2. 标记ID字段为ROWGUID(一个表只能有一个ROWGUID)
INSERT INTO TABLE1(col1, col2)
VALUES(‘value1’, ‘value2’)
–在这里,ROWGUIDCOL其实相当于一个别名
SELECT ROWGUIDCOL FROM TABLE1
-
如何设定DEFAULT VALUE为NEWSEQUENTIALID()
通过UI的方式设定默认值时,由于SQL SERVER 2005的BUG(即使是SP2也没有解决),导致我们设置了默认值为NEWSEQUENTIALID()保存时会出现以下错误:
Warning were encountered during the pre-save validation process, and might result in a failure during save. Do you want to continue attempting to save?
‘Table1’ Table
-Error validating the default for column ‘Id’
有两种方式可以解决:要么直接点Yes,要么通过CREATE TABLE语句来建表。
通过客户端的方式,也可以通过调用windows api产生sequential的guid,虽说可以省去上面提到的两种麻烦,但是经过我测试,效果不是那么好。
我建立了一个表有ID和TIMESTAMP两个字段,用NEWSEQUENTIALID()和客户端两种方法生成记录,并按ID和TIMESTAMP两种方式进行排序。
NEWSEQUENTIALID()版本的结果永远一样。而客户端生成就有一些问题,如果连续运行程序,表现良好,如果间隔一段时间后继续运行,新生成的记录就不一定大于之前生成的记录,而每次间隔之间连续运行的部分,仍然表现良好。
客户端生成sequential guid代码如下
1 public static class SequentialGuid
2 {
3 [DllImport(“rpcrt4.dll”, SetLastError = true)]
4 static extern int UuidCreateSequential(out Guid guid);
5
6 public static Guid NewGuid()
7 {
8 const int RPC_S_OK = 0;
9
10 Guid guid;
11 int result = UuidCreateSequential(out guid);
12 if (result != RPC_S_OK)
13 {
14 throw new ApplicationException("Create sequential guid failed: " + result);
15 }
16
17 return guid;
18 }
19 }
原文链接:
https://blog.csdn.net/xushichang/article/details/4390957
MSSQL:select top 10 * from [table] order by
new
id
() ACCESS: 代码如下:‘以利用rs.move嘛 ‘如随机取10条 n = 10 ‘先要判断总记录数是否少于10,若小于10,则有多少取多少 if n>10 rs.recordCount then n=rs.recordCount dim ranNum for i = 1 to n Randomize() ranNum = int(rs.recordCount*rnd)+1 ‘产生一个随机数 rs.Move ranNum ‘移动游标到随机数位置 res
SQL Server: 代码如下:Select TOP N * From TABLE Order By
New
ID
() view plaincopy to clipboardprint?Select TOP N * From TABLE Order By
New
ID
()
Select TOP N * From TABLE Order By
New
ID
()
New
ID
()函数将创建一个 unique
id
entifier 类型的唯一值。上面的语句实现效果是从Table中随机读取N条记录。
Access: 代码如下:Select TOP N * From TABLE Order By Rnd(
ID
在SQL Server 2005 中新增了一个函数:
new
sequential
id
(),MSDN 中对这个函数的描述如下:在指定计算机上创建大于先前通过该函数生成的任何
GUID
的
GUID
。
NEW
SEQUENTIAL
ID
() 不能在查询中引用。
NEW
SEQUENTIAL
ID
() 只能与 unique
id
entifier 类型表列上的 DEFAULT 约束一起使用。这个函数的具体用法在下
一、DBLINK性能问题select * from dbsource.dbname.dbo.table where
guid
in (select
guid
from tablechangelogwhere tablename='table ' and
id
<110000)这个运行居然要40秒以上。后来分析了一下1、table和tablechangelog是在不同的服务器上2、在...
NEW
SEQUENTIAL
ID
() 和
NEW
ID
()都可以产生unique
id
entifier类型的,
GUID
.
NEW
ID
()产生的
GUID
是无序的,随机的。
而
NEW
SEQUENTIAL
ID
()是SQL SERVER2005新特性,
NEW
SEQUENTIAL
ID
是基于硬件(一定程度上)生成的
GUID
以十六进制间隔递增.官方的解释?
SQL SERVER 2005中新增了一个
NEW
SEQUENT...
前段时间学习《Microsoft SQL Server 2008技术内幕:T-SQL查询》时,看到里面关于无序
GUID
作为主键与聚集索引的建议,无序
GUID
作为主键以及作为聚集索引所带来的问题包括:
空间的浪费以及由此带来的读写效率的下降。
更主要的,存储的碎片化(fragmentation)以及由此带来的读写效率严重下降。
所以,尽量避免用
GUID
(无序或有序)做主键,不要用无序
GUID
做聚集索引。<摘自博友博客>
想到在工作中存在一个视图转成物理表的时候使用到了此种场景.
因为
NEW
SEQUENTIAL
ID
()只能作为SQL Server中的Default约束使用的话,在表中使用
NEW
SEQUENTIAL
ID
()作为主键的默认值可以解决
new
id
()作为主键时聚集索引的问题。但如果想在程序中创建记录的话,只能用程序自带的生成
GUID
函数,而该函数产生
GUID
并不是按
顺序
产生的。 问题来了,把程序生成的记录插入表中后,岂不是主键又不是
顺序
的了?所以 :需要主从表数据...
又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上。最近还写了一个发邮件的组件以及性能测试请看 《NET开发邮件发送功能的全面教程(含邮件组件源码)》 ,还弄了个MSSQL参数化语法生成器,会在9月整理出来,有兴趣的园友可以关注下我的博客。
分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案。我和我的小伙伴们也讨论了这个主题,我受益匪浅
NEW
ID
()生成随机唯一
GUID
编码
NEW
ID
()在扫描每条记录的时候都生成一个值, 而生成的值是随机的, 没有大小写
顺序
. 所以最终结果再按这个排序, 排序的结果就是无序的。
因为
NEW
ID
()返回的是unique
id
entifier类型的唯一值。
NEW
ID
()每次产生的值都不一样,那么根据这样的值进行排序,每次的结果也是不一样的。
原理是 把所有的
ID
出取然后用随机函数取出其中一个,然后用这个随机取到的
ID
去数据库里再取出记录,所有代价有点大。
随机查询前100条。
select top 100
------------------------------------------------------------------------------------ Blog : http://blog.csdn.net/htl258-- Subject: 介绍SQL2005 引入的按
顺序
生成的全局唯一标识符
NEW
SEQUENTIAL
ID
--------------------
今天给大家分享一下SQLServer中生成
GUID
的用法。一、
NEW
ID
用法
NEW
ID
()作用是生成无
顺序
的
GUID
字符串。用法如下:SELECT
NEW
ID
() --生成36位的GUI...