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 ...
随机推荐
- 利用curl抓取远程页面内容
最基本的操作如下 $curlPost = 'a=1&b=2';//模拟POST数据$cookie_file = tempnam('./temp','kie');//可选,保存ses ...
- webservice安全性之 SoapHeader自定义身份验证
相信很多开发者都用过WebService来实现程序的面向服务,本文主要介绍WebService的身份识别实现方式,当然本文会提供一个不是很完善的例子,权当抱砖引玉了. 首先我们来介绍webservic ...
- mariadb数据库备份学习笔记
备份类型: 完全备份 部分备份:仅备份其中的一张表或多张表 增量备份:仅备份从上次完全备份或增量备份之后变化的数据部分 热备份:在线备份,读写操作不受影响 温备份:在线备份,读操作可继续进行,但写操作 ...
- CSS中的content和attr的用法
问题缘起 在闲看别人网站时发现了这样的代码 <span class="hamburger icon" data-icon="C"> .icon:be ...
- Java 中的构造方法
首先创建一个Transport类,定义好类的属性和方法,并且写好构造方法,先看下无参数的构造方法: public class Transport { //名字 public String name; ...
- Flex 4.0及4.6发布的网络应用在内网内会访问很慢的解决方案
Flex 4.x 开发的程序部署在外网在能访问到www.adobe.com的时能够很快加载完成,但是部署在本地局域网,不能访问外网的服务器上,用浏览器访问应用需要加载几分钟的时间,这种等待时间客户几乎 ...
- VMware虚拟机升级过程中遇到的一点问题
在将VWware由9.0升级到10.0的过程中,出现如下图的错误: failed to create the requested registry key Key:Installer e ...
- 实战Django:官方实例Part2
我们接着Part1部分往下讲.我们在part1中启动服务器后,并没有在管理页面中发现新添加的Polls应用,怎么办捏? 7.在管理界面中显示Question 只要注册一下这个应用就可以了.编辑poll ...
- 苹果内付费 IAP
创建app内购买项目 消耗型项目:对于消耗型App内购买项目,用户每次下载时都必须进行购买.一次性服务通常属于消耗型项目,例如钓鱼App 中的鱼饵. 非消耗型项目:对于非消耗型App内购买项目,用户仅 ...
- 调用微信退款接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...