[O]SQL SERVER下有序GUID和无序GUID作为主键&聚集索引的性能表现

一、插入无序GUID数据

 1 --创建表并插入无序GUID数据
 2 --DROP TABLE T_PROORDERTYPEGUIDTEST;
 3 create table T_PROORDERTYPEGUIDTEST (
 4    FENTRYID             varchar(36)          not null default ‘ ‘,
 5    FPROORDERENTRYID     int                  not null default 0,
 6    FPROORDERTYPE        varchar(20)          not null default ‘ ‘,
 7    FFORMID              varchar(36)          not null default ‘ ‘,
 8    FNUMBER              nvarchar(160)        not null default ‘ ‘,
 9    FCREATEORGID         int                  not null default 0,
10    FUSEORGID            int                  not null default 0,
11    FDOCUMENTSTATUS      char(1)              not null default ‘C‘,
12    FFORBIDSTATUS        char(1)              not null default ‘A‘,
13    FDATE                datetime             not null default getdate(),
14    FMATERIALID          int                  not null default 0,
15    FBOMID               int                  not null default 0,
16    FAUXPROPID           int                  not null default 0,
17    FLOT                 int                  not null default 0,
18    FMtoNo               nvarchar(200)        not null default ‘‘,
19    FSEQ                 int                  not null default 0,
20    FUNITID              int                  not null default 0,
21    FPRODUCTID           int                  not null default 0,
22    FWORKSHOPID          int                  not null default 0,
23    FCOSTCENTERID        int                  not null default 0,
24    constraint PK_PROORDERTYPE primary key (FENTRYID)
25 )
26 --插入500000条数据
27 declare @i int
28 set @i = 1
29 while @i < 500000
30 begin
31 INSERT INTO T_PROORDERTYPEGUIDTEST(FENTRYID,FPROORDERENTRYID,FPROORDERTYPE,FFORMID,FNUMBER,FCREATEORGID,
32 FUSEORGID,FDOCUMENTSTATUS,FFORBIDSTATUS,FDATE,FMATERIALID,FBOMID,FAUXPROPID,FLOT,
33 FSEQ,FUNITID,FPRODUCTID,FWORKSHOPID,FCOSTCENTERID) values
34 (NEWID(),@i,‘PO‘,‘FORM_OUTSRCPROORDER‘,‘TEST00001‘,@i,@i,‘C‘,‘A‘,GETDATE(),@i,@i,@i,@i,@i,@i,@i,@i,@i)
35 SET @i=@i+1
36 end ;
37
38 select COUNT(1) from T_PROORDERTYPEGUIDTEST

二、插入有序GUID数据

 1 --创建表并插入有序GUID数据
 2 DROP TABLE T_PROORDERTYPESEQGUIDTEST;
 3 create table T_PROORDERTYPESEQGUIDTEST (
 4    FENTRYID             uniqueidentifier     not null default (NEWSEQUENTIALID()),
 5    FPROORDERENTRYID     int                  not null default 0,
 6    FPROORDERTYPE        varchar(20)          not null default ‘ ‘,
 7    FFORMID              varchar(36)          not null default ‘ ‘,
 8    FNUMBER              nvarchar(160)        not null default ‘ ‘,
 9    FCREATEORGID         int                  not null default 0,
10    FUSEORGID            int                  not null default 0,
11    FDOCUMENTSTATUS      char(1)              not null default ‘C‘,
12    FFORBIDSTATUS        char(1)              not null default ‘A‘,
13    FDATE                datetime             not null default getdate(),
14    FMATERIALID          int                  not null default 0,
15    FBOMID               int                  not null default 0,
16    FAUXPROPID           int                  not null default 0,
17    FLOT                 int                  not null default 0,
18    FMtoNo               nvarchar(200)        not null default ‘‘,
19    FSEQ                 int                  not null default 0,
20    FUNITID              int                  not null default 0,
21    FPRODUCTID           int                  not null default 0,
22    FWORKSHOPID          int                  not null default 0,
23    FCOSTCENTERID        int                  not null default 0,
24    constraint PK_SEQPROORDERTYPE primary key (FENTRYID)
25 )
26 --插入500000条数据
27 declare @i int
28 set @i = 1
29 while @i < 500000
30 begin
31 INSERT INTO T_PROORDERTYPESEQGUIDTEST(FPROORDERENTRYID,FPROORDERTYPE,FFORMID,FNUMBER,FCREATEORGID,
32 FUSEORGID,FDOCUMENTSTATUS,FFORBIDSTATUS,FDATE,FMATERIALID,FBOMID,FAUXPROPID,FLOT,
33 FSEQ,FUNITID,FPRODUCTID,FWORKSHOPID,FCOSTCENTERID) values
34 (@i,‘PO‘,‘FORM_OUTSRCPROORDER‘,‘TEST00001‘,@i,@i,‘C‘,‘A‘,GETDATE(),@i,@i,@i,@i,@i,@i,@i,@i,@i)
35 SET @i=@i+1
36 end ;
37
38 select COUNT(1) from T_PROORDERTYPESEQGUIDTEST

