1. Общ преглед:
В нашия дизайн на базата данни първичният ключ на базата данни е от съществено значение, а дизайнът на първичния ключ оказва голямо влияние върху дизайна на цялата база данни. Ще сравня производителността на автоматичните инкрементални полета и Guid полетата, добре дошли да дискутираме.
2. Въведение:
1. Самоинкрементални полета
Самоинкременталните полета се увеличават последователно всеки път, като се гарантира, че основните ключове в таблицата не се повтарят. Освен ако максималната стойност на самоувеличаващото се поле не бъде надвишена и увеличена от нулата, това е почти невъзможно. Много е лесно да се използват самоинкрементални полета като основни ключове, обикновено просто декларираш атрибути за самоувеличаване при изграждане на таблица.
Самоинкременталните стойности са всички глобални стойности на данни, които трябва да се поддържат в системата, като стойността се увеличава всеки път, когато данните се вмъкват. В съвременна среда, където еквивалентът генерира уникална идентичност, всяка инкрементална стойност трябва да бъде заключена и отключена с тази глобална стойност, за да се гарантира уникалността на увеличението. Това може да бъде едновременно тясно място, което включва някои проблеми с производителността.
При миграция или импортиране на данни, самоинкременталните полета могат да се дублират, което несъмнено е кошмар (вече съм страдал от това).
Ако искате да изградите разпределена база данни, тази самоинкрементална област е проблем. Това е така, защото в разпределена база данни таблици с едно и също име от различни бази данни може да се наложи да се репликират синхронно. Самоинкременталната стойност на таблица в база данни вероятно ще бъде дублирана със стойността на самоинкременталната стойност на същата таблица в друга база данни.
2. уникално (Guid) поле
В MS SQL базите данни структурата на таблицата може да се създаде чрез задаване на типа полето като уникален идентификатор, а нейната стойност по подразбиране може да се генерира с NewID() за генериране на уникален Guid (Глобално уникален идентификатор).
Guid:指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,其算法是通过以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字生成。其格式为:04755396-9A29-4B8C-A38D-00042C1B9028.
Предимството на GUID е, че генерираният ID е относително уникален – независимо дали се експортират данни или се извършва стъпка по стъпка разработка, няма да има проблеми. Въпреки това, генерираният ID е сравнително дълъг, а пространството в базата данни също е заето, така че няма нужда да се взема предвид това, тъй като цената на външното съхранение намалява. Освен това 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. Скриптове за бази данни
- --自增量字段表
- CREATE TABLE [dbo].[Table_Id](
- [Id] [int] IDENTITY(1,1) NOT NULL,
- [Value] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
- CONSTRAINT [PK_Table_Id] PRIMARY KEY CLUSTERED
- (
- [Id] ASC
- )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
- ) ON [PRIMARY]
- GO
- --Guid字段表
- CREATE TABLE [dbo].[Table_Guid](
- [Guid] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Table_Guid_Guid] DEFAULT (newid()),
- [Value] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
- CONSTRAINT [PK_Table_Guid] PRIMARY KEY CLUSTERED
- (
- [Guid] ASC
- )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
- ) ON [PRIMARY]
- GO
Копирай код Тестов код
- 1using System;
- 2using System.Collections.Generic;
- 3using System.Text;
- 4using System.Data.SqlClient;
- 5using System.Diagnostics;
- 6using System.Data;
- 8namespace GuidTest
- 9{
- class Program
- {
- string Connnection = "server=.;database=GuidTest;Integrated Security=true;";
- static void Main(string[] args)
- {
- Program app = new Program();
- int Count = 10000;
- Console.WriteLine("数据记录数为{0}",Count);
- //自动id增长测试;
- Stopwatch WatchId = new Stopwatch();
- Console.WriteLine("自动增长id测试");
- Console.WriteLine("开始测试");
- WatchId.Start();
- Console.WriteLine("测试中");
- 25 app.Id_InsertTest(Count);
- //app.Id_ReadToTable(Count);
- //app.Id_Count();
- 29 //查询第300000条记录;
- //app.Id_SelectById();
- 32 WatchId.Stop();
- Console.WriteLine("时间为{0}毫秒",WatchId.ElapsedMilliseconds);
- Console.WriteLine("测试结束");
- 36 Console.WriteLine("-----------------------------------------");
- //Guid测试;
- Console.WriteLine("Guid测试");
- Stopwatch WatchGuid = new Stopwatch();
- Console.WriteLine("开始测试");
- WatchGuid.Start();
- Console.WriteLine("测试中");
- 44 app.Guid_InsertTest(Count);
- //app.Guid_ReadToTable(Count);
- //app.Guid_Count();
- 48 //查询第300000条记录;
- //app.Guid_SelectById();
- 51 WatchGuid.Stop();
- Console.WriteLine("时间为{0}毫秒", WatchGuid.ElapsedMilliseconds);
- Console.WriteLine("测试结束");
- Console.Read();
- }
- 57 /**////
- /// 自动增长id测试
- ///
- private void Id_InsertTest(int count)
- {
- string InsertSql="insert into Table_Id ([Value]) values ({0})";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- conn.Open();
- SqlCommand com = new SqlCommand();
- for (int i = 0; i < count; i++)
- {
- com.Connection = conn;
- com.CommandText = string.Format(InsertSql, i);
- com.ExecuteNonQuery();
- }
- }
- }
- 76 /**////
- /// 将数据读到Table
- ///
- private void Id_ReadToTable(int count)
- {
- string ReadSql = "select top " + count.ToString() + " * from Table_Id";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- SqlDataAdapter adapter = new SqlDataAdapter(com);
- DataSet ds = new DataSet();
- adapter.Fill(ds);
- Console.WriteLine("数据记录数为:{0}", ds.Tables[0].Rows.Count);
- }
- }
- 92 /**////
- /// 数据记录行数测试
- ///
- private void Id_Count()
- {
- string ReadSql = "select Count(*) from Table_Id";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- conn.Open();
- object CountResult = com.ExecuteScalar();
- conn.Close();
- Console.WriteLine("数据记录数为:{0}",CountResult);
- }
- }
- 108 /**////
- /// 根据id查询;
- ///
- private void Id_SelectById()
- {
- string ReadSql = "select * from Table_Id where Id="+300000;
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- conn.Open();
- object IdResult = com.ExecuteScalar();
- Console.WriteLine("Id为{0}", IdResult);
- conn.Close();
- }
- }
-
- /**////
- /// Guid测试;
- ///
- private void Guid_InsertTest(int count)
- {
- string InsertSql = "insert into Table_Guid ([Value]) values ({0})";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- conn.Open();
- SqlCommand com = new SqlCommand();
- for (int i = 0; i < count; i++)
- {
- com.Connection = conn;
- com.CommandText = string.Format(InsertSql, i);
- com.ExecuteNonQuery();
- }
- }
- }
- 143 /**////
- /// Guid格式将数据库读到Table
- ///
- private void Guid_ReadToTable(int count)
- {
- string ReadSql = "select top "+count.ToString()+" * from Table_GuID";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- SqlDataAdapter adapter = new SqlDataAdapter(com);
- DataSet ds = new DataSet();
- adapter.Fill(ds);
- Console.WriteLine("数据记录为:{0}", ds.Tables[0].Rows.Count);
- }
- }
- 159 /**////
- /// 数据记录行数测试
- ///
- private void Guid_Count()
- {
- string ReadSql = "select Count(*) from Table_Guid";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- conn.Open();
- object CountResult = com.ExecuteScalar();
- conn.Close();
- Console.WriteLine("数据记录为:{0}", CountResult);
- }
- }
- 175 /**////
- /// 根据Guid查询;
- ///
- private void Guid_SelectById()
- {
- string ReadSql = "select * from Table_Guid where Guid='C1763624-036D-4DB9-A1E4-7E16318C30DE'";
- using (SqlConnection conn = new SqlConnection(Connnection))
- {
- SqlCommand com = new SqlCommand(ReadSql, conn);
- conn.Open();
- object IdResult = com.ExecuteScalar();
- Console.WriteLine("Guid为{0}", IdResult);
- conn.Close();
- }
- }
- }
- 192}
- 193
Копирай код3. Тест за въвеждане в база данни Тест 1 Обемът на базата данни е: 100 елемента Пуснете резултата Тест 2 Обемът на базата данни е: 10 000 елемента Пуснете резултата
Тест 3 Обемът на базата данни е: 100 000 елемента Пуснете резултата Тест 4 Обемът на базата данни е: 500 000 елемента Пуснете резултата 4. Прочетете данните в DataSet Тест 1 Количество прочетени данни: 100 Пуснете резултата Тест 2 Количество прочетени данни: 10 000 Пуснете резултата Тест 3 Количество прочетени данни: 100 000 Пуснете резултата Тест 4 Количество прочетени данни: 500 000 Пуснете резултата 4. Запишете общия брой тестове Резултати от тестове 5. Определете теста за заявка за условие 300 000-ият запис в базата данни с заявки е 610 300. 4. Резюме: Използването на Guid като основен ключ не е много бавно, но е по-бързо от автоматичното увеличаване на стъпките.
|