1. Pārskats:
Mūsu datu bāzes noformējumā datu bāzes primārā atslēga ir būtiska, un primārās atslēgas noformējumam ir liela ietekme uz visas datu bāzes noformējumu. Es salīdzināšu automātisko pakāpenisko lauku un Guid lauku veiktspēju, laipni lūdzam apspriest.
2. Ievads:
1. Pašpakāpeniskie lauki
Pašpakāpeniskie lauki katru reizi tiek secīgi palielināti, nodrošinot, ka tabulas primārās atslēgas netiek atkārtotas. Ja vien netiek pārsniegta un palielināta pašpalielinoša lauka tipa maksimālā vērtība, tas ir gandrīz neiespējami. Ir ļoti vienkārši izmantot pašpakāpeniskos laukus kā primārās atslēgas, parasti vienkārši deklarējiet pašpalielinošus atribūtus, veidojot tabulu.
Pašpieauguma vērtības ir visas globālās datu vērtības, kas jāuztur sistēmā, un vērtība tiek palielināta katru reizi, kad dati tiek ievietoti. Vienlaicīgā vidē, kur ekvivalents ģenerē unikālu identitāti, katra pieauguma vērtība ir jābloķē un jāatbloķē ar šo globālo vērtību, lai nodrošinātu pieauguma unikalitāti. Tas var būt vienlaicīgs sastrēgums, kas ietver dažas veiktspējas problēmas.
Migrējot vai importējot datus, pašpieauguma lauki var tikt dublēti, kas neapšaubāmi ir murgs (es jau esmu cietis no tā).
Ja vēlaties izveidot izplatītu datu bāzi, šis pašpakāpeniskais lauks ir problēma. Tas ir tāpēc, ka izplatītā datu bāzē tabulas ar vienādu nosaukumu no dažādām datu bāzēm var būt jāreplicē sinhroni. Datu bāzes tabulas pašpieauguma vērtība, visticamāk, tiks dublēta ar tās pašas tabulas pašpieauguma vērtību citā datu bāzē.
2. Lauks uniqueidentifier (GUID)
MS SQL datu bāzēs tabulas struktūru var izveidot, norādot lauka tipu kā uniqueidentifier, un tā noklusējuma vērtību var ģenerēt, izmantojot NewID(), lai ģenerētu unikālu Guid (Globally Unique Identifier).
Guid:指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,其算法是通过以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字生成。其格式为:04755396-9A29-4B8C-A38D-00042C1B9028.
GUID priekšrocība ir tā, ka ģenerētais ID ir salīdzinoši unikāls, neatkarīgi no tā, vai tas eksportē datus vai veic pakāpenisku izstrādi, problēmu nebūs. Tomēr tā ģenerētais ID ir salīdzinoši garš, un arī datu bāzes vieta ir aizņemta, tāpēc tas nav jāņem vērā, jo ārējās atmiņas cena samazinās. Turklāt Guid nav viegli atcerēties, un šajā ziņā tas nav tik labs kā automātiskie pakāpeniskie lauki, kas nav ļoti ērti, atkļūdojot programmas.
3. Testēšana:
1. Pārbaudiet vidi
Operētājsistēma: Windows Server 2003 R2 Enterprise Edition 2. servisa pakotne
Datu bāze: MS SQL 2005
CPU:Intel(R) Pentium(R) 4 CPU 3.40GHz
Atmiņa: DDRII. 667 1G
Cietais disks: WD 80G
2. Datu bāzes skripti
- --自增量字段表
- 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
Kopēt kodu Testa kods
- 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
Kopēt kodu3. Datu bāzes ievietošanas tests 1. pārbaude Datu bāzes apjoms ir: 100 vienības Rezultāta palaišana 2. pārbaude Datu bāzes apjoms ir: 10,000 vienības Rezultāta palaišana
3. pārbaude Datu bāzes apjoms ir: 100 000 vienību Rezultāta palaišana 4. pārbaude Datu bāzes apjoms ir: 500 000 vienību Rezultāta palaišana 4. Datu lasīšana datu kopā 1. pārbaude Nolasīto datu apjoms: 100 Rezultāta palaišana 2. pārbaude Nolasīto datu apjoms: 10 000 Rezultāta palaišana 3. pārbaude Nolasīto datu apjoms: 100 000 Rezultāta palaišana 4. pārbaude Nolasīto datu apjoms: 500 000 Rezultāta palaišana 4. Reģistrējiet kopējo skaitu testu Testa rezultāti 5. Nosacījuma vaicājuma testa norādīšana 300 000. ieraksts vaicājumu datu bāzē ir 610 300. 4. Kopsavilkums: Guid izmantošana kā galvenā atslēga nav ļoti lēna, bet tā ir ātrāka nekā automātiskās augšanas soļu izmantošana.
|