1. Apžvalga:
Mūsų duomenų bazės dizaine pagrindinis duomenų bazės raktas yra būtinas, o pirminio rakto dizainas turi didelę įtaką visos duomenų bazės dizainui. Palyginsiu automatinių inkrementinių laukų ir Guid laukų našumą, kviečiame aptarti.
2. Įvadas:
1. Savaiminiai laukai
Savaiminiai laukai kiekvieną kartą didinami nuosekliai, užtikrinant, kad lentelės pirminiai raktai nebūtų kartojami. Jei nebus viršyta ir padidinta maksimali savaiminio lauko tipo reikšmė, tai beveik neįmanoma. Labai paprasta naudoti savaiminius laukus kaip pirminius raktus, paprastai tiesiog deklaruokite savaime didėjančius atributus kuriant lentelę.
Savaiminio augimo reikšmės yra visos visuotinės duomenų reikšmės, kurias reikia išlaikyti sistemoje, o reikšmė didinama kiekvieną kartą įterpiant duomenis. Lygiagrečioje aplinkoje, kurioje atitikmuo generuoja unikalią tapatybę, kiekviena papildoma reikšmė turi būti užrakinta ir atrakinta naudojant šią visuotinę reikšmę, kad būtų užtikrintas prieaugio unikalumas. Tai gali būti tuo pačiu metu kylanti kliūtis, susijusi su tam tikromis našumo problemomis.
Perkeliant ar importuojant duomenis, savaiminiai laukai gali būti dubliuojami, o tai neabejotinai yra košmaras (aš jau nuo to kentėjau).
Jei norite sukurti paskirstytą duomenų bazę, šis savaiminis laukas yra problema. Taip yra todėl, kad paskirstytoje duomenų bazėje lenteles tuo pačiu pavadinimu iš skirtingų duomenų bazių gali tekti replikuoti sinchroniškai. Tikėtina, kad duomenų bazės lentelės savaiminio augimo reikšmė bus dubliuojama su tos pačios lentelės savaiminio augimo reikšme kitoje duomenų bazėje.
2. Uniqueidentifier (Guid) laukas
MS SQL duomenų bazėse lentelės struktūrą galima sukurti nurodant lauko tipą kaip uniqueidentifier, o numatytąją reikšmę galima sugeneruoti naudojant NewID(), kad būtų sugeneruotas unikalus GUID (Globally Unique Identifier).
Guid:指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,其算法是通过以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字生成。其格式为:04755396-9A29-4B8C-A38D-00042C1B9028.
GUID privalumas yra tas, kad sugeneruotas ID yra gana unikalus, nesvarbu, ar jis eksportuoja duomenis, ar atlieka žingsnis po žingsnio kūrimą, problemų nebus. Tačiau jo generuojamas ID yra gana ilgas, o duomenų bazės vieta taip pat užimta, todėl nereikia į tai atsižvelgti, nes išorinės saugyklos kaina mažėja. Be to, "Guid" nėra lengva įsiminti, ir šiuo atžvilgiu jis nėra toks geras kaip automatiniai papildomi laukai, o tai nėra labai patogu derinant programas.
3. Testavimas:
1. Išbandykite aplinką
Operacinė sistema: Windows Server 2003 R2 Enterprise Edition 2 pakeitimų paketas
Duomenų bazė: MS SQL 2005
CPU:Intel(R) Pentium(R) 4 CPU 3.40GHz
Atmintis: DDRII. 667 1G
Kietasis diskas: WD 80G
2. Duomenų bazės scenarijai
- --自增量字段表
- 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
- --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] ASC
- )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
- ) ON [PRIMARY]
- GO
Kopijuoti kodą Bandymo kodas
- 1using System;
- 2using System.Collections.Generic;
- 3using System.Text;
- 4using System.Data.SqlClient;
- 5using System.Diagnostics;
- 6using System.Data;
- 8namespace GuidTest
- 9{
- class Program
- {
- string Connnection = "server=.;database=GuidTest;Integrated Security=true;";
- static void Main(string[] args)
- {
- Program app = new Program();
- int Count = 10000;
- Console.WriteLine("数据记录数为{0}",Count);
- //自动id增长测试;
- Stopwatch WatchId = new Stopwatch();
- Console.WriteLine("自动增长id测试");
- Console.WriteLine("开始测试");
- WatchId.Start();
- Console.WriteLine("测试中");
- 25 app.Id_InsertTest(Count);
- //app.Id_ReadToTable(Count);
- //app.Id_Count();
- 29 //查询第300000条记录;
- //app.Id_SelectById();
- 32 WatchId.Stop();
- Console.WriteLine("时间为{0}毫秒",WatchId.ElapsedMilliseconds);
- Console.WriteLine("测试结束");
- 36 Console.WriteLine("-----------------------------------------");
- //Guid测试;
- Console.WriteLine("Guid测试");
- Stopwatch WatchGuid = new Stopwatch();
- Console.WriteLine("开始测试");
- WatchGuid.Start();
- Console.WriteLine("测试中");
- 44 app.Guid_InsertTest(Count);
- //app.Guid_ReadToTable(Count);
- //app.Guid_Count();
- 48 //查询第300000条记录;
- //app.Guid_SelectById();
- 51 WatchGuid.Stop();
- Console.WriteLine("时间为{0}毫秒", WatchGuid.ElapsedMilliseconds);
- Console.WriteLine("测试结束");
- Console.Read();
- }
- 57 /**////
- /// 自动增长id测试
- ///
- private void Id_InsertTest(int count)
- {
- string InsertSql="insert into Table_Id ([Value]) values ({0})";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- conn.Open();
- SqlCommand com = new SqlCommand();
- for (int i = 0; i < count; i++)
- {
- com.Connection = conn;
- com.CommandText = string.Format(InsertSql, i);
- com.ExecuteNonQuery();
- }
- }
- }
- 76 /**////
- /// 将数据读到Table
- ///
- private void Id_ReadToTable(int count)
- {
- string ReadSql = "select top " + count.ToString() + " * from Table_Id";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- SqlDataAdapter adapter = new SqlDataAdapter(com);
- DataSet ds = new DataSet();
- adapter.Fill(ds);
- Console.WriteLine("数据记录数为:{0}", ds.Tables[0].Rows.Count);
- }
- }
- 92 /**////
- /// 数据记录行数测试
- ///
- private void Id_Count()
- {
- string ReadSql = "select Count(*) from Table_Id";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- conn.Open();
- object CountResult = com.ExecuteScalar();
- conn.Close();
- Console.WriteLine("数据记录数为:{0}",CountResult);
- }
- }
- 108 /**////
- /// 根据id查询;
- ///
- private void Id_SelectById()
- {
- string ReadSql = "select * from Table_Id where Id="+300000;
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- conn.Open();
- object IdResult = com.ExecuteScalar();
- Console.WriteLine("Id为{0}", IdResult);
- conn.Close();
- }
- }
-
- /**////
- /// Guid测试;
- ///
- private void Guid_InsertTest(int count)
- {
- string InsertSql = "insert into Table_Guid ([Value]) values ({0})";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- conn.Open();
- SqlCommand com = new SqlCommand();
- for (int i = 0; i < count; i++)
- {
- com.Connection = conn;
- com.CommandText = string.Format(InsertSql, i);
- com.ExecuteNonQuery();
- }
- }
- }
- 143 /**////
- /// Guid格式将数据库读到Table
- ///
- private void Guid_ReadToTable(int count)
- {
- string ReadSql = "select top "+count.ToString()+" * from Table_GuID";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- SqlDataAdapter adapter = new SqlDataAdapter(com);
- DataSet ds = new DataSet();
- adapter.Fill(ds);
- Console.WriteLine("数据记录为:{0}", ds.Tables[0].Rows.Count);
- }
- }
- 159 /**////
- /// 数据记录行数测试
- ///
- private void Guid_Count()
- {
- string ReadSql = "select Count(*) from Table_Guid";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- conn.Open();
- object CountResult = com.ExecuteScalar();
- conn.Close();
- Console.WriteLine("数据记录为:{0}", CountResult);
- }
- }
- 175 /**////
- /// 根据Guid查询;
- ///
- private void Guid_SelectById()
- {
- string ReadSql = "select * from Table_Guid where Guid='C1763624-036D-4DB9-A1E4-7E16318C30DE'";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- conn.Open();
- object IdResult = com.ExecuteScalar();
- Console.WriteLine("Guid为{0}", IdResult);
- conn.Close();
- }
- }
- }
- 192}
- 193
Kopijuoti kodą3. Duomenų bazės įterpimo testas 1 bandymas Duomenų bazės apimtis: 100 vienetų Paleiskite rezultatą 2 bandymas Duomenų bazės apimtis: 10 000 elementų Paleiskite rezultatą
3 bandymas Duomenų bazės apimtis: 100 000 elementų Paleiskite rezultatą 4 bandymas Duomenų bazės apimtis yra: 500 000 elementų Paleiskite rezultatą 4. Nuskaitykite duomenis į duomenų rinkinį 1 bandymas Perskaitytų duomenų kiekis: 100 Paleiskite rezultatą 2 bandymas Perskaitytų duomenų kiekis: 10 000 Paleiskite rezultatą 3 bandymas Perskaitytų duomenų kiekis: 100 000 Paleiskite rezultatą 4 bandymas Perskaitytų duomenų kiekis: 500 000 Paleiskite rezultatą 4. Užrašykite bendrą skaičių testą Bandymo rezultatai 5. Nurodykite būklės užklausos testą 300 000-asis įrašas užklausų duomenų bazėje yra 610 300. 4. Santrauka: Guid naudojimas kaip pagrindinis raktas nėra labai lėtas, tačiau greitesnis nei automatinio augimo žingsniai.
|