Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 13193|Svar: 0

[Tips] Sammenlign ydeevnen af primærnøglen i Guid-feltet ved hjælp af det selv-inkrementelle felt i biblioteket

[Kopier link]
Opslået på 26/10/2015 09.37.04 | | | |
1. Oversigt:

I vores databasedesign er databasens primære nøgle essentiel, og designet af primærnøglen har stor indflydelse på designet af hele databasen. Jeg vil sammenligne ydeevnen for auto-inkrementelle felter og Guid-felter, velkommen til at diskutere.

2. Introduktion:

1. Selvinkrementelle felter

      De selvinkrementelle felter øges sekventielt hver gang, hvilket sikrer, at primærnøglerne i en tabel ikke gentages. Medmindre den maksimale værdi af den selv-inkrementerende felttype overskrides og øges fra bunden, er dette næsten umuligt. Det er meget nemt at bruge selv-inkrementelle felter som primærnøgler, generelt blot deklarere selv-inkrementerende attributter, når man bygger en tabel.

      Selvinkrementelle værdier er alle globale dataværdier, der skal vedligeholdes i systemet, og værdien øges hver gang dataene indsættes. I et samtidig miljø, hvor den tilsvarende genererer en unik identitet, skal hver inkrementvis værdi låses og låses op med denne globale værdi for at sikre inkrementets unikhed. Dette kan være en samtidig flaskehals, der involverer visse ydelsesproblemer.

Når man migrerer eller importerer data, kan selvinkrementelle felter blive duplikeret, hvilket uden tvivl er et mareridt (jeg har allerede lidt under det).

      Hvis du vil bygge en distribueret database, er dette selv-inkrementelle felt et problem. Dette skyldes, at tabeller med samme navn fra forskellige databaser i en distribueret database muligvis skal replikeres synkront. Den selv-inkrementelle værdi af en databasetabel vil sandsynligvis blive duplikeret med den selv-inkrementelle værdi af den samme tabel i en anden database.

2. unikt identifikatorfelt (Guid)

I MS SQL-databaser kan tabelstrukturen oprettes ved at angive felttypen som unikidentifikator, og dens standardværdi kan genereres ved hjælp af NewID() for at generere en unik Guid (Globally Unique Identifier).

Guid:指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,其算法是通过以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字生成。其格式为:04755396-9A29-4B8C-A38D-00042C1B9028.

Fordelen ved GUID er, at den genererede ID er relativt unik; uanset om det eksporterer data eller laver trin-for-trin udvikling, vil der ikke være problemer. Dog er den ID, den genererer, relativt lang, og databasepladsen er også optaget, så der er ikke behov for at tage højde for dette, da prisen på ekstern lagring falder. Derudover er Guid ikke let at huske, og i denne henseende er det ikke lige så godt som automatiske inkrementelle felter, hvilket ikke er særlig praktisk ved fejlfinding af programmer.

3. Testning:

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

Hukommelse: DDRII. 667 1G

Harddisk: WD 80G

2. Databasescripts
  1. --自增量字段表
  2. CREATE TABLE [dbo].[Table_Id](
  3.     [Id] [int] IDENTITY(1,1) NOT NULL,
  4.     [Value] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
  5. CONSTRAINT [PK_Table_Id] PRIMARY KEY CLUSTERED
  6. (
  7.     [Id] ASC
  8. )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
  9. ) ON [PRIMARY]

  10. GO
  11. --Guid字段表
  12. CREATE TABLE [dbo].[Table_Guid](
  13.     [Guid] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Table_Guid_Guid]  DEFAULT (newid()),
  14.     [Value] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
  15. CONSTRAINT [PK_Table_Guid] PRIMARY KEY CLUSTERED
  16. (
  17.     [Guid] ASC
  18. )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
  19. ) ON [PRIMARY]

  20. GO
