最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 编程开发 > asp教程

ASP使用Guid做主键和int做主键性能比较

日期:08-18    来源:中国设计秀    作者:cnwebshow.com

在数据库的设计中我们常常用Guid或int来做主键,根据所学的知识一直感觉int做主键效率要高,但没有做仔细的测试无法Gl6中国设计秀
Gl6中国设计秀
说明道理。碰巧今天在数据库的优化过程中,遇到此问题,于是做了一下测试。Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试环境:Gl6中国设计秀
Gl6中国设计秀
  台式电脑 Pentiun(R) 4 Cpu 3.06GHzGl6中国设计秀
  Win XP PRofessional Gl6中国设计秀
  1.5G DDR RAM Gl6中国设计秀
  SQL Server 2005 个人版  Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试过程:Gl6中国设计秀
首先创建测试数据库TestGl6中国设计秀
1.创建Test_Guid表,创建Test_Int表Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
-------------------------------------------Gl6中国设计秀
--创建Test_Guid表Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
USE  TestGl6中国设计秀
GOGl6中国设计秀
Gl6中国设计秀
IF OBJECT_ID('Test_Guid', 'U') IS NOT NULLGl6中国设计秀
  DROP TABLE Test_GuidGl6中国设计秀
GOGl6中国设计秀
Gl6中国设计秀
CREATE TABLE Test_GuidGl6中国设计秀
(Gl6中国设计秀
    Guid varchar(50) not null,Gl6中国设计秀
    TestId int not null,Gl6中国设计秀
    TestText ntext not null,Gl6中国设计秀
    TestDateTime datetime default getdate(),Gl6中国设计秀
    CONSTRAINT PK_Guid PRIMARY KEY (Guid)Gl6中国设计秀
)Gl6中国设计秀
GOGl6中国设计秀
---------------------------------------------Gl6中国设计秀
--创建Test_Int表Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
USE  TestGl6中国设计秀
GOGl6中国设计秀
Gl6中国设计秀
IF OBJECT_ID('Test_Int', 'U') IS NOT NULLGl6中国设计秀
  DROP TABLE Test_IntGl6中国设计秀
GOGl6中国设计秀
Gl6中国设计秀
CREATE TABLE Test_IntGl6中国设计秀
(Gl6中国设计秀
    Id int not null identity(1,1),Gl6中国设计秀
    TestId int not null,Gl6中国设计秀
    TestText ntext not null,Gl6中国设计秀
    TestDateTime datetime default getdate(),Gl6中国设计秀
    CONSTRAINT PK_Id PRIMARY KEY (Id)Gl6中国设计秀
)Gl6中国设计秀
GOGl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
2.创建Test_Guid子表:Test_Guid_Detail和创建Test_Int子表:Test_Int_Detail,用来做连接查询Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
--创建Test_Guid子表:Test_Guid_DetailGl6中国设计秀
USE  TestGl6中国设计秀
GOGl6中国设计秀
Gl6中国设计秀
IF OBJECT_ID('Test_Guid_Detail', 'U') IS NOT NULLGl6中国设计秀
  DROP TABLE Test_Guid_DetailGl6中国设计秀
GOGl6中国设计秀
Gl6中国设计秀
CREATE TABLE Test_Guid_DetailGl6中国设计秀
(Gl6中国设计秀
    Guid varchar(50) not null,--Guid是Test_Guid的外键Gl6中国设计秀
    TestId int not null,Gl6中国设计秀
    TestText ntext not null,Gl6中国设计秀
    TestDateTime datetime default getdate()--,Gl6中国设计秀
    --CONSTRAINT PK_Guid PRIMARY KEY (Guid)Gl6中国设计秀
)Gl6中国设计秀
GOGl6中国设计秀
--创建Test_Int子表:Test_Int_DetailGl6中国设计秀
USE  TestGl6中国设计秀
GOGl6中国设计秀
Gl6中国设计秀
IF OBJECT_ID('Test_Int_Detail', 'U') IS NOT NULLGl6中国设计秀
  DROP TABLE Test_Int_DetailGl6中国设计秀
GOGl6中国设计秀
Gl6中国设计秀
CREATE TABLE Test_Int_DetailGl6中国设计秀
(Gl6中国设计秀
    Id int not null,--Id是Test_Int的外键Gl6中国设计秀
    TestId int not null,Gl6中国设计秀
    TestText ntext not null,Gl6中国设计秀
    TestDateTime datetime default getdate()--,Gl6中国设计秀
    --CONSTRAINT PK_Guid PRIMARY KEY (Guid)Gl6中国设计秀
)Gl6中国设计秀
GOGl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
3.开始测试Gl6中国设计秀
测试1:测试Insert:向Test_Guid表中插入10万条记录Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--测试Insert:向Test_Guid表中插入10万条记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @num intGl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @num=0;Gl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
while(@num<100000)Gl6中国设计秀
beginGl6中国设计秀
    insert into Test_GuidGl6中国设计秀
    values(newid(),@num,'测试guid',getdate())Gl6中国设计秀
    set @num=@num+1Gl6中国设计秀
endGl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试2:测试Insert:向Test_Int表中插入10万条记录Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--测试Insert:向Test_Int表中插入10万条记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @num intGl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @num=0;Gl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
while(@num<100000)Gl6中国设计秀
beginGl6中国设计秀
    insert into Test_IntGl6中国设计秀
    values(@num,'测试int',getdate())Gl6中国设计秀
    set @num=@num+1Gl6中国设计秀
