1. Oversikt:
I vårt databasedesign er primærnøkkelen til databasen essensiell, og utformingen av primærnøkkelen har stor innvirkning på utformingen av hele databasen. Jeg vil sammenligne ytelsen til auto-inkrementelle felt og Guid-felt, velkommen til å diskutere.
2. Introduksjon:
1. Selvinkrementelle felt
De selvinkrementelle feltene økes sekvensielt hver gang, noe som sikrer at primærnøklene i en tabell ikke gjentas. Med mindre maksimumsverdien til den selvøkende felttypen overskrides og økes fra bunnen av, er dette nesten umulig. Det er veldig enkelt å bruke selvinkrementelle felt som primærnøkler, vanligvis bare deklarere selvinkrementerende attributter når man bygger en tabell.
Selvinkrementelle verdier er alle globale dataverdier som må vedlikeholdes i systemet, og verdien økes hver gang dataene settes inn. I et samtidig miljø hvor ekvivalenten genererer en unik identitet, må hver inkrementell verdi låses og låses opp med denne globale verdien for å sikre unikheten til inkrementet. Dette kan være en samtidig flaskehals som involverer noen ytelsesproblemer.
Når man migrerer eller importerer data, kan selv-inkrementelle felt bli duplisert, noe som utvilsomt er et mareritt (jeg har allerede lidd med det).
Hvis du vil bygge en distribuert database, er dette selvinkrementelle feltet et problem. Dette er fordi tabeller med samme navn fra forskjellige databaser i en distribuert database kan måtte replikeres synkront. Den selv-inkrementelle verdien til en databasetabell vil sannsynligvis dupliseres med den selv-inkrementelle verdien til samme tabell i en annen database.
2. unikt identifikatorfelt (Guid)
I MS SQL-databaser kan tabellstrukturen opprettes ved å spesifisere felttypen som uniqueidentifier, og standardverdien kan genereres med NewID() for å generere en unik Guid (Globally Unique Identifier).
Guid:指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,其算法是通过以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字生成。其格式为:04755396-9A29-4B8C-A38D-00042C1B9028.
Fordelen med GUID er at den genererte ID-en er relativt unik, enten det eksporteres data eller trinnvis utvikling, vil det ikke være noen problemer. ID-en den genererer er imidlertid relativt lang, og databaseplassen er også opptatt, så det er ikke nødvendig å ta hensyn til dette ettersom prisen på ekstern lagring synker. I tillegg er Guid ikke lett å huske, og i så måte er det ikke like bra som automatiske inkrementelle felt, noe som ikke er særlig praktisk ved feilsøking av programmer.
3. Testing:
1. Test miljøet
Operativsystem: Windows Server 2003 R2 Enterprise Edition Service Pack 2
Database: MS SQL 2005
CPU:Intel(R) Pentium(R) 4 CPU 3.40GHz
Minne: DDRII. 667 1G
Harddisk: WD 80G
2. Databaseskript
- --自增量字段表
- 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
Kopier koden Testkode
- 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
Kopier koden3. Database-innsettingstest Test 1 Databasevolumet består av: 100 elementer Kjør resultatet Test 2 Databasevolumet er: 10 000 elementer Kjør resultatet
Test 3 Databasevolumet er: 100 000 elementer Kjør resultatet Test 4 Databasevolumet er: 500 000 elementer Kjør resultatet 4. Les dataene inn i Datasettet Test 1 Mengde leste data: 100 Kjør resultatet Test 2 Mengde leste data: 10 000 Kjør resultatet Test 3 Mengde leste data: 100 000 Kjør resultatet Test 4 Mengde leste data: 500 000 Kjør resultatet 4. Ta opp totalnummertesten Testresultater 5. Spesifiser betingelsesspørringstesten Den 300 000. posten i spørringsdatabasen er 610 300. 4. Sammendrag: Å bruke Guid som hovednøkkel er ikke veldig tregt, men det går raskere enn å bruke automatisk vekstøkninger.
|