一、 是否需要冗余列
现在一些项目的数据库设计中,为了提高查询速度,把基本表的一些列也放到了数据表里,导致数据冗余。例如在热表的数据库里,原始数据表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 ...
随机推荐
-
iOS UINavigationController(内容根据iOS编程编写)
我们知道 UITabBarController 对象,可以通过使用该对象,用户可以切换不同的屏幕.当要切换的各个屏幕之间没有相互依存关系的时候,该对象可以很好的完成任务.但是当多个屏幕互有关系的时候, ...
-
Rails : css或js文件无法成功预编译或调用jquery类插件时预编译问题
调用bootstrap css框架时,将bootstrap文件夹放入 vendor/assets/下 bootstrap文件结构如下: [shenma@localhost demo]$ ls v ...
-
BizTalk开发系列(十九) BizTalk命名规范
目前BizTalk项目的开发人员比较少,但是在开发过程中还是需要命名规范的约束.根据以往BizTalk项目的经验,整理了BizTalk命 名规范.包括:BizTalk Application, Sch ...
-
(旧)子数涵数&#183;DW——图文混排页面
一.首先,打开Dreamweaver,新建一个的HTML项目. 二.在设计区里,写一些文字,随便写一点(也可以在代码区中的<body>和</body>之间写). 三.插入一张图 ...
-
java 12-2 String和StringBuffer之间的转换
为什么我们要讲解类之间的转换: A -- B的转换 我们把A转换为B,其实是为了使用B的功能. B -- A的转换 我们可能要的结果是A类型,所以还得转回来. String和StringBuffer的 ...
-
Java Hour 15 以写小说的心态
有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 突然想到我最近一直在追的小说,作者每天都会更新两章,而且质量挺高.所以从这篇开 ...
-
SQL Server数学函数
数学函数 1.计算绝对值ABS ABS函数对一个数值表达式结果计算绝对值(bit数据类型除外),返回整数. 语法结构: ABS(数值表达式) 返回值:与数值表达式类型一致的数据 示例: ) --输出 ...
-
Surface,送我都不要
本文作于前几天,由于今天的突发新闻,已作了修订. Nokia的着火史 自从Elop那篇着火的平台备忘录出炉,Nokia的杯具就已经造成,唯一令人不解的就是:Elop为什么还没有被开除? 距离这个备忘录 ...
-
HTML5-svg圆形饼状图进度条实现原理
<svg width="440" height="440" viewbox="0 0 440 440"> <circle ...
-
wordcloud制作logo
准备工作: 1.txt文本(ASCII) 2.参照图(色差大或自行调整扫描参数) 3.pycharm安装wordcloud 源码: from os import path from PIL impor ...