Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 13193|Odpowiedź: 0

[Napiwki] Porównaj wydajność klucza głównego pola Guid za pomocą pola samoprzyrostowego w bibliotece

[Skopiuj link]
Opublikowano 26.10.2015 09:37:04 | | | |
1. Przegląd:

W projektowaniu baz danych klucz główny bazy danych jest niezbędny, a jego projekt ma duży wpływ na projekt całej bazy danych. Porównam wydajność pól automatycznie przyrostowych i pól Guid, zapraszam do dyskusji.

2. Wprowadzenie:

1. Pola samoinkrementalne

      Pola samoprzyrostowe są za każdym razem kolejno zwiększane, co zapewnia, że klucze główne w tabeli nie są powtarzane. Jeśli maksymalna wartość samoprzyrastających pól nie zostanie przekroczona i zwiększona od zera, jest to niemal niemożliwe. Bardzo łatwo jest używać pól samoprzyrostowych jako kluczy głównych, zazwyczaj deklarując atrybuty samoprzyrostające podczas tworzenia tabeli.

      Wartości samoprzyrostowe to wszystkie globalne wartości danych, które muszą być utrzymywane w systemie, a wartość ta jest zwiększana za każdym razem, gdy dane są wprowadzane. W środowisku współbieżnym, gdzie równoważnik generuje unikalną tożsamość, każda wartość przyrostowa musi być zablokowana i odblokowana tą wartością globalną, aby zapewnić unikalność przyrostu. Może to być jednoczesne wąskie gardło, które wiąże się z pewnymi problemami wydajnościowymi.

Podczas migracji lub importu danych pola samoprzyrostowe mogą być zdublowane, co bez wątpienia jest koszmarem (sam już z tym miałem do czynienia).

      Jeśli chcesz zbudować rozproszoną bazę danych, to pole samoprzyrostowe jest problemem. Dzieje się tak, ponieważ w rozproszonej bazie danych tabele o tej samej nazwie z różnych baz mogą wymagać replikacji synchronicznej. Wartość samoprzyrostowa tabeli bazy danych prawdopodobnie zostanie zdublowana z wartością samoprzyrostową tej samej tabeli w innej bazie danych.

2. pole uniqueidentifier (Guid)

W bazach danych MS SQL strukturę tabeli można utworzyć, określając typ pola jako unikalny identyfikator, a jej domyślną wartość można wygenerować za pomocą NewID(), aby wygenerować unikalny identyfikator Guid (Globalnie Unikalny Identyfikator).

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

Zaletą GUID jest to, że generowany identyfikator jest stosunkowo unikalny – niezależnie od eksportu danych, czy rozwoju krok po kroku, nie ma problemów. Jednak generowany przez niego identyfikator jest stosunkowo długi, a przestrzeń w bazie danych również jest zajęta, więc nie ma potrzeby tego brać pod uwagę, gdy cena zewnętrznej pamięci spada. Ponadto Guid nie jest łatwy do zapamiętania i pod tym względem nie jest tak dobry jak automatyczne pola przyrostowe, co nie jest zbyt wygodne podczas debugowania programów.

3. Testowanie:

1. Testuj środowisko

System operacyjny: Windows Server 2003 R2 Enterprise Edition Service Pack 2

Baza danych: MS SQL 2005

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

Pamięć: DDRII. 667 1G

Dysk twardy: WD 80G

2. Skrypty bazodanowe
  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
Skopiuj kod
Kod testowy
  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
Skopiuj kod
3. Test wstawiania w bazie danych
Test 1
Objętość bazy danych to: 100 pozycji
Uruchom wynik
Test 2
Objętość bazy danych to: 10 000 pozycji
Uruchom wynik

Test 3
Wolumen bazy danych to: 100 000 pozycji
Uruchom wynik
Test 4
Wolumen bazy danych to: 500 000 pozycji
Uruchom wynik
4. Odczytać dane do zbioru danych
Test 1
Ilość danych: 100
Uruchom wynik
Test 2
Ilość danych: 10 000
Uruchom wynik
Test 3
Ilość danych: 100 000
Uruchom wynik
Test 4
Ilość danych: 500 000
Uruchom wynik
4. Zapisz test z całkowitą liczbą
Wyniki testów
5. Określ test zapytania warunkowego
300 000. rekord w bazie zapytań to 610 300.
4. Streszczenie:
Używanie Guid jako głównego klucza nie jest bardzo wolne, ale szybsze niż automatyczne przyrosty do wzrostu.





Poprzedni:asp.net konwertować binarne treści Base64 na obrazy i przechowywać je lokalnie
Następny:String[3]: własność Size ma nieprawidłowy rozmiar 0.
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com