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 ...
随机推荐
- pap与chap协议
1.pap:直接在网络上发送密码明文 2.chap: 网络上发送的是密码的密文;server给client发一段随机数(challenge),client利用随机数对密码进行加密,将用户名和加密后的密 ...
- Mysql的ssl主从复制+半同步主从复制
Mysql的ssl主从复制+半同步主从复制 准备工作 1.主从服务器时间同步 [root@localhost ~]# crontab -e */30 * * * * /usr/sbin/ntpdate ...
- SpringMVC与HTML页面
springMVC返回html页面 spring-mvc.xml配置: <bean id="viewResolver" class="org.springfram ...
- CSS让div背景透明
div背景透明样式: 样式代码: .alert{filter:alpha(opacity=100); /* IE */ -moz-opacity:1.0; /* Moz + FF */ opacity ...
- C#流总结(文件流、内存流、网络流、BufferedStream、StreamReader/StreamWriter、TextReader/TextWriter)
一.文件流 FileStream类主要用于读写磁盘文件.常用于向磁盘存储数据或读取配置文件. 读取文件: //文件流:读取 FileStream fileStream = File.Open(@&qu ...
- canvas 绘制矩形和圆形
canvas绘制有两神方法:1).填充(fill)填充是将图形内部填满. 2).绘制边框 (stroke)绘制边框是不把图形内部填满,只是绘制图形的外框. 当我们在绘制图形的时候,首先要设定好绘制的样 ...
- MongoDB(3):小的细节问题
1.文档 {“greeting”:“hello,world”,“foo”: 3} 文档中的键/值对是有序的,下面的文档与上面的文档是完全不同的两个文档. {“foo”: 3 ,“greeting”:“ ...
- jquery源码学习--iceDog
/** * @FileName : iceDog * @Author : PheonixHkbxoic * @Mail : hkbxoic@gmail.com * @DateTime : 2016-0 ...
- 通过Sql语句控制SQLite数据库增删改查
person类属性有Intenger id,String name,Intenger age,相应的构造方法和set get方法. package com.xh.tx.dao; import jav ...
- ARM-Linux S5PV210 UART驱动(3)----串口核心层、关键结构体、接口关系
尽管一个特定的UART设备驱动完全可以按照tty驱动的设计方法来设计,即定义tty_driver并实现tty_operations其中的成员函数,但是Linux已经在文件serial_core.c中实 ...