Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 13193|Antwort: 0

[Tipps] Vergleichen Sie die Leistung des Primärschlüssels des Guid-Feldes mit dem selbstinkrementellen Feld in der Bibliothek

[Link kopieren]
Veröffentlicht am 26.10.2015 09:37:04 | | | |
1. Überblick:

In unserem Datenbankdesign ist der Primärschlüssel der Datenbank unerlässlich, und das Design des Primärschlüssels hat großen Einfluss auf das Design der gesamten Datenbank. Ich werde die Leistung von auto-inkrementellen Feldern und Guid-Feldern vergleichen, willkommen zum Diskutieren.

2. Einleitung:

1. Selbstinkrementative Felder

      Die selbst-inkrementellen Felder werden jedes Mal sequentiell erhöht, sodass die Primärschlüssel in einer Tabelle nicht wiederholt werden. Sofern der maximale Wert des selbstinkrementierenden Feldtyps nicht überschritten und von Grund auf neu erhöht wird, ist dies nahezu unmöglich. Es ist sehr einfach, selbstinkrementelle Felder als Primärschlüssel zu verwenden, in der Regel einfach selbstinkrementierende Attribute beim Erstellen einer Tabelle zu deklarieren.

      Selbstinkrementelle Werte sind alle globalen Datenwerte, die im System gepflegt werden müssen, und der Wert wird jedes Mal erhöht, wenn die Daten eingefügt werden. In einer gleichzeitigen Umgebung, in der das Äquivalent eine eindeutige Identität erzeugt, muss jeder inkrementelle Wert mit diesem globalen Wert gesperrt und entsperrt werden, um die Einzigartigkeit des Inkrements sicherzustellen. Dies kann ein gleichzeitiger Engpass sein, der mit einigen Leistungsproblemen verbunden ist.

Beim Migrieren oder Importieren von Daten können selbstinkrementelle Felder dupliziert werden, was zweifellos ein Albtraum ist (darunter habe ich bereits gelitten).

      Wenn Sie eine verteilte Datenbank aufbauen wollen, ist dieses selbstinkrementelle Feld ein Problem. Dies liegt daran, dass in einer verteilten Datenbank Tabellen mit demselben Namen aus verschiedenen Datenbanken möglicherweise synchron repliziert werden müssen. Der selbstinkrementelle Wert einer Datenbanktabelle wird wahrscheinlich mit dem selbstinkrementellen Wert derselben Tabelle in einer anderen Datenbank dupliziert.

2. Einzigartiger Identifikator (Guid) Feld

In MS SQL-Datenbanken kann die Tabellenstruktur erstellt werden, indem der Feldtyp als Uniqueidentifier angegeben wird, und ihr Standardwert kann mit NewID() generiert werden, um einen eindeutigen Guid (Globally Unique Identifier) zu erzeugen.

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

Der Vorteil von GUID ist, dass die generierte ID relativ einzigartig ist; egal ob beim Export von Daten oder Schritt-für-Schritt-Entwicklung – es gibt keine Probleme. Die erzeugte ID ist jedoch relativ lang, und auch der Datenbankspeicher ist belegt, sodass dies nicht berücksichtigt werden muss, da der Preis für externen Speicher sinkt. Außerdem ist Guid nicht leicht zu merken und in dieser Hinsicht nicht so gut wie automatische inkrementelle Felder, was beim Debuggen von Programmen nicht sehr praktisch ist.

3. Tests:

1. Die Umgebung testen

Betriebssystem: Windows Server 2003 R2 Enterprise Edition Service Pack 2

Datenbank: MS SQL 2005

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

Speicher: DDRII. 667 1G

Festplatte: WD 80G

2. Datenbankskripte
  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 kopieren
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 kopieren
3. Datenbank-Einfügungstest
Test 1
Das Datenbankvolumen umfasst: 100 Einträge
Führe das Ergebnis aus
Test 2
Das Datenbankvolumen umfasst: 10.000 Einträge
Führe das Ergebnis aus

Test 3
Das Datenbankvolumen umfasst: 100.000 Einträge
Führe das Ergebnis aus
Test 4
Das Datenbankvolumen umfasst: 500.000 Einträge
Führe das Ergebnis aus
4. Lesen Sie die Daten in den Datensatz ein
Test 1
Menge der gelesenen Daten: 100
Führe das Ergebnis aus
Test 2
Menge der gelesenen Daten: 10.000
Führe das Ergebnis aus
Test 3
Menge der gelesenen Daten: 100.000
Führe das Ergebnis aus
Test 4
Lesenzahl: 500.000
Führe das Ergebnis aus
4. Aufzeichnung des Gesamtnummertests
Testergebnisse
5. Spezifizieren Sie den Condition-Query-Test
Der 300.000. Datensatz in der Abfragedatenbank beträgt 610.300.
4. Zusammenfassung:
Guid als Hauptschlüssel zu verwenden ist nicht sehr langsam, aber schneller als automatische Wachstumsschritte.





Vorhergehend:asp.net binäre Base64-Inhalte in Bilder umwandeln und lokal speichern
Nächster:String[3]: Die Eigenschaft Size hat eine ungültige Größe von 0.
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com