Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 13193|Jawab: 0

[Kiat] Bandingkan performa kunci primer bidang Guid menggunakan bidang inkremental mandiri di pustaka

[Salin tautan]
Diposting pada 26/10/2015 09.37.04 | | | |
1. Gambaran Umum:

Dalam desain database kami, kunci primer database sangat penting, dan desain kunci primer memiliki dampak besar pada desain seluruh database. Saya akan membandingkan kinerja bidang inkremental otomatis dan bidang Guid, selamat datang untuk berdiskusi.

2. Pengantar:

1. Bidang inkremental sendiri

      Bidang inkremental sendiri ditingkatkan secara berurutan setiap kali, memastikan bahwa kunci utama dalam tabel tidak diulang. Kecuali nilai maksimum jenis bidang self-incrementing terlampaui dan bertambah dari awal, ini hampir tidak mungkin. Sangat mudah untuk menggunakan bidang inkremental sendiri sebagai kunci utama, umumnya hanya mendeklarasikan atribut bertambah sendiri saat membuat tabel.

      Nilai inkremental mandiri adalah semua nilai data global yang perlu dipertahankan dalam sistem, dan nilainya bertambah setiap kali data dimasukkan. Dalam lingkungan bersamaan di mana yang setara menghasilkan identitas unik, setiap nilai inkremental harus dikunci dan dibuka kuncinya dengan nilai global ini untuk memastikan keunikan peningkatan. Ini bisa menjadi kemacetan bersamaan yang melibatkan beberapa masalah kinerja.

Saat memigrasikan atau mengimpor data, bidang inkremental sendiri dapat diduplikasi, yang tidak diragukan lagi merupakan mimpi buruk (saya sudah menderita karenanya).

      Jika Anda ingin membangun database terdistribusi, bidang inkremental mandiri ini menjadi masalah. Ini karena dalam database terdistribusi, tabel dengan nama yang sama dari database yang berbeda mungkin perlu direplikasi secara sinkron. Nilai inkremental sendiri dari tabel database kemungkinan akan diduplikasi dengan nilai inkremental sendiri dari tabel yang sama di database lain.

2. bidang uniqueidentifier (Guid)

Dalam database MS SQL, struktur tabel dapat dibuat dengan menentukan jenis bidang sebagai uniqueidentifier, dan nilai defaultnya dapat dihasilkan menggunakan NewID() untuk menghasilkan Guid unik (Globally Unique Identifier).

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

Keuntungan dari GUID adalah ID yang dihasilkan relatif unik, baik itu mengekspor data atau melakukan pengembangan langkah demi langkah, tidak akan ada masalah. Namun, ID yang dihasilkannya relatif panjang, dan ruang database juga terisi, sehingga tidak perlu mempertimbangkan hal ini karena harga penyimpanan eksternal menurun. Selain itu, Guid tidak mudah diingat, dan dalam hal ini tidak sebaik bidang inkremental otomatis, yang tidak terlalu nyaman saat men-debug program.

3. Pengujian:

1. Uji lingkungan

Sistem operasi: Windows Server 2003 R2 Enterprise Edition Service Pack 2

Basis data: MS SQL 2005

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

Memori: DDRII. 667 1G

Hard drive: WD 80G

2. Skrip database
  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
Salin kode
Kode pengujian
  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
Salin kode
3. Tes penyisipan database
Tes 1
Volume database adalah: 100 item
Jalankan hasilnya
Tes 2
Volume basis data adalah: 10.000 item
Jalankan hasilnya

Tes 3
Volume database adalah: 100.000 item
Jalankan hasilnya
Tes 4
Volume basis data adalah: 500.000 item
Jalankan hasilnya
4. Baca data ke dalam DataSet
Tes 1
Jumlah data yang dibaca: 100
Jalankan hasilnya
Tes 2
Jumlah data yang dibaca: 10.000
Jalankan hasilnya
Tes 3
Jumlah data yang dibaca: 100.000
Jalankan hasilnya
Tes 4
Jumlah data yang dibaca: 500.000
Jalankan hasilnya
4. Catat tes jumlah total
Hasil tes
5. Tentukan pengujian kueri kondisi
Rekaman ke-300.000 dalam database kueri adalah 610.300.
4. Ringkasan:
Menggunakan Guid sebagai kunci utama tidak terlalu lambat, tetapi lebih cepat daripada menggunakan peningkatan pertumbuhan otomatis.





Mantan:asp.net mengonversi konten Base64 biner menjadi gambar dan menyimpannya secara lokal
Depan:String[3]: properti Size memiliki ukuran tidak valid 0.
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com