一、场景
在SQL Server
2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你看到表的记录如下图所示,你最先想到的是什么呢?
(图1:数据列表)
你看到这些数据,是不是觉得这样的设计既浪费了存储空间,又使得这个列的索引增大,查询起来更慢,你也想使用一些其它的数据类型来代替这个datetime吧?
其实大家都是这么想的,这个方向是100%正确的,但是在写这篇文章以前,我进入了两个误区:(如果你中了下面的两个误区,那么请你看看这篇文章吧。)
误区一:把Dates字段的datetime数据类型换成smalldatetime,这样数据就由:‘2009-04-09
00:00:00.000’变为‘2009-04-09 00:00:00’,这个看起来没有减少多少存储空间哦。
误区二:把Dates字段的datetime数据类型换成char(10),这样数据就由:‘2009-04-09
00:00:00.000’变为‘2009-04-09’,这好像能减少很多存储空间哦。
二、分析
在SQL Server 2005版本中保存日期的数据类型只有两种:datetime、smalldatetime,但是在SQL Server
2008版本中新增了一些日期数据类型:time、date、smalldatetime、datetime、datetime2、datetimeoffset,其中的date类型就能满足我们场景中的需求了,如果你幸运的在使用SQL
Server 2008的话,那么恭喜你,请使用date数据类型吧。
但是我就比较可悲一点了,在使用SQL Server
2005的前提下,我进入了误区一、误区二。其实这也是因为自己忽略了一下基础性的东西,如果知道不同数据类型的存储空间大小,也许就很轻易的避免这样低级的错误了。
其实你查看表TestDatetime中的Dates字段的时候,看到查询结果中的:“-”、“:”只是用于显示的,并不是真实保存的时候就这样格式的。
datetime占用8个字节,前4个字节存储base
date(即1900年1月1日)之前或之后的天数,后4个字节存储午夜后的毫秒数。值范围:1753-01-01 到 9999-12-31。
smalldatetime占用4个字节,前2个字节存储base
date(1900年1月1日)之后的天数。后2个字节存储午夜后的分钟数。值范围:1900-01-01 到 2079-06-06。
date占用3个字节,它比smalldatetime的前2个字节多了1字节,所以值的范围更广了。值范围:0001-01-01 到
9999-12-31。
所以,如果你使用char(10)来保存截断的日期,那么你的存储空间反而更大了。
结论: 如果是SQL Server
2005,那么请你使用smalldatetime吧,数据能节约一半,虽然查询的时候看起来没什么改变;如果你是SQL Server
2008,那么请你使用date吧,虽然3个字节跟4个字节没有多大的差距,但是从设计上和逻辑清晰度上都有很大的提升,而且差距有些时候并不是1个字节的问题,比如当表数据量达到几个亿的时候,还是有差别的,又或者一条记录可能因为差1个字节就刚刚好给8060字节的页瓜分,这些都不容忽视的。
三、测试
下面我们就从数据存储的大小、索引存储的大小、索引使用时候的速度这几个方面进行测试:(这里只测试数据类型:,,数据的内容都是一样的)
(一) 测试前奏:
1. 创建三种数据类型char(10)、datetime、smalldatetime的表;(表结构如下面SQL)
CREATE TABLE [dbo].[TestDatetime](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Dates] [datetime] NULL,
CONSTRAINT [PK_TestDatetime] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
2. 插入相同记录到三个表中;(这里插入1210000条记录)
3. 为[Dates]字段创建索引;(在创建索引的时候可以设置填充因子为100%)
4. 查看索引属性中的索引碎片信息,查看表数据和索引占用的空间,测试[Dates]字段索引的查询效率;
(二) 测试结果:
1. 数据存储大小:
(图2:数据空间对比)
2. 索引存储信息:
(图3:char(10))
(图4:datetime)
(图5:smalldatetime)
3. 索引查询的情况:
多次执行,SQL Server执行时间为:[char(10)]
大部分在43~59徘徊,偶尔出现小于10的;[datetime]平均在1~2毫秒;[smalldatetime]均在1毫秒;而且大家会发现
[smalldatetime]有其它的9次逻辑读取变为8次了。
--[TestChar10]
SQL Server 分析和编译时间:
CPU 时间= 0 毫秒,占用时间= 1 毫秒。
(2200 行受影响)
表'TestChar10'。扫描计数1,逻辑读取9 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0
次。
SQL Server 执行时间:
CPU 时间= 0 毫秒,占用时间= 59 毫秒。
SQL Server 执行时间:
CPU 时间= 0 毫秒,占用时间= 1 毫秒。
--[TestDatetime]
SQL Server 分析和编译时间:
CPU 时间= 0 毫秒,占用时间= 1 毫秒。
(2200 行受影响)
表'TestDatetime'。扫描计数1,逻辑读取9 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0
次。
SQL Server 执行时间:
CPU 时间= 0 毫秒,占用时间= 2 毫秒。
SQL Server 执行时间:
CPU 时间= 0 毫秒,占用时间= 1 毫秒。
--[TestSmalldatetime]
SQL Server 分析和编译时间:
CPU 时间= 0 毫秒,占用时间= 1 毫秒。
(2200 行受影响)
表'TestSmalldatetime'。扫描计数1,逻辑读取8 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob
预读0 次。
SQL Server 执行时间:
CPU 时间= 0 毫秒,占用时间= 1 毫秒。
SQL Server 执行时间:
CPU 时间= 0 毫秒,占用时间= 1 毫秒。
--SQL Server 2008新数据类型
1. SELECT
2. CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time'
3. ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date'
4. ,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS
5. 'smalldatetime'
6. ,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime'
7. ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS
'datetime2'
8. ,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS
'datetime
分享到:
相关推荐
### SQL Server 数据类型详解与自定义数据类型创建 在数据库设计与管理中,理解并熟练掌握数据类型至关重要,因为它们直接影响到数据存储的效率、安全性和查询性能。SQL Server 提供了丰富的内置数据类型,同时也...
### SQL Server datetime...综上所述,对SQL Server datetime类型数据的优化需要综合考虑存储空间、数据类型特性、索引效率等多方面因素。通过对比测试,可以选择最适合的数据类型和优化方案,从而有效提升数据库性能。
SQL Server 数据库类型对应 Java 中的数据类型 SQL Server 是一个关系数据库管理系统,Java 是一个广泛使用的编程语言。在 Java 中,对数据库的操作需要通过 JDBC(Java Database Connectivity)来实现,而在 JDBC ...
### SqlServer数据库的数据类型详解 数据类型在编程与数据库管理中扮演着至关重要的角色,它不仅定义了数据的存储方式,还决定了数据可以执行的操作。SQL Server作为一种广泛使用的数据库管理系统,提供了丰富的...
SqlServer中使用Convert取得DateTime数据格式 标签: Sqlserver数据库技术
SQL Server 2000 是一个关系型数据库管理系统,它提供了丰富的数据类型来支持各种不同种类的数据存储。数据类型是数据库设计的基础,它定义了数据的结构和含义。本章将详细阐述SQL Server 2000 中的主要数据类型。 ...
sql server中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 08:02/*时间一般为getdate()函数或数据表里的字段*/ CONVERT...
在 C# 中,DateTime 是一个基本的数据类型,用于表示日期和时间。C# 提供了多种方法来操作 DateTime 类型的数据。 1. DateTime.Now: DateTime.Now 属性用于获取当前日期和时间。 ```csharp DateTime now = DateTime...
SQL Server 数据类型是数据库管理系统中用于定义和存储数据的基础组件,它们决定了数据的结构和特性。在SQL Server 2000中,数据类型的选择至关重要,因为它直接影响到数据的存储方式、大小以及处理效率。 首先,让...
在探讨SQL Server数据类型的深度与广度时,我们不得不承认,这一主题是数据库设计与管理中的基石之一。SQL Server作为一款强大的关系型数据库管理系统,提供了丰富多样的数据类型,旨在满足不同场景下的数据存储需求...
SQL Server 2005 和 .NET Framework 之间的数据类型对应关系是开发数据库应用程序时的重要基础知识。理解这些对应关系有助于确保在SQL Server中存储的数据能够正确地被.NET应用程序读取和处理。以下是对两种数据类型...
在数据库设计和开发中,了解不同数据库系统的数据类型和函数是非常关键的。本文将详细比较SQL Server和Oracle数据库之间的数据类型对应以及常用函数的转换。 首先,我们来看SQL Server和Oracle的数据类型对照: 1....
### Microsoft Access 数据类型与 SQL Server 数据类型的主要区别 在数据库设计和开发过程中,选择合适的数据类型对于确保数据的准确性和优化存储空间至关重要。Microsoft Access 和 SQL Server 虽然都是微软旗下的...
理解SQL Server的数据类型对于数据库设计和开发至关重要。本文将深入探讨SQL Server中常用的数据类型,帮助您更好地掌握数据库中的数据管理。 1. **数值型数据类型** - **整数类型**: 包括`tinyint`, `smallint`, ...
### SQL Server 数据类型详解 #### 一、字符型数据 SQL Server 提供了多种字符型数据类型,包括固定长度和可变长度的数据类型。 - **`char(n)`**:固定长度字符串,`n` 表示字符的最大长度,最大值为 8000 字符。...
本文将深入探讨SQL Server与Oracle中的数据类型区别,并通过具体的例子来说明这两种系统之间的转换方法。 ### SQL Server 数据类型 SQL Server 是微软开发的一款关系型数据库管理系统,它支持多种数据类型,可以...
在SQL Server 2005中,数据类型的丰富性和灵活性为数据库设计提供了强大的支持,能够满足各种业务场景的需求。以下是对部分关键数据类型及其特性的深入解析: ### 1. 字符串类型 #### `char` 和 `varchar` - `...
在SQL Server中,数据类型是定义列和变量的基础,它们决定了可以存储的数据种类以及存储方式。下面是关于SQL Server中各种数据类型的详细说明: 1. **bit**:位数据类型,用于存储0、1或NULL值,常用于表示布尔值...