数据库中使用自增量字段与Guid字段作主键的性能对比(补充篇)-----转
我在發(fā)表過“據(jù)庫中使用自增量字段與Guid字段主鍵的性能對(duì)比”這篇文章后,得到博客園各園友的很多評(píng)價(jià),大家對(duì)我的測(cè)試方法也提出一些改進(jìn)的方法。讓我吃驚的是一園友提出:把guid和id的測(cè)試順序顛倒一下,看下結(jié)果。今天就再測(cè)試一下,歡迎各園友提出更好的測(cè)試方案。?????
1.測(cè)試環(huán)境
???? 操作系統(tǒng):windows server 2003 R2 Enterprise Edition Service Pack 2
數(shù)據(jù)庫:MS SQL 2008 Express
CPU:Intel(R) Pentium(R) 4 CPU 3.40GHz
內(nèi)存:DDRⅡ 667? 1G
硬盤:WD 80G
2.數(shù)據(jù)庫腳本
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] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO 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] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO首先看一下測(cè)試代碼:
Code
為了消除上面的顧慮,每次僅使用一種方式測(cè)試(每次都注釋不使用的代碼)。
1.1.自增Id的寫入測(cè)試。
?
1.2.Guid的寫入測(cè)試。
2.1.自增Id的讀取到DataTable測(cè)試
2.2.Guid的讀取到DataTable測(cè)試
3.1.自增Id的數(shù)據(jù)總數(shù)統(tǒng)計(jì)
3.2.Guid數(shù)據(jù)總數(shù)統(tǒng)計(jì)
4.1.自增Id的數(shù)據(jù)總數(shù)統(tǒng)計(jì)(手動(dòng)找到第3000條數(shù)據(jù)的id,然后查詢)
4.2.Guid的數(shù)據(jù)總數(shù)統(tǒng)計(jì)(手動(dòng)找到第3000條數(shù)據(jù)的id,然后查詢)
以上測(cè)試均屬本人電腦上的測(cè)試。每次的測(cè)試結(jié)果都是測(cè)試好幾次,然后才取其中的一組相對(duì)平均的結(jié)果。
補(bǔ)充(不是我不總結(jié),其實(shí)一些實(shí)際的應(yīng)用已經(jīng)在上一篇中總結(jié)過了,再整理一下吧):
????? 1.測(cè)試的結(jié)果Guid作為主鍵在以上測(cè)試的性能還是優(yōu)于自動(dòng)增長(zhǎng)Id的。對(duì)于Inner join的還沒有測(cè)試。
????? 2.對(duì)于使用那種類型作為主鍵,還要根據(jù)具體的需要。在數(shù)據(jù)庫遷移或者導(dǎo)入數(shù)據(jù)的時(shí)候自增量字段有可能會(huì)出現(xiàn)重復(fù),這無疑是一場(chǎng)惡夢(mèng),而Guid格式無疑是首選。但是,使用Guid格式比較復(fù)雜,對(duì)于程序高度比較麻煩,畢竟Guid比較難記。
????? 3.自動(dòng)增長(zhǎng)的Id使用的是int型或者bigint型,它們分別占用存儲(chǔ)空間為4個(gè)字節(jié)和8個(gè)字節(jié),Guid是uniqueidentifier類型,它占用16個(gè)字節(jié)。從存儲(chǔ)空間上來說,自動(dòng)增長(zhǎng)的Id更節(jié)省空間。?????
????? 4.如果要搞分布式數(shù)據(jù)庫的話,這自增量字段就有問題了。因?yàn)?#xff0c;在分布式數(shù)據(jù)庫中,不同數(shù)據(jù)庫的同名的表可能需要進(jìn)行同步復(fù)制。一個(gè)數(shù)據(jù)庫表的自增量值,就很可能與另一數(shù)據(jù)庫相同表的自增量值重復(fù)了。
????? 我個(gè)人還是比較喜歡使用Guid作主鍵,因?yàn)樗容^唯一,不管是任務(wù)時(shí)候它都是唯一的,數(shù)據(jù)庫的導(dǎo)入與導(dǎo)出都不會(huì)出現(xiàn)主鍵重復(fù)的現(xiàn)象。
我個(gè)人的一些問題:
????? 1.我使用的是windows Live Writer寫的文章,為了粘貼代碼的方便性,我使用from Visual Studio插件粘貼代碼,但是如果代碼中含有中文,例如注釋,粘貼后,每個(gè)漢字后面都會(huì)多出一個(gè)“?”,這個(gè)問題不知道怎么解決,我通過設(shè)置編碼方式還 是不能解決問題。
????? 2.在Windows Live Writer中怎樣設(shè)置代碼(打包后上傳后)的下載的鏈接。
????? 另外:向喜歡數(shù)據(jù)庫的園友,推薦一篇:SQL Server 查詢處理中的各個(gè)階段
????? 關(guān)于自動(dòng)增長(zhǎng)Id與Guid的介紹請(qǐng)參見:據(jù)庫中使用自增量字段與Guid字段主鍵的性能對(duì)比
????? 測(cè)試代碼
總結(jié)
以上是生活随笔為你收集整理的数据库中使用自增量字段与Guid字段作主键的性能对比(补充篇)-----转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 瞧瞧UC浏览器对CSS样式的“关怀”
- 下一篇: MYSQL AB复制原理