SQL Server性能优化(5)表设计时的注意事项
一、 是否需要冗余列
现在一些项目的数据库设计中,为了提高查询速度,把基本表的一些列也放到了数据表里,导致数据冗余。例如在热表的数据库里,原始数据表Measure_Heat里加了如房间号,单元号,楼号,小区,户主姓名,户主编号等列。以下分析其性能。
测试步骤:
1. 建立相同的表(不包含冗余列,如房间号,单元号,楼号,小区,户主姓名,户主编号,冗余列从Measure_Cjd内Join获取)两个表索引相同。
2. 把Measure_Heat里的数据原封不动插入到新表内,共5326375行
SELECT [id]
,[表地址]
,[上次抄表热量]
,[当前热量]
,[热功率]
,[瞬时流量]
,[累计流量]
,[供水温度]
,[回水温度]
,[温差]
,[累计工作时间]
,[实时时间]
,[采集时间]
,[单价]
,[通讯状态]
,[室温]
,[设定室温]
,[阀门状态]
INTO [HeatMeasure_Weifang].[dbo].[Measure_heat_test]
FROM [HeatMeasure_Weifang].[dbo].[Measure_heat]
测试项
1. 查看两个表占用硬盘大小
原表:大小1260M

新表:915M(缩小比例为(1260-915)/1260= 0.274,也就是缩小了超过四分之一的大小)

2. 查询性能
a. 查询前清除缓存
--查询旧表
DBCC DROPCLEANBUFFERS --关闭缓存,从缓冲池中删除所有缓冲区
DBCC FREEPROCCACHE --关闭缓存,从过程缓冲区删除所有元素
select top 10 * from Measure_heat
结果:

--查询新表
DBCC DROPCLEANBUFFERS --关闭缓存,从缓冲池中删除所有缓冲区
DBCC FREEPROCCACHE --关闭缓存,从过程缓冲区删除所有元素
select top 10 a.*,
b.社区编号,b.楼房编号,b.楼层,b.单元编号,b.房间号, b.户主编号,b.户主姓名
from Measure_heat_Test a left join measure_cjd b
on a.表地址=b.表地址

可见,冗余列在查询时(清空数据库缓存的情况下),的确会提高查询速度(63毫秒VS911毫秒)
b. 不清除缓存,原表0毫秒

新表:13毫秒

3. 插入性能(插入一万条数据批量)
旧表:
insert into Measure_heat
select top 10000 [表地址]
,[上次抄表热量]
,[当前热量]
,[热功率]
,[瞬时流量]
,[累计流量]
,[供水温度]
,[回水温度]
,[温差]
,[累计工作时间]
,[实时时间]
,[采集时间]
,[单价]
,[通讯状态]
,[社区编号]
,[楼房编号]
,[楼层]
,[单元编号]
,[房间号]
,[户主编号]
,[户主姓名]
,[室温]
,[设定室温]
,[阀门状态]
from Measure_heat

新表
insert into Measure_heat_Test
select top 10000 [表地址]
,[上次抄表热量]
,[当前热量]
,[热功率]
,[瞬时流量]
,[累计流量]
,[供水温度]
,[回水温度]
,[温差]
,[累计工作时间]
,[实时时间]
,[采集时间]
,[单价]
,[通讯状态]
,[室温]
,[设定室温]
,[阀门状态]
from Measure_heat_Test

结论:
a. 数据冗余对于查询单表速度是有很大优势的,是多表join的速度的10倍以上,性能不是一个数量级。道理也可以理解,多表join是会扫描多个表,性能肯定有损耗。
b. 除了性能优势,包含冗余列在数据存储空间方面多了27%的硬盘空间。
c. 插入性能,同时插入1w条数据,都在500ms左右,差别不大。
d. 如果把上图Measure_cjd的基本数据,到到缓存内,新表查询应该会有比原表更高的性能。
二、列的类型和范围,比如一些范围小的属性int字段尽量用smallint 或者tinyint,节省磁盘空间和数据跨页的可能行。

比如一下几列,都可以用smallint

节省空间(节省空间(1327-1152)/1327=0.132,也就是节约了10%的空间)


