当谈到影响SQL Server性能的组分时,你很可能会想到CPU的使用率、内存和查询过程所占用的I/O资源。不过,还有另外一个值得注意的影响因素,那就是磁盘空间的使用。在以前,磁盘空间的成本非常高,所以大部分人都会竭尽所能地节约磁盘空间的使用。相信大家对千年虫问题还记忆犹新,问题的产生正是源于日期是以八位字符(例如2000年11月7日的格式为11/07/00)形式存储的。老牌的计算机程序员在存储每个日期时都只存储年份的后两位数字,而省去了前两位。如今,磁盘驱动器的价格一落千丈,所以大家也就不用花大量时间来想方设法为减少磁盘空间的使用量而优化数据库设计了。不过,还是请大家记住,你每浪费一个字节的数据库磁盘空间,就会对应用程序执行性能造成一次冲击。本文将为你一一细数磁盘空间的使用是如何影响数据库性能的。
  磁盘空间使用对性能的影响

  要讨论磁盘空间使用对性能的影响,我们首先要讲述一下从磁盘驱动器读写数据到底要耗费些什么。你每次从 SQL Server读取某块数据,都需要从磁盘检索信息。检索的过程启动了磁盘的I/O操作。SQL Server中的数据都是存储在一系列不同的物理页中。每个物理页可用空间大小为8060字节(除去存放系统信息的部分)。对于每个物理页里的数据,SQL Server都需要进行一次I/O操作来检索该数据,也就是说磁盘的读取和写入数据操作是在页级执行的。

  为了更深入了解I/O操作是如何能够影响到数据库性能的,我们来做个简单的计算题,如果我们要从一个SQL Server表中检索一千万条记录,每条记录的长度为300字节,需要进行多少次I/O操作呢?这意味着每页可以存储26条不同的记录,所有的一千万条记录数据就需要384615个数据页来存储,这仅仅是存储原始数据,还没有把索引所占的空间大小计算在内。也就是说,在这存储了一千万条记录的表中查找一条记录就需要执行384615次I/O操作。

  现在假设我为每条记录节省了2字节的数据空间,这样每条记录的长度就是298字节。这样的话每个SQL Server页就可以存储27条记录。就是省了这两个字节,你每执行一次 I/O操作都可以多检索一条记录。当你读取整个一千万条记录的表时,可以少执行14244次 I/O操作。每条记录节省两字节的空间却能够省去大量的 I/O操作。

  所以,每当你把存储到SQL Server表的一个记录减少少量字节时,你都能为改善数据库查询性能做出贡献。当表足够大时,你就能明显看到性能的提升。所以,你应当尽量减少记录的大小,这样就能最大限度地增加存储在每个数据页的记录数量。

  而当你尽量减少存储数据的磁盘空间时,节约下来的不仅仅是 I/O操作。记住每个页面在被读取的时候,首先要存储在缓冲池里。所以,记录长度越短,在一个缓冲池页中能够存储的记录就越多。所以节约了用来存储数据的磁盘空间,也就节约了读取数据所必须的内存容量。

  利用合适的数据类型以便尽量减少磁盘空间的使用

  当你为某特定的字段选择数据类型时,你必须确保你选定的数据类型是合适的。大家在具体操作时很容易选错数据类型,从而浪费了磁盘空间。因此,你必须小心谨慎,并确保你选择的数据类型满足了数据需求并最大限度减少了存储每个字段所需要的磁盘空间大小。下面我们来逐一审视不同的数据类型及其对磁盘空间的需求。

  首先,我们来看看Unicode数据类型。Unicode数据类型包括NVARCHAR、NCHAR和NTEXT数据类型。Unicode数据类型需要两个字节来存储每个字符。而非Unicode数据类型(如 VARCHAR、CHAR和TEXT)存储一个字符只需要一个字节。非Unicode数据类型智能存储256个不同的字符。而使用Unicode数据类型,你可以存储多达65536种不同的双字节模式。由于使用非Unicode数据类型时能够用来存储的特定字符数量受到限制,所以用来代表某一特定字符的十六进制数随着代码页的不同而不相。当你使用Unicode数据类型时,代表字符的十六进制数在不同的代码页都通用。Unicode数据类型往往适合于国际化应用程序。如果你的应用程序不需要提供国际化支持,而你的应用程序能够用单字节的256字符组合表现出来的话,你就应该考虑使用VARCHAR、CHAR和TEXT 等非Unicode数据类型。使用非Unicode数据类型,每个基于字符的字段可以只使用一半磁盘空间。如果你存储了大量的字符数据,纳闷你使用非Unicode数据类型所节省下来的磁盘空间就相当客观了。有人做过相关试验,把使用Unicode数据类型的数据库改为全部使用非Unicode数据类型,发现能够节省40%的磁盘空间。如此大幅度的磁盘空间节省率比使用Unicode数据类型更能改善性能。而这种性能的提升正是源于增加了能够存储在单个SQL Server页面的记录数量。

  存储字符型数据时,还有一些需要注意的地方,那就是CHAR和VARCHAR数据类型的使用。CHAR数据类型是一种固定格式长度的数据类型。当你定义一个字段为CHAR(20),那么不管你存储的数据是否有20个字节,它都要占用20个字节的空间。也就是说,如果你只为某定义为CHAR(20)的字段赋予“abc”的值,那么SQL Server将它存储成“abc”后面带上17个空格的形式。而VARCHAR字段的长度则是可变的。所以当你为定义为VARCHAR(20)的字段赋予“abc”的值时,只占用了5字节的存储空间,其中2字节是用来记录数据长度的,另外才是用来存储“abc”值的。如果需要赋值的字符型字段很少,那么使用VARCHAR 数据类型存储这些字段能减少磁盘空间的使用量。

  下面让我们来看看整数数据类型应该如何存储。整数类型又可以分为四种不同的数据类型:TINYINT、SMALLINT、INT 和 BIGINT。每一种类型所占用的存储空间不同。TINYINT占用1字节的存储空间,支持的值范围为0到255。SMALLINT占用2字节存储空间,可以表示的值范围为-32768到32767。INT数据类型占用4字节存储空间,取值范围从-2147483648到2147483647。而 BIGINT 占用8字节的存储空间,能够存储从-9223372036854775808到9223372036854775807的值。

