数据库中使用自增量字段与Guid字段作主键的性能对比_第1页
数据库中使用自增量字段与Guid字段作主键的性能对比_第2页
数据库中使用自增量字段与Guid字段作主键的性能对比_第3页
数据库中使用自增量字段与Guid字段作主键的性能对比_第4页
数据库中使用自增量字段与Guid字段作主键的性能对比_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、据库中使用自增量字段与Guid字段主键的性能对比1.概述:在我们的数据库设计中,数据库的主键是必不可少的,主键的设计对整个数据库的设计影响很大.我就对自动增量字段与Guid字段的性能作一下对比,欢迎大家讨论. 2.简介: 1.自增量字段自增量字段每次都会按顺序递增,可以保证在一个表里的主键不重复。除非超出了自增字段类型的最大值并从头递增,但这几乎不可能。使用自增量字段来做主键是非常简单的,一般只需在建表时声明自增属性即可。自增量的值都是需要在系统中维护一个全局的数据值,每次插入数据时即对此次值进行增量取值。当在当量产生唯一标识的并发环境中,每次的增量取值都必须最此全局值加锁解锁以保证增量的唯一

2、性。这可能是一个并发的瓶颈,会牵扯一些性能问题。 在数据库迁移或者导入数据的时候自增量字段有可能会出现重复,这无疑是一场恶梦(本人已经深受其害. 如果要搞分布式数据库的话,这自增量字段就有问题了。因为,在分布式数据库中,不同数据库的同名的表可能需要进行同步复制。一个数据库表的自增量值,就很可能与另一数据库相同表的自增量值重复了。2.uniqueidentifier(Guid字段 在MS Sql 数据库中可以在建立表结构是指定字段类型为uniqueidentifier,并且其默认值可以使用NewID(来生成唯一的Guid(全局唯一标识符.使用NewID生成的比较随机,如果是SQL 2005可以使

3、用NewSequentialid(来顺序生成,在此为了兼顾使用SQL 2000使用了NewID(.Guid:指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,其算法是通过以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字生成。其格式为:04755396-9A29-4B8C-A38D-00042C1B9028. Guid的优点就是生成的id比较唯一,不管是导出数据还是做分步开发都不会出现问题.然而它生成的id比较长,占用的数据库空间也比较多,随着外存价格的下降,这个也无需考虑.另外Guid不便于记忆,在这方面不如自动增量字段,在作调试程序的时候不太方便。3.测试:1.测试环境

4、操作系统:windows server 2003 R2 Enterprise Edition Service Pack 2数据库:MS SQL 2005 CPU:Intel(R Pentium(R 4 CPU 3.40GHz内存:DDR 667 1G硬盘:WD 80G2.数据库脚本-自增量字段表CREATE TABLE dbo.Table_Id(Id int IDENTITY(1,1 NOT NULL,Value varchar(50 COLLATE Chinese_PRC_CI_AS NULL,CONSTRAINT PK_Table_Id PRIMARY KEY CLUSTERED (Id

5、ASCWITH (IGNORE_DUP_KEY = OFF ON PRIMARYON PRIMARYGO-Guid字段表CREATE TABLE dbo.Table_Guid(Guid uniqueidentifier NOT NULL CONSTRAINT DF_Table_Guid_Guid DEFAULT (newid(,Value varchar(50 COLLATE Chinese_PRC_CI_AS NULL,CONSTRAINT PK_Table_Guid PRIMARY KEY CLUSTERED (Guid ASCWITH (IGNORE_DUP_KEY = OFF ON P

6、RIMARYON PRIMARYGO 测试代码1using System;2using System.Collections.Generic;3using System.Text;4using System.Data.SqlClient;5using System.Diagnostics;6using System.Data;78namespace GuidTest910 class Program11 12 string Connnection = "server=.;database=GuidTest;Integrated Security=true;"13 stati

7、c void Main(string args14 15 Program app = new Program(;16 int Count = 10000;17 Console.WriteLine("数据记录数为0",Count;18 /自动id增长测试;19 Stopwatch WatchId = new Stopwatch(;20 Console.WriteLine("自动增长id测试"21 Console.WriteLine("开始测试"22 WatchId.Start(;23 Console.WriteLine("测试

8、中"2425 app.Id_InsertTest(Count;26 /app.Id_ReadToTable(Count;27 /app.Id_Count(;2829 /查询第300000条记录;30 /app.Id_SelectById(;3132 WatchId.Stop(;33 Console.WriteLine("时间为0毫秒",WatchId.ElapsedMilliseconds;34 Console.WriteLine("测试结束"3536 Console.WriteLine("-"37 /Guid测试;38 C

9、onsole.WriteLine("Guid测试"39 Stopwatch WatchGuid = new Stopwatch(;40 Console.WriteLine("开始测试"41 WatchGuid.Start(;42 Console.WriteLine("测试中"4344 app.Guid_InsertTest(Count;45 /app.Guid_ReadToTable(Count;46 /app.Guid_Count(;4748 /查询第300000条记录;49 /app.Guid_SelectById(;5051 W

10、atchGuid.Stop(;52 Console.WriteLine("时间为0毫秒", WatchGuid.ElapsedMilliseconds;53 Console.WriteLine("测试结束"54 Console.Read(;55 5657 /*/ 58 / 自动增长id测试59 / 60 private void Id_InsertTest(int count61 62 string InsertSql="insert into Table_Id (Value values (0"63 using (SqlConnec

11、tion conn = new SqlConnection(Connnection64 65 conn.Open(;66 SqlCommand com = new SqlCommand(;67 for (int i = 0; i < count; i+68 69 com.Connection = conn;70 com.CommandText = string.Format(InsertSql, i;71 com.ExecuteNonQuery(;72 73 74 7576 /*/ 77 / 将数据读到Table78 / 79 private void Id_ReadToTable(in

12、t count80 81 string ReadSql = "select top " + count.ToString( + " * from Table_Id"82 using (SqlConnection conn = new SqlConnection(Connnection83 84 SqlCommand com = new SqlCommand(ReadSql, conn;85 SqlDataAdapter adapter = new SqlDataAdapter(com;86 DataSet ds = new DataSet(;87 ada

13、pter.Fill(ds;88 Console.WriteLine("数据记录数为:0", ds.Tables0.Rows.Count;89 90 9192 /*/ 93 / 数据记录行数测试94 / 95 private void Id_Count(96 97 string ReadSql = "select Count(* from Table_Id"98 using (SqlConnection conn = new SqlConnection(Connnection99 100 SqlCommand com = new SqlCommand(Re

14、adSql, conn;101 conn.Open(;102 object CountResult = com.ExecuteScalar(;103 conn.Close(;104 Console.WriteLine("数据记录数为:0",CountResult;105 106 107108 /*/ 109 / 根据id查询;110 / 111 private void Id_SelectById(112 113 string ReadSql = "select * from Table_Id where Id="+300000;114 using (S

15、qlConnection conn = new SqlConnection(Connnection115 116 SqlCommand com = new SqlCommand(ReadSql, conn;117 conn.Open(;118 object IdResult = com.ExecuteScalar(;119 Console.WriteLine("Id为0", IdResult;120 conn.Close(;121 122 123 124 /*/ 125 / Guid测试;126 / 127 private void Guid_InsertTest(int

16、count128 129 string InsertSql = "insert into Table_Guid (Value values (0"130 using (SqlConnection conn = new SqlConnection(Connnection131 132 conn.Open(;133 SqlCommand com = new SqlCommand(;134 for (int i = 0; i < count; i+135 136 com.Connection = conn;137 com.CommandText = string.Forma

17、t(InsertSql, i;138 com.ExecuteNonQuery(;139 140 141 142143 /*/ 144 / Guid格式将数据库读到Table145 / 146 private void Guid_ReadToTable(int count147 148 string ReadSql = "select top "+count.ToString(+" * from Table_GuID"149 using (SqlConnection conn = new SqlConnection(Connnection150 151 S

18、qlCommand com = new SqlCommand(ReadSql, conn;152 SqlDataAdapter adapter = new SqlDataAdapter(com;153 DataSet ds = new DataSet(;154 adapter.Fill(ds;155 Console.WriteLine("数据记录为:0", ds.Tables0.Rows.Count;156 157 158159 /*/ 160 / 数据记录行数测试161 / 162 private void Guid_Count(163 164 string ReadSql = "select Count(* from Table_Guid"165 using (SqlConnection conn = new SqlConnection(Connnection166 167 SqlCommand com

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论