Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 13193|Atbildi: 0

[Padomi] Salīdziniet lauka Guid primārās atslēgas veiktspēju, izmantojot bibliotēkas pašpieauguma lauku

[Kopēt saiti]
Publicēts 26.10.2015 09:37:04 | | | |
1. Pārskats:

Mūsu datu bāzes noformējumā datu bāzes primārā atslēga ir būtiska, un primārās atslēgas noformējumam ir liela ietekme uz visas datu bāzes noformējumu. Es salīdzināšu automātisko pakāpenisko lauku un Guid lauku veiktspēju, laipni lūdzam apspriest.

2. Ievads:

1. Pašpakāpeniskie lauki

      Pašpakāpeniskie lauki katru reizi tiek secīgi palielināti, nodrošinot, ka tabulas primārās atslēgas netiek atkārtotas. Ja vien netiek pārsniegta un palielināta pašpalielinoša lauka tipa maksimālā vērtība, tas ir gandrīz neiespējami. Ir ļoti vienkārši izmantot pašpakāpeniskos laukus kā primārās atslēgas, parasti vienkārši deklarējiet pašpalielinošus atribūtus, veidojot tabulu.

      Pašpieauguma vērtības ir visas globālās datu vērtības, kas jāuztur sistēmā, un vērtība tiek palielināta katru reizi, kad dati tiek ievietoti. Vienlaicīgā vidē, kur ekvivalents ģenerē unikālu identitāti, katra pieauguma vērtība ir jābloķē un jāatbloķē ar šo globālo vērtību, lai nodrošinātu pieauguma unikalitāti. Tas var būt vienlaicīgs sastrēgums, kas ietver dažas veiktspējas problēmas.

Migrējot vai importējot datus, pašpieauguma lauki var tikt dublēti, kas neapšaubāmi ir murgs (es jau esmu cietis no tā).

      Ja vēlaties izveidot izplatītu datu bāzi, šis pašpakāpeniskais lauks ir problēma. Tas ir tāpēc, ka izplatītā datu bāzē tabulas ar vienādu nosaukumu no dažādām datu bāzēm var būt jāreplicē sinhroni. Datu bāzes tabulas pašpieauguma vērtība, visticamāk, tiks dublēta ar tās pašas tabulas pašpieauguma vērtību citā datu bāzē.

2. Lauks uniqueidentifier (GUID)

MS SQL datu bāzēs tabulas struktūru var izveidot, norādot lauka tipu kā uniqueidentifier, un tā noklusējuma vērtību var ģenerēt, izmantojot NewID(), lai ģenerētu unikālu Guid (Globally Unique Identifier).

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

GUID priekšrocība ir tā, ka ģenerētais ID ir salīdzinoši unikāls, neatkarīgi no tā, vai tas eksportē datus vai veic pakāpenisku izstrādi, problēmu nebūs. Tomēr tā ģenerētais ID ir salīdzinoši garš, un arī datu bāzes vieta ir aizņemta, tāpēc tas nav jāņem vērā, jo ārējās atmiņas cena samazinās. Turklāt Guid nav viegli atcerēties, un šajā ziņā tas nav tik labs kā automātiskie pakāpeniskie lauki, kas nav ļoti ērti, atkļūdojot programmas.

3. Testēšana:

1. Pārbaudiet vidi

Operētājsistēma: Windows Server 2003 R2 Enterprise Edition 2. servisa pakotne

Datu bāze: MS SQL 2005

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

Atmiņa: DDRII. 667 1G

Cietais disks: WD 80G

2. Datu bāzes skripti
  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
Kopēt kodu
Testa kods
  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
Kopēt kodu
3. Datu bāzes ievietošanas tests
1. pārbaude
Datu bāzes apjoms ir: 100 vienības
Rezultāta palaišana
2. pārbaude
Datu bāzes apjoms ir: 10,000 vienības
Rezultāta palaišana

3. pārbaude
Datu bāzes apjoms ir: 100 000 vienību
Rezultāta palaišana
4. pārbaude
Datu bāzes apjoms ir: 500 000 vienību
Rezultāta palaišana
4. Datu lasīšana datu kopā
1. pārbaude
Nolasīto datu apjoms: 100
Rezultāta palaišana
2. pārbaude
Nolasīto datu apjoms: 10 000
Rezultāta palaišana
3. pārbaude
Nolasīto datu apjoms: 100 000
Rezultāta palaišana
4. pārbaude
Nolasīto datu apjoms: 500 000
Rezultāta palaišana
4. Reģistrējiet kopējo skaitu testu
Testa rezultāti
5. Nosacījuma vaicājuma testa norādīšana
300 000. ieraksts vaicājumu datu bāzē ir 610 300.
4. Kopsavilkums:
Guid izmantošana kā galvenā atslēga nav ļoti lēna, bet tā ir ātrāka nekā automātiskās augšanas soļu izmantošana.





Iepriekšējo:asp.net pārvērst bināro Base64 saturu attēlos un saglabāt tos lokāli
Nākamo:Virkne[3]: rekvizīta Size lielums ir nederīgs 0.
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com