Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 13193|Répondre: 0

[Pourboires] Comparez la performance de la clé primaire du champ Guid en utilisant le champ auto-incrémental dans la bibliothèque

[Copié le lien]
Publié sur 26/10/2015 09:37:04 | | | |
1. Aperçu :

Dans la conception de notre base de données, la clé primaire de la base de données est essentielle, et la conception de la clé primaire a un grand impact sur la conception de l’ensemble de la base de données. Je vais comparer la performance des champs auto-incrémentaux et des champs Guy, bienvenue pour en discuter.

2. Introduction :

1. Champs auto-incrémentaux

      Les champs auto-incrémentaux sont incrémentés séquentiellement à chaque fois, garantissant que les clés primaires d’une table ne soient pas répétées. À moins que la valeur maximale du type de champ auto-incrémentable ne soit dépassée et incrémentée à partir de zéro, cela devient presque impossible. Il est très simple d’utiliser des champs auto-incrémentaux comme clés primaires, en général il suffit de déclarer des attributs auto-incrémentants lors de la construction d’une table.

      Les valeurs auto-incrémentales sont toutes des valeurs globales de données qui doivent être maintenues dans le système, et la valeur est incrémentée à chaque insertion des données. Dans un environnement concurrent où l’équivalent génère une identité unique, chaque valeur incrémentale doit être verrouillée et déverrouillée avec cette valeur globale afin d’assurer l’unicité de l’incrément. Cela peut constituer un goulot d’étranglement simultané, impliquant certains problèmes de performance.

Lors de la migration ou de l’importation de données, des champs auto-incrémentaux peuvent être dupliqués, ce qui est sans aucun doute un cauchemar (j’en ai déjà souffert).

      Si vous souhaitez construire une base de données distribuée, ce champ auto-incrémental pose problème. Cela s’explique par le fait que dans une base de données distribuée, les tables portant le même nom provenant de différentes bases de données peuvent devoir être répliquées de manière synchrone. La valeur auto-incrémentale d’une table de base de données est susceptible d’être dupliquée avec la valeur auto-incrémentale de la même table dans une autre base de données.

2. champ d’identifiant unique (Guid)

Dans les bases de données MS SQL, la structure de table peut être créée en spécifiant le type de champ comme identifiant unique, et sa valeur par défaut peut être générée avec NewID() pour générer un Guid unique (identifiant unique globalement).

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

L’avantage du GUID est que l’ID généré est relativement unique ; qu’il s’agisse d’exporter des données ou de faire un développement étape par étape, il n’y aura aucun problème. Cependant, l’ID généré est relativement long, et l’espace de la base de données est également occupé, il n’y a donc pas besoin de prendre cela en compte car le prix du stockage externe diminue. De plus, Guid n’est pas facile à retenir, et à cet égard il n’est pas aussi efficace que les champs incrémentals automatiques, ce qui n’est pas très pratique lors du débogage des programmes.

3. Tests :

1. Tester l’environnement

Système d’exploitation : Windows Server 2003 R2 Enterprise Edition Service Pack 2

Base de données : MS SQL 2005

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

Mémoire : DDRII. 667 1G

Disque dur : WD 80G

2. Scripts de base de données
  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 de copie
Code de test
  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 de copie
3. Test d’insertion de base de données
Test 1
Le volume de la base de données est : 100 éléments
Exécutez le résultat
Test 2
Le volume de la base de données est de : 10 000 éléments
Exécutez le résultat

Test 3
Le volume de la base de données est : 100 000 éléments
Exécutez le résultat
Test 4
Le volume de la base de données est de : 500 000 éléments
Exécutez le résultat
4. Lire les données dans le DataSet
Test 1
Quantité de données lues : 100
Exécutez le résultat
Test 2
Quantité de données lues : 10 000
Exécutez le résultat
Test 3
Quantité de données lues : 100 000
Exécutez le résultat
Test 4
Quantité de données lues : 500 000
Exécutez le résultat
4. Enregistrer le test total du nombre
Résultats des tests
5. Spécifier le test de requête de condition
Le 300 000e enregistrement dans la base de données de requêtes est de 610 300.
4. Résumé :
Utiliser Guid comme clé principale n’est pas très lent, mais c’est plus rapide que d’utiliser des incréments auto-croissants.





Précédent:asp.net convertir le contenu binaire Base64 en images et les stocker localement
Prochain:String[3] : la propriété Size a une taille invalide de 0.
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com