1. Áttekintés:
Az adatbázis tervezésében az adatbázis elsődleges kulcsa elengedhetetlen, és annak kialakítása nagy hatással van az egész adatbázis kialakítására. Összehasonlítom az auto-inkrementális mezők és a Guid mezők teljesítményét, szívesen beszélgetünk.
2. Bevezetés:
1. Öninkrementális mezők
Az öninkrementális mezők minden alkalommal egymás után növelik, biztosítva, hogy a táblázat elsődleges kulcsai ne ismétlődjenek meg. Hacsak nem lépik túl az önnövekesztő mezőtípus maximális értékét és nem növelik nulláról, ez szinte lehetetlen. Nagyon egyszerű az öninkrementális mezőket elsődleges kulcsként használni, általában csak az önnövelő attribútumokat jelöljük táblázat építésekor.
Az öninkrementális értékek mind olyan globális adatértékek, amelyeket a rendszerben kell fenntartani, és az érték minden adat beillesztéskor növekszik. Egy párhuzamos környezetben, ahol az ekvivalens egyedi identitást generál, minden inkrementális értéket le kell zárni és feloldani ezzel a globális értékkel, hogy biztosítsák az inkrement egyediségét. Ez egyidejű szűk keresztmetszet is lehet, amely teljesítményproblémákkal jár.
Adatmigrációkor vagy importáláskor az öninkrementális mezők megdúlódnak, ami kétségtelenül rémálom (én már szenvedtem vele).
Ha elosztott adatbázist akarsz építeni, ez az öninkrementális mező problémát jelent. Ez azért van, mert egy elosztott adatbázisban az azonos nevű táblákat különböző adatbázisokból szinkronban kell replikálni. Egy adatbázistábla öninkrementális értéke valószínűleg duplikált ugyanazzal a tábla öninkrementális értékével egy másik adatbázisban.
2. egyedi azonosító (Guid) mező
Az MS SQL adatbázisokban a táblastruktúra úgy hozható létre, hogy a mezőtípust uniqueidentifierként jelöljük meg, és az alapértelmezett értéke a NewID() segítségével generálható egyedi Guid (Globálisan Egyedi Azonosító) generálásához.
Guid:指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,其算法是通过以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字生成。其格式为:04755396-9A29-4B8C-A38D-00042C1B9028.
A GUID előnye, hogy a generált ID viszonylag egyedi, legyen szó adatexportról vagy lépésről lépésre történő fejlesztésről, nem lesz probléma. Azonban az általa generált ID viszonylag hosszú, és az adatbázis területe is foglalt, így ezt nem kell figyelembe venni, mivel a külső tárolás ára csökken. Ráadásul a Guid nem könnyű megjegyezni, és ebben a tekintetben nem olyan jó, mint az automatikus inkrementális mezők, ami nem túl kényelmes programok hibakeresésekor.
3. Tesztelés:
1. Teszteljék a környezetet
Operációs rendszer: Windows Server 2003 R2 Enterprise Edition Service Pack 2
Adatbázis: MS SQL 2005
CPU:Intel(R) Pentium(R) 4 CPU 3.40GHz
Memória: DDRII. 667 1G
Merevlemez: WD 80G
2. Adatbázis szkriptek
- --自增量字段表
- 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
Kód másolása Tesztkód
- 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
Kód másolása3. Adatbázis-beillesztési teszt 1. teszt Az adatbázis mennyisége: 100 tétel Futtatd le az eredményt 2. teszt Az adatbázis mennyisége: 10 000 elem Futtatd le az eredményt
3. teszt Az adatbázis mennyisége: 100 000 tétel Futtatd le az eredményt 4. teszt Az adatbázis mennyisége: 500 000 tétel Futtatd le az eredményt 4. Olvassák fel az adatokat az Adathalmazba 1. teszt Olvasott adatmennyiség: 100 Futtatd le az eredményt 2. teszt Olvasott adatok száma: 10 000 Futtatd le az eredményt 3. teszt Olvasott adatok száma: 100 000 Futtatd le az eredményt 4. teszt Olvasott adatok száma: 500 000 Futtatd le az eredményt 4. Rögzítse a teljes számtesztet Teszteredmények 5. Határozd meg a feltétellekérdezési tesztet A lekérdezési adatbázis 300 000. rekordja 610 300. 4. Összefoglaló: A Guid fő kulcsként való használata nem túl lassú, de gyorsabb, mint az automatikus növekedési lépések.
|