Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 13193|Odgovoriti: 0

[Napitnine] Primerjajte zmogljivost primarnega ključa polja Guid z uporabo samoinkrementalnega polja v knjižnici

[Kopiraj povezavo]
Objavljeno na 26. 10. 2015 09:37:04 | | | |
1. Pregled:

Pri oblikovanju naše baze podatkov je primarni ključ baze bistvenega pomena, oblikovanje primarnega ključa pa močno vpliva na zasnovo celotne baze podatkov. Primerjal bom zmogljivost samodejno inkrementalnih polj in Guid polj, dobrodošli za razpravo.

2. Uvod:

1. Samoinkrementalna polja

      Samoinkrementalna polja se vsakič zaporedoma povečujejo, kar zagotavlja, da se primarni ključi v tabeli ne ponavljajo. Če največja vrednost samopovečevajoče se vrste polja ni presežena in povečana od začetka, je to skoraj nemogoče. Zelo enostavno je uporabiti samoinkrementalna polja kot primarne ključe, običajno samo deklarirati samoinkrementne atribute pri sestavi tabele.

      Samoinkrementalne vrednosti so vse globalne podatkovne vrednosti, ki jih je treba vzdrževati v sistemu, vrednost pa se povečuje vsakič, ko se podatki vnesejo. V sočasnem okolju, kjer ekvivalent generira edinstveno identiteto, mora biti vsaka inkrementalna vrednost zaklenjena in odklenjena s to globalno vrednostjo, da se zagotovi edinstvenost inkrementa. To je lahko sočasno ozko grlo, ki vključuje nekatere težave z zmogljivostjo.

Pri migraciji ali uvozu podatkov se lahko samoinkrementalna polja podvajajo, kar je nedvomno nočna mora (sam sem že trpel zaradi tega).

      Če želite zgraditi porazdeljeno bazo podatkov, je to samoinkrementalno področje problem. To je zato, ker je v distribuirani bazi podatkov mogoče sinhrono replicirati tabele z istim imenom iz različnih podatkov. Samoinkrementalna vrednost tabele baze podatkov se verjetno podvoji s samoinkrementalno vrednostjo iste tabele v drugi bazi.

2. polje uniqueidentifier (GID)

V bazah podatkov MS SQL je mogoče strukturo tabele ustvariti z določitvijo vrste polja kot edinstvenega identifikatorja, privzeta vrednost pa se lahko generira z uporabo NewID() za generiranje edinstvenega GID-a (globalno edinstven identifikator).

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

Prednost GUID je, da je generirani ID razmeroma edinstven, ne glede na to, ali izvažate podatke ali izvajate razvoj korak za korakom, ne bo težav. Vendar je ID, ki ga ustvari, razmeroma dolg, poleg tega pa je tudi prostor v bazi podatkov zaseden, zato tega ni treba upoštevati, saj cena zunanjega shranjevanja pada. Poleg tega Guid ni enostaven za zapomnitev in v tem pogledu ni tako dober kot samodejna inkrementalna polja, kar ni zelo priročno pri odpravljanju napak programov.

3. Testiranje:

1. Preizkusi okolje

Operacijski sistem: Windows Server 2003 R2 Enterprise Edition Service Pack 2

Baza podatkov: MS SQL 2005

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

Pomnilnik: DDRII. 667 1G

Trdi disk: WD 80G

2. Skripte za podatkovne baze
  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
Kopiraj kodo
Testna koda
  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
Kopiraj kodo
3. Test vstavljanja v bazo podatkov
Test 1
Obseg podatkovne baze je: 100 enot
Zaženi rezultat
Test 2
Obseg podatkovne baze je: 10.000 enot
Zaženi rezultat

Test 3
Obseg podatkovne baze je: 100.000 enot
Zaženi rezultat
Test 4
Obseg podatkovne baze je: 500.000 enot
Zaženi rezultat
4. Preberi podatke v DataSet
Test 1
Količina prebranih podatkov: 100
Zaženi rezultat
Test 2
Količina prebranih podatkov: 10.000
Zaženi rezultat
Test 3
Količina podatkov: 100.000
Zaženi rezultat
Test 4
Količina prebranih podatkov: 500.000
Zaženi rezultat
4. Zabeležite test skupnega števila
Rezultati testov
5. Določite test pogojne poizvedbe
300.000. zapis v bazi poizvedb je 610.300.
4. Povzetek:
Uporaba Guid kot glavne tipke ni zelo počasna, je pa hitrejša kot uporaba samodejnih naraščajočih korakov.





Prejšnji:asp.net pretvori binarno Base64 vsebino v slike in jih lokalno shrani
Naslednji:Niz[3]: lastnost Velikost ima neveljavno velikost 0.
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com