Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 13193|Vastaus: 0

[Vinkkejä] Vertaa Guid-kentän ensisijaisen avaimen suorituskykyä kirjaston itseinkrementaalisen kentän avulla

[Kopioi linkki]
Julkaistu 26.10.2015 9.37.04 | | | |
1. Yleiskatsaus:

Tietokannan suunnittelussa tietokannan ensisijainen avain on olennainen, ja sen suunnittelulla on suuri vaikutus koko tietokannan suunnitteluun. Vertaan auto-inkrementaalisten kenttien ja Guid-kenttien suorituskykyä, tervetuloa keskustelemaan.

2. Johdanto:

1. Itseinkrementaaliset kentät

      Itseinkrementaalisia kenttiä kasvatetaan peräkkäin joka kerta, mikä varmistaa, että taulukon ensisijaiset avaimet eivät toistu. Ellei itsestään kasvavan kenttätyypin maksimiarvoa ylitetä ja kasvateta alusta alkaen, tämä on lähes mahdotonta. On hyvin helppoa käyttää itseinkrementaalisia kenttiä ensisijaisina avaimina, yleensä vain ilmoittaa itsestään kasvavat attribuutit taulua rakennettaessa.

      Itseinkrementaaliset arvot ovat kaikki globaaleja datan arvoja, jotka tulee ylläpitää järjestelmässä, ja arvo kasvaa aina, kun data lisätään. Samanaikaisessa ympäristössä, jossa vastaava luo ainutlaatuisen identiteetin, jokainen inkrementaalinen arvo on lukittava ja avattava tällä globaalilla arvolla, jotta lisäyksen yksilöllisyys varmistetaan. Tämä voi olla samanaikainen pullonkaula, johon liittyy suorituskykyongelmia.

Datan siirtämisessä tai tuonnissa itseinkrementaalisia kenttiä voidaan kopioida, mikä on epäilemättä painajainen (olen jo kärsinyt siitä).

      Jos haluat rakentaa hajautetun tietokannan, tämä itseinkrementaalinen kenttä on ongelma. Tämä johtuu siitä, että hajautetussa tietokannassa eri tietokannoista saatetaan tarvita samannimisiä tauluja synkronisesti. Tietokantataulun itseinkrementaalinen arvo todennäköisesti toistuu saman taulukon itseinkrementaalilla arvolla toisessa tietokannassa.

2. unikaalinen tunniste (Guid) -kenttä

MS SQL -tietokannoissa taulukkorakenne voidaan luoda määrittämällä kenttätyyppi uniqueidentifieriksi, ja sen oletusarvo voidaan generoida NewID():llä luomaan yksilöllinen Guid (Globally Unique Identifier).

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

GUID:n etuna on, että generoitu ID on suhteellisen ainutlaatuinen – olipa kyse datan viemisestä tai vaiheittaisesta kehityksestä, ongelmia ei ole. Sen tuottama ID on kuitenkin suhteellisen pitkä, ja tietokantatila on myös varattu, joten tätä ei tarvitse ottaa huomioon, sillä ulkoisen tallennustilan hinta laskee. Lisäksi Guid ei ole helppo muistaa, ja tässä suhteessa se ei ole yhtä hyvä kuin automaattiset inkrementaalikentät, mikä ei ole kovin kätevää ohjelmien virheenkorjauksessa.

3. Testaus:

1. Testaa ympäristöä

Käyttöjärjestelmä: Windows Server 2003 R2 Enterprise Edition Service Pack 2

Tietokanta: MS SQL 2005

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

Muisti: DDRII. 667 1G

Kovalevy: WD 80G

2. Tietokantaskriptit
  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
Kopioi koodi
Testikoodi
  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
Kopioi koodi
3. Tietokannan lisäystesti
Testi 1
Tietokannan tilavuus on: 100 kohdetta
Suorita tulos
Testi 2
Tietokannan tilavuus on: 10 000 kohdetta
Suorita tulos

Testi 3
Tietokannan määrä on: 100 000 kohdetta
Suorita tulos
Testi 4
Tietokannan määrä on: 500 000 kohdetta
Suorita tulos
4. Lue data DataSettiin
Testi 1
Luettujen tietojen määrä: 100
Suorita tulos
Testi 2
Luettujen tietojen määrä: 10 000
Suorita tulos
Testi 3
Luettujen tietojen määrä: 100 000
Suorita tulos
Testi 4
Luettujen tietojen määrä: 500 000
Suorita tulos
4. Kirjaa kokonaislukutesti
Testitulokset
5. Määritä ehtokyselytesti
Kyselytietokannan 300 000. tietue on 610 300.
4. Yhteenveto:
Guidin käyttäminen päänäppäimenä ei ole kovin hidasta, mutta nopeampaa kuin automaattisen kasvun askelten käyttö.





Edellinen:asp.net muuntaa binäärinen Base64-sisältö kuviksi ja tallentaa ne paikallisesti
Seuraava:String[3]: Size-ominaisuudella on virheellinen koko 0.
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com