1. Panoramica:
Nel nostro design del database, la chiave primaria del database è essenziale, e la progettazione della chiave primaria ha un grande impatto sulla progettazione dell'intero database. Confronterò le prestazioni dei campi auto-incrementali e dei campi Guida, benvenuti a discutere.
2. Introduzione:
1. Campi auto-incrementali
I campi auto-incrementali vengono incrementati in modo sequenziale ogni volta, assicurando che le chiavi primarie di una tabella non vengano ripetute. A meno che il valore massimo del tipo di campo auto-incrementante non venga superato e incrementato da zero, ciò è quasi impossibile. È molto semplice usare campi auto-incrementali come chiavi primarie, generalmente dichiarare semplicemente attributi auto-incrementanti quando si costruisce una tabella.
I valori auto-incrementali sono tutti valori globali dei dati che devono essere mantenuti nel sistema, e il valore viene incrementato ogni volta che i dati vengono inseriti. In un ambiente concorrente in cui l'equivalente genera un'identità unica, ogni valore incrementale deve essere bloccato e sbloccato con questo valore globale per garantire l'unicità dell'incremento. Questo può rappresentare un collo di bottiglia che comporta alcuni problemi di prestazioni.
Quando si migra o si importano dati, i campi auto-incrementali possono essere duplicati, il che è senza dubbio un incubo (ne ho già sofferto).
Se vuoi costruire un database distribuito, questo campo auto-incrementale è un problema. Questo perché in un database distribuito, le tabelle con lo stesso nome provenienti da database diversi possono dover essere replicate in modo sincrono. Il valore auto-incrementale di una tabella di database è probabile che venga duplicato con il valore auto-incrementale della stessa tabella in un altro database.
2. campo uniidentificatore (Guid)
Nei database MS SQL, la struttura della tabella può essere creata specificando il tipo di campo come identificatore unico, e il suo valore predefinito può essere generato usando NewID() per generare un Guid unico (Identificatore Unico Globale).
Guid:指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,其算法是通过以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字生成。其格式为:04755396-9A29-4B8C-A38D-00042C1B9028.
Il vantaggio del GUID è che l'ID generato è relativamente unico, che si tratti di esportare dati o di sviluppare passo dopo passo, non ci saranno problemi. Tuttavia, l'ID che genera è relativamente lungo e lo spazio del database è occupato, quindi non c'è bisogno di considerare questo perché il costo dello storage esterno diminuisce. Inoltre, Guid non è facile da ricordare e, sotto questo aspetto, non è efficace come i campi incrementali automatici, che non sono molto comodi per il debug dei programmi.
3. Test:
1. Testare l'ambiente
Sistema operativo: Windows Server 2003 R2 Enterprise Edition Service Pack 2
Database: MS SQL 2005
CPU:Intel(R) Pentium(R) 4 CPU 3.40GHz
Memoria: DDRII. 667 1G
Hard disk: WD 80G
2. Script di database
- --自增量字段表
- 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
Copia codice Codice di prova
- 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
Copia codice3. Test di inserimento nel database Test 1 Il volume del database è: 100 elementi Esegui il risultato Test 2 Il volume del database è: 10.000 elementi Esegui il risultato
Test 3 Il volume del database è: 100.000 elementi Esegui il risultato Test 4 Il volume del database è: 500.000 elementi Esegui il risultato 4. Leggere i dati nel DataSet Test 1 Quantità di dati letti: 100 Esegui il risultato Test 2 Quantità di dati letti: 10.000 Esegui il risultato Test 3 Quantità di dati letti: 100.000 Esegui il risultato Test 4 Quantità di dati letti: 500.000 Esegui il risultato 4. Registrare il numero totale del test Risultati dei test 5. Specificare il test di query di condizione Il 300.000° record nel database delle query è 610.300. 4. Sommario: Usare Guid come chiave principale non è molto lento, ma è più veloce rispetto all'uso di incrementi a crescita automatica.
|