理解newid()和newsequentialid()

NEWSEQUENTIALID函数相较于NEWID函数能够生成具有规律性的GUID值,这有助于提高基于UNIQUEIDENTIFIER字段建立索引的性能。本文介绍了NEWSEQUENTIALID的使用方法及注意事项。


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](20))

 

insert into #dd(fname)values('dddff')

 

select * from #dd where fid > 'D8407C7D-0E7C-DE11-94B0-001A4DDD5F17' and fid<'E2507993-0E7C-DE11-94B0-001A4DDD5F17'

 

 

但是使用NEWSEQUENTIALID却不是那么一帆风顺
1. 如何获得生成的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


2. 如何设定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    }

 

### 创建新用户或配置 chroot 环境 在 Linux 系统中,创建新用户以及配置 chroot 环境是常见的任务。以下详细说明如何实现这些目标。 #### 创建新用户 使用 `useradd` 或 `adduser` 命令可以轻松创建新用户。例如,创建一个名为 `newuser` 的用户: ```bash sudo useradd -m newuser ``` 上述命令中的 `-m` 参数会为用户创建主目录[^3]。如果需要设置密码,可以使用以下命令: ```bash sudo passwd newuser ``` #### 配置 chroot 环境 chroot 环境的配置涉及创建一个新的根目录并确保该环境中包含所有必要的文件库。以下是具体方法: 1. **创建 chroot 目录** 选择一个目录作为新的根目录,例如 `/chroot/newuser`: ```bash sudo mkdir -p /chroot/newuser ``` 2. **复制必要的文件库** 确保新根目录中包含所需的二进制文件库。例如,复制 `bash` 其依赖库: ```bash sudo cp -a /bin/bash /chroot/newuser/bin/ sudo cp -a /lib/x86_64-linux-gnu/* /chroot/newuser/lib/x86_64-linux-gnu/ ``` 此外,还需要复制关键配置文件,如 `/etc/passwd` `/etc/group`: ```bash sudo cp -a /etc/passwd /chroot/newuser/etc/ sudo cp -a /etc/group /chroot/newuser/etc/ ``` 3. **进入 chroot 环境** 使用 `chroot` 命令切换到新环境,并以指定用户身份运行命令: ```bash sudo chroot /chroot/newuser su - newuser -c "ls /" ``` #### 用户管理与权限控制 为了确保安全性,建议限制用户的权限。可以通过编辑 `/etc/passwd` 文件来指定用户的 shell,例如将用户的 shell 设置为受限 shell `/bin/rbash`[^4]: ```bash newuser:x:1001:1001::/home/newuser:/bin/rbash ``` 此外,还可以通过 `chown` `chmod` 命令调整文件目录的权限,以防止未经授权的访问。 #### 示例脚本 以下是一个完整的示例脚本,用于创建用户并配置 chroot 环境: ```bash #!/bin/bash # 定义变量 CHROOT_DIR="/chroot/newuser" USERNAME="newuser" # 创建用户 sudo useradd -m $USERNAME sudo passwd $USERNAME # 创建 chroot 目录 sudo mkdir -p $CHROOT_DIR # 复制必要文件 sudo cp -a /bin/bash $CHROOT_DIR/bin/ sudo cp -a /lib/x86_64-linux-gnu/* $CHROOT_DIR/lib/x86_64-linux-gnu/ sudo cp -a /etc/passwd $CHROOT_DIR/etc/ sudo cp -a /etc/group $CHROOT_DIR/etc/ # 进入 chroot 环境 sudo chroot $CHROOT_DIR su - $USERNAME -c "ls /" ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值