Kopier kode
Testkode
  1. 1using System;
  2.   2using System.Collections.Generic;
  3.   3using System.Text;
  4.   4using System.Data.SqlClient;
  5.   5using System.Diagnostics;
  6.   6using System.Data;
  7.   8namespace GuidTest
  8.   9{
  9.    class Program
  10.    {
  11.        string Connnection = "server=.;database=GuidTest;Integrated Security=true;";
  12.        static void Main(string[] args)
  13.        {
  14.            Program app = new Program();
  15.            int Count = 10000;
  16.            Console.WriteLine("数据记录数为{0}",Count);
  17.            //自动id增长测试;
  18.            Stopwatch WatchId = new Stopwatch();
  19.            Console.WriteLine("自动增长id测试");
  20.            Console.WriteLine("开始测试");
  21.            WatchId.Start();
  22.            Console.WriteLine("测试中");
  23. 25            app.Id_InsertTest(Count);
  24.            //app.Id_ReadToTable(Count);
  25.            //app.Id_Count();
  26. 29            //查询第300000条记录;
  27.            //app.Id_SelectById();
  28. 32            WatchId.Stop();
  29.            Console.WriteLine("时间为{0}毫秒",WatchId.ElapsedMilliseconds);
  30.            Console.WriteLine("测试结束");
  31. 36            Console.WriteLine("-----------------------------------------");
  32.            //Guid测试;
  33.            Console.WriteLine("Guid测试");
  34.            Stopwatch WatchGuid = new Stopwatch();
  35.            Console.WriteLine("开始测试");
  36.            WatchGuid.Start();
  37.            Console.WriteLine("测试中");
  38. 44            app.Guid_InsertTest(Count);
  39.            //app.Guid_ReadToTable(Count);
  40.            //app.Guid_Count();
  41. 48            //查询第300000条记录;
  42.            //app.Guid_SelectById();
  43. 51            WatchGuid.Stop();
  44.            Console.WriteLine("时间为{0}毫秒", WatchGuid.ElapsedMilliseconds);
  45.            Console.WriteLine("测试结束");
  46.            Console.Read();
  47.        }
  48. 57        /**////
  49.        /// 自动增长id测试
  50.        ///
  51.        private void Id_InsertTest(int count)
  52.        {
  53.            string InsertSql="insert into Table_Id ([Value]) values ({0})";
  54.            using (SqlConnection conn = new SqlConnection(Connnection))
  55.            {
  56.                conn.Open();
  57.                SqlCommand com = new SqlCommand();
  58.                for (int i = 0; i < count; i++)
  59.                {
  60.                    com.Connection = conn;
  61.                    com.CommandText = string.Format(InsertSql, i);
  62.                    com.ExecuteNonQuery();
  63.                }
  64.            }
  65.        }
  66. 76        /**////
  67.        /// 将数据读到Table
  68.        ///
  69.        private void Id_ReadToTable(int count)
  70.        {
  71.            string ReadSql = "select top " + count.ToString() + " * from Table_Id";
  72.            using (SqlConnection conn = new SqlConnection(Connnection))
  73.            {
  74.                SqlCommand com = new SqlCommand(ReadSql, conn);
  75.                SqlDataAdapter adapter = new SqlDataAdapter(com);
  76.                DataSet ds = new DataSet();
  77.                adapter.Fill(ds);
  78.                Console.WriteLine("数据记录数为:{0}", ds.Tables[0].Rows.Count);
  79.            }
  80.        }
  81. 92        /**////
  82.        /// 数据记录行数测试
  83.        ///
  84.        private void Id_Count()
  85.        {
  86.            string ReadSql = "select Count(*) from Table_Id";
  87.            using (SqlConnection conn = new SqlConnection(Connnection))
  88.            {
  89.                SqlCommand com = new SqlCommand(ReadSql, conn);
  90.                conn.Open();
  91.                object CountResult = com.ExecuteScalar();
  92.                conn.Close();
  93.                Console.WriteLine("数据记录数为:{0}",CountResult);
  94.            }
  95.        }
  96. 108        /**////
  97.        /// 根据id查询;
  98.        ///
  99.        private void Id_SelectById()
  100.        {
  101.            string ReadSql = "select * from Table_Id where Id="+300000;
  102.            using (SqlConnection conn = new SqlConnection(Connnection))
  103.            {
  104.                SqlCommand com = new SqlCommand(ReadSql, conn);
  105.                conn.Open();
  106.                object IdResult = com.ExecuteScalar();
  107.                Console.WriteLine("Id为{0}", IdResult);
  108.                conn.Close();
  109.            }
  110.        }
  111.       
  112.        /**////
  113.        /// Guid测试;
  114.        ///
  115.        private void Guid_InsertTest(int count)
  116.        {
  117.            string InsertSql = "insert into Table_Guid ([Value]) values ({0})";
  118.            using (SqlConnection conn = new SqlConnection(Connnection))
  119.            {
  120.                conn.Open();
  121.                SqlCommand com = new SqlCommand();
  122.                for (int i = 0; i < count; i++)
  123.                {
  124.                    com.Connection = conn;
  125.                    com.CommandText = string.Format(InsertSql, i);
  126.                    com.ExecuteNonQuery();
  127.                }
  128.            }
  129.        }
  130. 143        /**////
  131.        /// Guid格式将数据库读到Table
  132.        ///
  133.        private void Guid_ReadToTable(int count)
  134.        {
  135.            string ReadSql = "select top "+count.ToString()+" * from Table_GuID";
  136.            using (SqlConnection conn = new SqlConnection(Connnection))
  137.            {
  138.                SqlCommand com = new SqlCommand(ReadSql, conn);
  139.                SqlDataAdapter adapter = new SqlDataAdapter(com);
  140.                DataSet ds = new DataSet();
  141.                adapter.Fill(ds);
  142.                Console.WriteLine("数据记录为:{0}", ds.Tables[0].Rows.Count);
  143.            }
  144.        }
  145. 159        /**////
  146.        /// 数据记录行数测试
  147.        ///
  148.        private void Guid_Count()
  149.        {
  150.            string ReadSql = "select Count(*) from Table_Guid";
  151.            using (SqlConnection conn = new SqlConnection(Connnection))
  152.            {
  153.                SqlCommand com = new SqlCommand(ReadSql, conn);
  154.                conn.Open();
  155.                object CountResult = com.ExecuteScalar();
  156.                conn.Close();
  157.                Console.WriteLine("数据记录为:{0}", CountResult);
  158.            }
  159.        }
  160. 175        /**////
  161.        /// 根据Guid查询;
  162.        ///
  163.        private void Guid_SelectById()
  164.        {
  165.            string ReadSql = "select * from Table_Guid where Guid='C1763624-036D-4DB9-A1E4-7E16318C30DE'";
  166.            using (SqlConnection conn = new SqlConnection(Connnection))
  167.            {
  168.                SqlCommand com = new SqlCommand(ReadSql, conn);
  169.                conn.Open();
  170.                object IdResult = com.ExecuteScalar();
  171.                Console.WriteLine("Guid为{0}", IdResult);
  172.                conn.Close();
  173.            }
  174.        }
  175.    }
  176. 192}
  177. 193
Kopier kode
3. Databaseindsættelsestest
Test 1
Databasevolumen består af: 100 elementer
Kør resultatet
Test 2
Databasevolumen er: 10.000 elementer
Kør resultatet

Test 3
Databasevolumen er: 100.000 elementer
Kør resultatet
Test 4
Databasevolumen er: 500.000 elementer
Kør resultatet
4. Læs dataene ind i Datasættet
Test 1
Mængde læste data: 100
Kør resultatet
Test 2
Mængde læste data: 10.000
Kør resultatet
Test 3
Mængde læste data: 100.000
Kør resultatet
Test 4
Mængde læste data: 500.000
Kør resultatet
4. Registrer totaltaltesten
Testresultater
5. Angiv betingelsesforespørgselstesten
Den 300.000. post i forespørgselsdatabasen er 610.300.
4. Resumé:
At bruge Guid som hovednøgle er ikke særlig langsomt, men det er hurtigere end at bruge automatisk voksende inkrementer.





Tidligere:asp.net konverterer binært Base64-indhold til billeder og gemmer dem lokalt
Næste:Streng[3]: Størrelsesegenskaben har en ugyldig størrelse på 0.
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com