Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 13193|Απάντηση: 0

[Συμβουλές] Σύγκριση των επιδόσεων του πρωτεύοντος κλειδιού του πεδίου Guid χρησιμοποιώντας το αυτοαυξητικό πεδίο στη βιβλιοθήκη

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 26/10/2015 9:37:04 π.μ. | | | |
1. Επισκόπηση:

Στο σχεδιασμό της βάσης δεδομένων μας, το πρωτεύον κλειδί της βάσης δεδομένων είναι απαραίτητο και ο σχεδιασμός του πρωτεύοντος κλειδιού έχει μεγάλο αντίκτυπο στο σχεδιασμό ολόκληρης της βάσης δεδομένων. Θα συγκρίνω την απόδοση των πεδίων αυτόματης αύξησης και των πεδίων Guid, καλώς ήρθατε να συζητήσουμε.

2. Εισαγωγή:

1. Αυτοαυξητικά πεδία

      Τα πεδία αυτοκλιμάκωσης αυξάνονται διαδοχικά κάθε φορά, διασφαλίζοντας ότι τα πρωτεύοντα κλειδιά σε έναν πίνακα δεν επαναλαμβάνονται. Εκτός εάν ξεπεραστεί η μέγιστη τιμή του τύπου πεδίου αυτόματης αύξησης και αυξηθεί από την αρχή, αυτό είναι σχεδόν αδύνατο. Είναι πολύ απλό να χρησιμοποιείτε αυτοαυξητικά πεδία ως πρωτεύοντα κλειδιά, γενικά απλώς δηλώνετε χαρακτηριστικά αυτο-αύξησης κατά τη δημιουργία ενός πίνακα.

      Οι τιμές αυτόματης αύξησης είναι όλες οι καθολικές τιμές δεδομένων που πρέπει να διατηρούνται στο σύστημα και η τιμή αυξάνεται κάθε φορά που εισάγονται τα δεδομένα. Σε ένα ταυτόχρονο περιβάλλον όπου το ισοδύναμο δημιουργεί μια μοναδική ταυτότητα, κάθε αυξητική τιμή πρέπει να κλειδωθεί και να ξεκλειδωθεί με αυτήν την καθολική τιμή για να διασφαλιστεί η μοναδικότητα της αύξησης. Αυτό μπορεί να είναι ένα ταυτόχρονο σημείο συμφόρησης που περιλαμβάνει ορισμένα ζητήματα απόδοσης.

Κατά τη μετεγκατάσταση ή την εισαγωγή δεδομένων, τα αυτοαυξητικά πεδία ενδέχεται να αντιγραφούν, κάτι που είναι αναμφίβολα ένας εφιάλτης (έχω ήδη υποφέρει από αυτό).

      Εάν θέλετε να δημιουργήσετε μια κατανεμημένη βάση δεδομένων, αυτό το αυτοαυξητικό πεδίο είναι ένα πρόβλημα. Αυτό συμβαίνει επειδή σε μια κατανεμημένη βάση δεδομένων, οι πίνακες με το ίδιο όνομα από διαφορετικές βάσεις δεδομένων μπορεί να χρειαστεί να αναπαραχθούν συγχρονισμένα. Η αυτοαυξητική τιμή ενός πίνακα βάσης δεδομένων είναι πιθανό να αντιγραφεί με την αυτοαυξητική τιμή του ίδιου πίνακα σε άλλη βάση δεδομένων.

2. Πεδίο uniqueidentifier (Guid)

Στις βάσεις δεδομένων MS SQL, η δομή του πίνακα μπορεί να δημιουργηθεί καθορίζοντας τον τύπο πεδίου ως uniqueidentifier και η προεπιλεγμένη τιμή του μπορεί να δημιουργηθεί χρησιμοποιώντας το NewID() για τη δημιουργία ενός μοναδικού Guid (Globally Unique Identifier).

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

Το πλεονέκτημα του GUID είναι ότι το αναγνωριστικό που δημιουργείται είναι σχετικά μοναδικό, είτε πρόκειται για εξαγωγή δεδομένων είτε για ανάπτυξη βήμα προς βήμα, δεν θα υπάρχουν προβλήματα. Ωστόσο, το αναγνωριστικό που δημιουργεί είναι σχετικά μεγάλο και ο χώρος της βάσης δεδομένων είναι επίσης κατειλημμένος, επομένως δεν χρειάζεται να το λάβετε υπόψη καθώς η τιμή της εξωτερικής αποθήκευσης μειώνεται. Επιπλέον, το Guid δεν είναι εύκολο να το θυμάστε και από αυτή την άποψη δεν είναι τόσο καλό όσο τα αυτόματα αυξητικά πεδία, κάτι που δεν είναι πολύ βολικό κατά τον εντοπισμό σφαλμάτων προγραμμάτων.

3. Δοκιμή:

1. Δοκιμάστε το περιβάλλον

Λειτουργικό σύστημα: Windows Server 2003 R2 Enterprise Edition Service Pack 2

Βάση δεδομένων: MS SQL 2005

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

Μνήμη: DDRII. 667 1G

Σκληρός δίσκος: WD 80G

2. Σενάρια βάσης δεδομένων
  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
Αντιγραφή κώδικα
Κωδικός δοκιμής
  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
Αντιγραφή κώδικα
3. Δοκιμή εισαγωγής βάσης δεδομένων
Δοκιμή 1
Ο όγκος της βάσης δεδομένων είναι: 100 αντικείμενα
Εκτελέστε το αποτέλεσμα
Δοκιμή 2
Ο όγκος της βάσης δεδομένων είναι: 10.000 αντικείμενα
Εκτελέστε το αποτέλεσμα

Δοκιμή 3
Ο όγκος της βάσης δεδομένων είναι: 100.000 αντικείμενα
Εκτελέστε το αποτέλεσμα
Δοκιμή 4
Ο όγκος της βάσης δεδομένων είναι: 500.000 αντικείμενα
Εκτελέστε το αποτέλεσμα
4. Διαβάστε τα δεδομένα στο σύνολο δεδομένων
Δοκιμή 1
Ποσότητα δεδομένων που αναγνώστηκαν: 100
Εκτελέστε το αποτέλεσμα
Δοκιμή 2
Ποσότητα δεδομένων που διαβάστηκαν: 10.000
Εκτελέστε το αποτέλεσμα
Δοκιμή 3
Ποσότητα δεδομένων που αναγνώστηκαν: 100.000
Εκτελέστε το αποτέλεσμα
Δοκιμή 4
Ποσότητα δεδομένων που αναγνώστηκαν: 500.000
Εκτελέστε το αποτέλεσμα
4. Καταγράψτε τη δοκιμή συνολικού αριθμού
Αποτελέσματα δοκιμών
5. Καθορίστε τη δοκιμή ερωτήματος συνθήκης
Η 300.000η εγγραφή στη βάση δεδομένων ερωτημάτων είναι 610.300.
4. Περίληψη:
Η χρήση του Guid ως κύριου κλειδιού δεν είναι πολύ αργή, αλλά είναι ταχύτερη από τη χρήση προσαυξήσεων αυτόματης ανάπτυξης.





Προηγούμενος:asp.net μετατρέψτε το δυαδικό περιεχόμενο Base64 σε εικόνες και αποθηκεύστε τις τοπικά
Επόμενος:String[3]: η ιδιότητα Size έχει μη έγκυρο μέγεθος 0.
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com