统计使用页数,参考(http://www.cnblogs.com/zping/archive/2010/12/20/1911406.html)
SELECT Object_name(i.object_id) AS objectName,
i.[name] AS indexName,
Sum(a.total_pages) AS totalPages,
Sum(a.used_pages) AS usedPages,
Sum(a.data_pages) AS dataPages,
( Sum(a.total_pages) * 8 ) / 1024 AS totalSpaceMB,
( Sum(a.used_pages) * 8 ) / 1024 AS usedSpaceMB,
( Sum(a.data_pages) * 8 ) / 1024 AS dataSpaceMB
FROM sys.indexes i
INNER JOIN sys.partitions p
ON i.object_id = p.object_id
AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a
ON p.partition_id = a.container_id
WHERE i.object_id = Object_id('dbo.Measure_heat')
AND i.index_id <= 1
GROUP BY i.object_id,
i.index_id,
i.[name]

结论,虽然数据行数相同,但是页数减少了。
三、尽量不要允许NULL,除非必要,可以用NOT NULL+DEFAULT代替。
如性别
CREATE TABLE "dbo"."Test"
(
id int PRIMARY KEY,
sex bit DEFAULT (1),
name varchar(40),
age int DEFAULT ((1)),
)
SQL Server性能优化(5)表设计时的注意事项的更多相关文章
- SQL Server 性能优化之——系统化方法提高性能
SQL Server 性能优化之——系统化方法提高性能 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结 1. 概 ...
- SQL SERVER性能优化综述
SQL SERVER性能优化综述 一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的.所以我希望按照软 ...
- SQL Server性能优化(6)查询语句建议
1. 如果对数据不是工业级的访问(允许脏读),在select里添加 with(nolock) ID FROM Measure_heat WITH (nolock) 2. 限制结果集的数据量,如使用TO ...
- 【SQL Server性能优化】删除大量数据的方法比较
原文:[SQL Server性能优化]删除大量数据的方法比较 如果你要删除表中的大量数据,这个大量一般是指删除大于10%的记录,那么如何删除,效率才会比较高呢? 而如何删除才会对系统的影响相对较小呢? ...
- 【SQL Server性能优化】运用SQL Server的全文检索来提高模糊匹配的效率
原文:[SQL Server性能优化]运用SQL Server的全文检索来提高模糊匹配的效率 今天去面试,这个公司的业务需要模糊查询数据,之前他们通过mongodb来存储数据,但他们说会有丢数据的问题 ...
- SQL Server 性能优化(一)——简介
原文:SQL Server 性能优化(一)--简介 一.性能优化的理由: 听起来有点多余,但是还是详细说一下: 1.节省成本:这里的成本不一定是钱,但是基本上可以变相认为是节省钱.性能上去了,本来要投 ...
- SQL Server性能优化与管理的艺术 附件下载地址
首先感谢读者们对鄙人的支持,购买了<SQL Server性能优化与管理的艺术>,由于之前出版社的一些疏忽,附件没有上传成功,再次本人深表歉意. 请需要下载附件的读者从下面链接下载,谢谢: ...
- SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1)
SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1) 安装Quick Start工具 RML(Replay Markup Language)是MS ...
- SQL Server 性能优化之——T-SQL 临时表、表变量、UNION
这次看一下临时表,表变量和Union命令方面是否可以被优化呢? 阅读导航 一.临时表和表变量 二.本次的另一个重头戏UNION 命令 一.临时表和表变量 很多数据库开发者使用临时表和表变量将代码分解成 ...
- 【SQL Server性能优化】SQL Server 2008该表压缩
当数据库是比较大的,而当你想备份,我们可以启动数据库备份压缩.这项由于备份文件比较小的压缩,所以整个备份的更快的速度,同时还低了磁盘空间的消耗. 当然还有一方面.肯定会添加cpu的消耗.只是一般的se ...
随机推荐
- 快速解决Canvas.toDataURL 图片跨域的问题
出现Canvas.toDataURL 图片跨域问题怎么解决呢?下面小编就为大家带来一篇Canvas.toDataURL 图片跨域问题的快速解决方法.一起跟随小编过来看看吧 如题,在将页面的图片地址进行 ...
- JavaScript学习小结(一)——JavaScript入门基础
一.JavaScript语言特点 1.1.JavaScript是基于对象和事件驱动的(动态的) 它可以直接对用户或客户输入做出响应,无须经过Web服务程序.它对用户的响应,是采用以事件驱动的方式进行的 ...
- 代码快捷键的设置读取App.config方法
附件下载:http://files.cnblogs.com/files/qtiger/ShortcutAchieve.zip 代码实现最重要(增加引用using System.Configuratio ...
- SQL中如何检查死锁
SQL中如何检查死锁 编写人:CC阿爸 2014-6-15 在日常SQL数据库的操作中,SQL偶尔会出现表被死锁的问题.比如: 在执行事务时,突然中止事务.系统肯定会锁表. 大批量数据操作时,由于网络 ...
- 微软必应·英雄会第三届在线编程大赛:几个bing?
发布公司:微软亚太研发集团 有 效 期:2013-12-31至2014-02-01 难 度 等 级: 答 题 时 长:120分钟 编程语言要求:C C++ Java C# 悬赏详情 一等奖 : 价值2 ...
- 使用sqoop将mysql数据导入到hadoop
hadoop的安装配置这里就不讲了. Sqoop的安装也很简单. 完成sqoop的安装后,可以这样测试是否可以连接到mysql(注意:mysql的jar包要放到 SQOOP_HOME/lib 下): ...
- 《安全参考》HACKCTO-201311-11
小编的话 “晴空一鹤排云去,便引诗情到碧宵” 11月是一个让人思绪飞扬.感慨万千的时节. 就在这时,在我们小伙伴的并肩奋战下,第十一期<安全参考>又跟大家见面了. 你还在为女朋友在购物狂欢 ...
- VB 进制转换大全
'二进制转十进制 Public Function B2D(vBStr As String) As Long Dim vLen As Integer '串长 Dim vDec As Long '结果 D ...
- 全排列 (codevs 1294)题解
[题目描述] 给出一个n, 请输出n的所有全排列(按字典序输出). [样例输入] 3 [样例输出] 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 [解题思路] 听说C++有作 ...
- jquery mobile最棘手的一个问题
大多数jquery mobile开发的妹子们都碰到过这个问题: 如何调用loading效果 这里给出一段代码,赶紧练手吧. //显示loading function showLoading(){ ...