数据库SQL Server性能优化之主键选择总结
2018-02-24 22:17
453 查看
常见的数据库主键选取方式有:
●自动增长字段
●Uniqueidentifier
●“COMB(Combine)”类型
1、自动增长字段
优点:
(1)简单、效率高。
缺点:
(1)自增一般使用int型,有数据条数的限制。
(2)在数据库进行数据合并时会比较麻烦。
2、GUID
优点:
(1)安全,保证唯一性。
(2)不会产生自增字段那样数据合并时的问题。
缺点:
(1)它的长度是16字节,占用大量存储空间。
(2)该数据类型毫无规律,要在上面建立索引很耗时,所以效率要比使用自增字段低。
3、COMB
考虑到上面两种主键类型的优缺点,这里使用COMB类型可以为两者找到了一个平衡点。
它的设计思路是这样的:
既然GUID类型无规律可言造成索引效率低下,影响系统的性能,那么能不能通过组合的方式,保留GUID前10个字节,用后6个字节表示GUID生成的时间,这样即保证了唯一性同时增加了有序性,以此来提高索引效率。
后6字节的时间精度可以达到1/300秒,两个COMB类型数据完全相同的可能性是在这1/300秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的。
(1)SQL Server中SQL命令实现这一思路的方式:
(2)实现COMB数据的C#方式:
●自动增长字段
●Uniqueidentifier
●“COMB(Combine)”类型
1、自动增长字段
优点:
(1)简单、效率高。
缺点:
(1)自增一般使用int型,有数据条数的限制。
(2)在数据库进行数据合并时会比较麻烦。
2、GUID
优点:
(1)安全,保证唯一性。
(2)不会产生自增字段那样数据合并时的问题。
缺点:
(1)它的长度是16字节,占用大量存储空间。
(2)该数据类型毫无规律,要在上面建立索引很耗时,所以效率要比使用自增字段低。
3、COMB
考虑到上面两种主键类型的优缺点,这里使用COMB类型可以为两者找到了一个平衡点。
它的设计思路是这样的:
既然GUID类型无规律可言造成索引效率低下,影响系统的性能,那么能不能通过组合的方式,保留GUID前10个字节,用后6个字节表示GUID生成的时间,这样即保证了唯一性同时增加了有序性,以此来提高索引效率。
后6字节的时间精度可以达到1/300秒,两个COMB类型数据完全相同的可能性是在这1/300秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的。
(1)SQL Server中SQL命令实现这一思路的方式:
DECLARE @aGuid UNIQUEIDENTIFIER SET @aGuid = CAST(CAST(NEWID() AS BINARY(10))+ CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER)
(2)实现COMB数据的C#方式:
///<summary> /// 返回 GUID 用于数据库操作,特定的时间代码可以提高检索效率 /// </summary> /// <returns>COMB (GUID 与时间混合型) 类型 GUID 数据</returns> public static Guid NewComb() { byte[] guidArray = System.Guid.NewGuid().ToByteArray(); DateTime baseDate = new DateTime(1900,1,1); DateTime now = DateTime.Now; // Get the days and milliseconds which will be used to build the byte string TimeSpan days = new TimeSpan(now.Ticks - baseDate.Ticks); TimeSpan msecs = new TimeSpan(now.Ticks - (new DateTime(now.Year, now.Month, now.Day).Ticks)); // Convert to a byte array // Note that SQL Server is accurate to 1/300th of a millisecond so we divide by 3.333333 byte[] daysArray = BitConverter.GetBytes(days.Days); byte[] msecsArray = BitConverter.GetBytes((long)(msecs.TotalMilliseconds/3.333333)); // Reverse the bytes to match SQL Servers ordering Array.Reverse(daysArray); Array.Reverse(msecsArray); // Copy the bytes into the guid Array.Copy(daysArray, daysArray.Length - 2, guidArray, guidArray.Length - 6, 2); Array.Copy(msecsArray, msecsArray.Length - 4, guidArray, guidArray.Length - 4, 4); return new System.Guid(guidArray); } /// <summary> /// 从 SQL SERVER 返回的 GUID 中生成时间信息 /// </summary> /// <param name="guid">包含时间信息的 COMB </param> /// <returns>时间</returns> public static DateTime GetDateFromComb(System.Guid guid) { DateTime baseDate = new DateTime(1900,1,1); byte[] daysArray = new byte[4]; byte[] msecsArray = new byte[4]; byte[] guidArray = guid.ToByteArray(); // Copy the date parts of the guid to the respective byte arrays. Array.Copy(guidArray, guidArray.Length - 6, daysArray, 2, 2); Array.Copy(guidArray, guidArray.Length - 4, msecsArray, 0, 4); // Reverse the arrays to put them into the appropriate order Array.Reverse(daysArray); Array.Reverse(msecsArray); // Convert the bytes to ints int days = BitConverter.ToInt32(daysArray, 0); int msecs = BitConverter.ToInt32(msecsArray, 0); DateTime date = baseDate.AddDays(days); date = date.AddMilliseconds(msecs * 3.333333); return date; }
相关文章推荐
- 数据库SQL Server性能优化之SQL语句总结
- [Sql2005笔记] Sql2005性能工具(SQL Server Profiler和数据库引擎优化顾问)使用方法详解
- 系统性能优化总结—数据库访问优化
- SQL Server 数据库性能优化
- 【数据库】关于数据库查询性能调优和索引优化的总结
- 【SqlServer2005+ 性能优化】Sql Server 数据库优化相关
- 关系型数据库性能优化总结2
- 10步骤优化SQL Server 数据库性能 (转)
- 数据库瓶颈之关系型数据库性能优化总结
- SQL Server 软件测试中数据库的性能优化
- SQL Server 数据库性能优化
- SQL Server 数据库性能优化
- 数据库性能优化总结
- [翻译]10步骤优化SQL Server 数据库性能(大致翻了下)
- SQL Server性能优化(15)选择合适的索引
- 10步骤优化SQL Server 数据库性能
- 关系型数据库性能优化总结
- 关系型数据库性能优化总结
- SQL Server 2005 一千万条以上记录分页数据库优化经验总结(转载)
- 关系型数据库性能优化总结