Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 13193|Antwoord: 0

[Tips] Vergelijk de prestaties van de primaire sleutel van het Guid-veld met behulp van het zelf-incrementele veld in de bibliotheek

[Link kopiëren]
Geplaatst op 26-10-2015 09:37:04 | | | |
1. Overzicht:

In ons databaseontwerp is de primaire sleutel van de database essentieel, en het ontwerp van de primaire sleutel heeft een grote invloed op het ontwerp van de hele database. Ik zal de prestaties vergelijken van auto-incrementele velden en Guid-velden, welkom om te discussiëren.

2. Inleiding:

1. Zelf-incrementele velden

      De zelf-incrementele velden worden elke keer sequentieel geïntroduceerd, zodat de primaire sleutels in een tabel niet worden herhaald. Tenzij de maximale waarde van het zelfverhogende veldtype wordt overschreden en vanaf nul wordt verhoogd, is dit vrijwel onmogelijk. Het is heel eenvoudig om zelf-incrementele velden als primaire sleutels te gebruiken, meestal declareer je gewoon zelf-incrementerende attributen bij het bouwen van een tabel.

      Zelf-incrementele waarden zijn alle globale datawaarden die in het systeem moeten worden onderhouden, en de waarde wordt verhoogd telkens wanneer de data wordt ingevoegd. In een gelijktijdige omgeving waarin het equivalent een unieke identiteit genereert, moet elke incrementele waarde worden vergrendeld en ontgrendeld met deze globale waarde om de uniciteit van de increment te waarborgen. Dit kan een gelijktijdige bottleneck zijn die enkele prestatieproblemen met zich meebrengt.

Bij het migreren of importeren van data kunnen zelf-incrementele velden worden gedupliceerd, wat ongetwijfeld een nachtmerrie is (ik heb er al last van gehad).

      Als je een gedistribueerde database wilt bouwen, is dit zelf-incrementele veld een probleem. Dit komt doordat in een gedistribueerde database tabellen met dezelfde naam uit verschillende databases mogelijk synchroon gerepliceerd moeten worden. De zelf-incrementele waarde van een databasetabel wordt waarschijnlijk gedupliceerd met de zelf-incrementele waarde van dezelfde tabel in een andere database.

2. uniek identificatieveld (Guid)

In MS SQL-databases kan de tabelstructuur worden gemaakt door het veldtype als uniqueidentifier te specificeren, en de standaardwaarde kan worden gegenereerd met NewID() om een unieke Guid (Globally Unique Identifier) te genereren.

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

Het voordeel van GUID is dat de gegenereerde ID relatief uniek is; of het nu gaat om het exporteren van data of stapsgewijze ontwikkeling, er zullen geen problemen zijn. De ID die het genereert is echter relatief lang en de databaseruimte is ook bezet, dus dit is niet nodig om dit te overwegen nu de prijs van externe opslag daalt. Bovendien is Guid niet gemakkelijk te onthouden, en in dit opzicht is het niet zo goed als automatische incrementele velden, wat niet erg handig is bij het debuggen van programma's.

3. Testen:

1. Test de omgeving

Besturingssysteem: Windows Server 2003 R2 Enterprise Edition Service Pack 2

Database: MS SQL 2005

CPU:Intel(R) Pentium(R) 4 CPU 3.40GHz

Geheugen: DDRII. 667 1G

Harde schijf: 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
Code kopiëren
Testcode
  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
Code kopiëren
3. Database-invoegtest
Test 1
Het databasevolume is: 100 items
Voer het resultaat uit
Test 2
Het databasevolume bestaat: 10.000 items
Voer het resultaat uit

Test 3
Het databasevolume bestaat: 100.000 items
Voer het resultaat uit
Test 4
Het databasevolume bedraagt: 500.000 items
Voer het resultaat uit
4. Lees de gegevens in de DataSet
Test 1
Hoeveelheid gelezen gegevens: 100
Voer het resultaat uit
Test 2
Hoeveelheid gelezen gegevens: 10.000
Voer het resultaat uit
Test 3
Hoeveelheid gelezen gegevens: 100.000
Voer het resultaat uit
Test 4
Hoeveelheid gelezen gegevens: 500.000
Voer het resultaat uit
4. Noteer de totaaltest
Testresultaten
5. Specificeer de conditiequerytest
Het 300.000ste record in de querydatabase is 610.300.
4. Samenvatting:
Guid als hoofdsleutel gebruiken is niet erg traag, maar het is sneller dan het gebruik van automatische groei-incrementen.





Vorig:asp.net converteer binaire Base64-inhoud naar afbeeldingen en slaat deze lokaal op
Volgend:String[3]: de eigenschap Size heeft een ongeldige grootte van 0.
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com