本篇文章来源于 站长资讯网 原文链接:http://www.chinahtml.com/database/sqlserver/2007/119881470017508.shtml

转载于:https://www.cnblogs.com/bccu/archive/2009/07/01/1514556.html

磁盘空间使用关乎SQL Server性能相关推荐

  1. SQL Server 性能调优3 之索引(Index)的维护

    SQL Server 性能调优3 之索引(Index)的维护 热度1 评论 16 作者:溪溪水草 SQL Server 性能调优3 之索引(Index)的维护 前言 前一篇的文章介绍了通过建立索引来提 ...

  2. SQL Server 性能调优(cpu)

    SQL Server 性能调优(cpu) 研究cpu压力工具 perfom SQL跟踪 性能视图 cpu相关的waitevent Signal wait time SOS_SCHEDULER_YIEL ...

  3. SQL Server 性能调优(方法论)

    SQL Server 性能调优(方法论) 目录 确定思路 wait event的基本troubleshooting 虚拟文件信息(virtual file Statistics) 性能指标 执行计划缓 ...

  4. dbcc dbreindex server sql_DBCC DBREINDEX重建索引提高SQL Server性能

    DBCC DBREINDEX重建索引提高SQL Server性能 [转载]大多数SQL Server表需要索引来提高数据的访问速度,如果没有索引,SQL Server 要进行表格扫描读取表中的每一个记 ...

  5. collector_使用Data Collector监视SQL Server性能

    collector 什么是SQL Server数据收集器 (What is SQL Server Data Collector) SQL Server数据收集器是SQL Server Manageme ...

  6. 使用Windows Performance Monitor进行SQL Server性能调整

    Windows Performance Monitor basics article, we described the most important Windows Performance Moni ...

  7. 影响Sql server性能的因素

    目前本人在看<SQL Server性能调优实战> ,以下内容是本人看书笔记 数据库性能取决于各方面综合因素: 硬件,操作系统,软件 硬件:内存,CPU,磁盘 当服务器的物理内存不足时,会产 ...

  8. 10.监视SQL Server性能

    数据库管理员的主要责任之一是持续监视SQL Server性能.之所以要进行监视,原因 有多种,包括性能.存储状态.安全性和标准符合程度等.虽然很多此类监视可以自动完 成,但在大多数情况下,数据库管理员 ...

  9. SQL Server 性能优化之——系统化方法提高性能

    原文 http://www.cnblogs.com/BoyceYang/archive/2013/06/15/3138142.html 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索 ...

最新文章

  1. [欧拉路]CF1152E Neko and Flashback
  2. 共享数据库、独立 Schema
  3. mysql读写分离 存储过程_基于maxscale的读写分离部署笔记
  4. 10个理由告诉你为何要学Java编程?
  5. 推文科技:AI解决方案助力内容出海
  6. cocos2d-js 越来越慢的定时器schedule 制作不变慢的定时器
  7. Vue计算属性之基本使用---vue工作笔记0004
  8. java spring框架文件上传_spring系列---Security 安全框架使用和文件上传FastDFS
  9. 国家机构测评主流电视品牌语音识别 长虹Q5K综合评价最佳
  10. CAM350 导出DXF文件
  11. rgba转16进制颜色
  12. verilog学习笔记——三段式状态机
  13. python核心编程第二版第六章答案
  14. 关于数据库学习的一些知识盲区
  15. 如何用小米玩华为游戏华为账号
  16. python识别图片、PDF识别成文字、表格(包含去除水印) 代码不是最新,可在最下面Gitee地址查看最新代码
  17. java十六进制转为十进制,Java将十六进制转换为十进制
  18. 计算机网络-什么是网络协议?
  19. 韩信点兵-输出韩信至少拥有的士兵人数。
  20. opencore 启动总是在win_单双硬盘装Windows/Mac双系统用OpenCore引导菜单添加Windows引导项...

热门文章

  1. 【css】谈谈 css 的各种居中——读编写高质量代码有感
  2. extjs xtype 类型
  3. 手动配置gradle
  4. Solidity safesub防止溢出
  5. [转-SSRF]什么是SSRF
  6. linux添加开机自启动脚本示例详解
  7. 前端设计必备-Font awesome 插件使用菜鸟言语
  8. c语言中return,和exit的区别
  9. 如何了解事件中回调函数的参数
  10. 虚拟机usb无线上网同时主机本地上网或无线无线上网