endGl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试3:测试Select:查找Test_Guid表中所有记录Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--测试Select:查找Test_Guid表中所有记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
select * from Test_GuidGl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试4:测试Select:查找Test_Int表中所有记录Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--测试Select:查找Test_Int表中所有记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
select * from Test_IntGl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试5:聚合查询:查找Test_Guid表中所有记录数Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--聚合查询:查找Test_Guid表中所有记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
select count(*) from Test_GuidGl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试6:聚合查询:查找Test_Int表中所有记录数Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--聚合查询:查找Test_Int表中所有记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
select count(*) from Test_IntGl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试7:测试带where条件的Select查询:查找Test_Int表中所有记录,都查找10000到50000之间的4万条记录Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
----------------------------------------------------------------------------------------Gl6中国设计秀
--测试带where条件的Select查询:查找Test_Int表中所有记录,都查找10000到50000之间的4万条记录Gl6中国设计秀
----------------------------------------------------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
select * from Test_Guid where TestId between 10000 and 50000 Gl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试8:测试带where条件的Select查询:查找Test_Int表中所有记录,都查找10000到50000之间的4万条记录Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
----------------------------------------------------------------------------------------Gl6中国设计秀
--测试带where条件的Select查询:查找Test_Int表中所有记录,都查找10000到50000之间的4万条记录Gl6中国设计秀
----------------------------------------------------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
select * from Test_Int where TestId between 10000 and 50000 Gl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试9:测试Test_Guid关联查询inner joinGl6中国设计秀
Gl6中国设计秀
首先以Test_Guid中第一个Guid为外键,向Test_Guid_Detail中插入1万条记录Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--向Test_Guid子表:Test_Guid_Detail中插入1万条记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @num intGl6中国设计秀
declare @topGuid nvarchar(50)Gl6中国设计秀
set @num=0;Gl6中国设计秀
select top 1 @topGuid=Guid from Test_GuidGl6中国设计秀
while(@num<10000)Gl6中国设计秀
beginGl6中国设计秀
    insert into Test_Guid_DetailGl6中国设计秀
    values(@topGuid,@num,'测试guid的子表',getdate())Gl6中国设计秀
    set @num=@num+1Gl6中国设计秀
endGl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
然后开始测试:Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--测试连接查询:查找Test_Guid表和Test_Guid_Detail所有关联的记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
select T.* from Test_Guid TGl6中国设计秀
inner join Test_Guid_Detail T1 on T.Guid=T1.GuidGl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
测试10:测试Test_Int关联查询inner joinGl6中国设计秀
Gl6中国设计秀
首先以Test_Int中第一个id为外键,向Test_Int_Detail中插入1万条记录Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--向Test_Int子表:Test_Int中插入1万条记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @num intGl6中国设计秀
declare @topInt intGl6中国设计秀
set @num=0;Gl6中国设计秀
select top 1 @topInt=Id from Test_IntGl6中国设计秀
while(@num<10000)Gl6中国设计秀
beginGl6中国设计秀
    insert into Test_Int_DetailGl6中国设计秀
    values(@topInt,@num,'测试int的子表',getdate())Gl6中国设计秀
    set @num=@num+1Gl6中国设计秀
endGl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
然后开始测试:Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--测试连接查询:查找Test_Int表和Test_Int_Detail所有关联的记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
select T.* from Test_Int TGl6中国设计秀
inner join Test_Int_Detail T1 on T.id=T1.idGl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
测试11:测试Update:更新Test_Guid表中所有记录Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--测试Update:查找Test_Guid表中所有记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
update  Test_Guid set TestText='测试guid更新'Gl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试12:测试Update:更新Test_Int表中所有记录Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--测试Update:查找Test_Int表中所有记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
update Test_Int set TestText='测试int更新'Gl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试13:测试Delete:删除Test_Guid表中所有记录Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--测试Delete:查找Test_Guid表中所有记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
delete from Test_GuidGl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
delete from Test_Guid_DetailGl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
测试14:测试Delete:删除Test_Int表中所有记录Gl6中国设计秀
Gl6中国设计秀
代码 Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
--测试Delete:查找Test_Int表中所有记录Gl6中国设计秀
---------------------------------------------Gl6中国设计秀
declare @startTime datetimeGl6中国设计秀
set @startTime=getdate()Gl6中国设计秀
delete from Test_IntGl6中国设计秀
select datediff(second,@startTime,getdate()) as 秒,datediff(ms,@startTime,getdate()) as 毫秒Gl6中国设计秀
delete from Test_int_DetailGl6中国设计秀
Gl6中国设计秀
Gl6中国设计秀
综上所述,使用int做主键比用guid做主键各中情况下效率均有提高,特别是在有连接查询和删除记录效率提升明显。Gl6中国设计秀
Gl6中国设计秀
而且本人今日在guid做主键的数据查询中因为嵌套几个子查询结果屡屡出现查询超时。因此本人赞同用int做主键,不赞同guid做主键。Gl6中国设计秀
以上观点代表个人观点,欢迎大家各抒己见,说明guid和int各自做主键的优劣所在。Gl6中国设计秀
Gl6中国设计秀
附上测试脚本供大家测试:http://files.cnblogs.com/jackhuclan/guid.rarGl6中国设计秀

本文引用地址:/bc/article_46175.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明