三、分析索引碎片

1 --分析索引碎片
2 declare @table_id int
3 set @table_id=object_id(‘T_PROORDERTYPEGUIDTEST‘)
4 dbcc showcontig(@table_id);

DBCC SHOWCONTIG 正在扫描 ‘T_PROORDERTYPEGUIDTEST‘ 表...
表: ‘T_PROORDERTYPEGUIDTEST‘ (410536596);索引 ID: 1,数据库 ID: 8
已执行 TABLE 级别的扫描。
- 扫描页数................................: 13933
- 扫描区数..............................: 1759
- 区切换次数..............................: 13932
- 每个区的平均页数........................: 7.9
- 扫描密度 [最佳计数:实际计数].......: 12.50% [1742:13933]
- 逻辑扫描碎片 ..................: 99.22%
- 区扫描碎片 ..................: 0.11%
- 每页的平均可用字节数.....................: 2569.6
- 平均页密度(满).....................: 68.25%
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

1 declare @table_id int
2 set @table_id=object_id(‘T_PROORDERTYPESEQGUIDTEST‘)
3 dbcc showcontig(@table_id) 

DBCC SHOWCONTIG 正在扫描 ‘T_PROORDERTYPESEQGUIDTEST‘ 表...
表: ‘T_PROORDERTYPESEQGUIDTEST‘ (1114539104);索引 ID: 1,数据库 ID: 8
已执行 TABLE 级别的扫描。
- 扫描页数................................: 8197
- 扫描区数..............................: 1033
- 区切换次数..............................: 1032
- 每个区的平均页数........................: 7.9
- 扫描密度 [最佳计数:实际计数].......: 99.23% [1025:1033]
- 逻辑扫描碎片 ..................: 0.67%
- 区扫描碎片 ..................: 0.10%
- 每页的平均可用字节数.....................: 44.3
- 平均页密度(满).....................: 99.45%
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

时间: 2024-10-10 08:55:10

[O]SQL SERVER下有序GUID和无序GUID作为主键&聚集索引的性能表现的相关文章

SQL SERVER 下PadLeft函数

在.net中,可以使用String.PadLeft函数左对齐字符串,在左边用指定的Unicode字符填充以达到指定的总长度.      例如:在做自动编号这样使用 1: int ID = da.GetMaxNum() + 1; 2: this.tbID.Text = ID.ToString().PadLeft(6, '0'); 1: --在sql中 2: 3: --功能:右对齐的字符,在左边用指定的字符填充以达到指定的总长度. 4: --原始字符 @num:填充字符 @paddingChar:字

SQL server下死锁问题

这几天在做一个项目,以前都没怎么搞过多线程,现在开始,只有边学边做了. 一开始的时候,程序报错是,是提示发生死锁,刚开始,自己没什么经验,以为是程序代码的死锁,就用lock代码,把程序给锁起来了,运行程序后,发现有超时现象,查阅资料,后来断定,这个问题是死锁是发生是SQL server上的,特地找了下SQL2008的书,看了下,死锁的解释. 共享锁 排他锁 更新锁 自定义锁 然后查了资料, 查询SQL死锁的 存储过程 create procedure sp_who_lock   as   beg

SQL SERVER 中is null 和 is not null 将会导致索引失效吗?

原文:SQL SERVER 中is null 和 is not null 将会导致索引失效吗? 其实本来这个问题没有什么好说的,今天优化的时候遇到一个SQL语句,因为比较有意思,所以我截取.简化了SQL语句,演示给大家看,如下所示 declare @bamboo_Code varchar(3);   set @bamboo_Code='-01';     SELECT DISTINCT yarn_lot FROM   dbo.rsjob WITH ( nolock ) WHERE  RIGHT(

SQL Server下实现利用SQL Server Agent Job对索引重建实现Balance Load

昨天工作中遇到这样一个场景,有个项目需要把某台服务器下所有的表和索引都启用数据压缩(data_compression=page),已经启用了的表和索引就不需要再压缩一次了.统计一下后发现要运行的REBUILD INDEX代码多达上万条,而整个服务器上的所有需要压缩的数据库对象大小加起来估计接近1TB.这种情况下如果把所有工作都交给一条脚本来完成,估计整个周末都跑不完.那么我们的想法就是用多个SQL Server Agent Job来做完成这个任务,分配单位是表(也就是说把同一张表的所有索引重建任

ACCESS与SQL Server下SQL Like 查询的不同

在ACCESS中LIKE的用法Access里like的通配符用法是这样: “?”表示任何单一字符: “*”表示零个或多个字符: “#”表示任何一个数字 所以应该是: select * from databasename where fieldname like '*XX*' 在SQL SERVER 里是用%表示零个或多个字符: select * from databasename where fieldname like '%XX%'

SQL Server下ADO.NET 怎么获取数据库SQL语句INSERT,UPDATE,DELETE了多少行数据

ADO.NET 在发送SQL语句到SQL Server数据库后,怎么知道真正INSERT,UPDATE,DELETE了多少行数据呢? 使用SQL Server内置的全局变量@@ROWCOUNT即可,@@ROWCOUNT可以返回在当前数据库连接(SqlConnection)中,执行的上一条SQL语句影响了多少行数据,使用示例如下所示: INSERT INTO [dbo].[Person]([PersonCode],[Name],[Age],[City]) VALUES (N'P8000',N'He

SQL Server 占用内存太高,查找占用内存高以及影响其性能的sql语句

当发现SQL Server 占用的资源过高,有时重启电脑也解决不了问题时,建议通过如下语句检查SQL语句的问题, 如果是当天出的问题增加{order by last_worker_time desc,想看一下今天哪些sql执行出现问题了} SELECT s2.dbid,  s1.sql_handle,  (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 ,  ( (CASE WHEN statement_end_offset

SQL Server(第一章) 创建表 删除表 创建主键约束、唯一约束、外键约束、CHECK约束、默认约束

1.Employees员工表 /** 创建Employees员工表 **/ USE TSQL2012 IF OBJECT_ID('dbo.Employees','U') IS NOT NULL DROP TABLE dbo.Employees CREATE TABLE dbo.Employees ( empid INT NOT NULL, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, hiredate DATE NO

但从谈论性能点SQL Server选择聚集索引键

简单介绍 在SQL Server中,数据是按页进行存放的.而为表加上聚集索引后,SQL Server对于数据的查找就是依照聚集索引的列作为keyword进行了. 因此对于聚集索引的选择对性能的影响就变得十分重要了.本文从旨在从性能的角度来谈聚集索引的选择,但这不过从性能方面考虑.对于有特殊业务要求的表,则须要按实际情况进行选择. 聚集索引所在的列或列的组合最好是唯一的 这个原因须要从数据的存放原理来谈. 在SQL Server中,数据的存放方式并非以行(Row)为单位.而是以页为单位.因此.在查