数据库优化实践:高级索引、反范式篇

经过索引优化,重构TSQL后你的数据库还存在性能问题吗?完全有可能,这时必须得找另外的方法才行 。SQL Server在索引方面还提供了某些高级特性,可能你还从未使用过,利用高级索引会显著地改善系统 性能,本文将从高级索引技术谈起,另外还将介绍反范式化技术。

第六步:应用高级索引

实施计算列并在这些列上创建索引

你可能曾经写过从数据库查询一个结果集的应用程序代码,对结果集中每一行进行计算生成最终显示 输出的信息。例如,你可能有一个查询从数据库检索订单信息,在应用程序代码中你可能已经通过对产品 和销售量执行算术操作计算出了总的订单价格,但为什么你不在数据库中执行这些操作呢?

请看下面这张图,你可以通过指定一个公式将一个数据库表列作为计算列,你的TSQL在查询清单中包 括这个计算列,SQL引擎将会应用这个公式计算出这一列的值,在执行查询时,数据库引擎将会计算订单 总价,并为计算列返回结果。

图 1 计算列

使用计算列你可以将计算工作全部交给后端执行,但如果表的行数太多可能计算性能也不高,如果计 算列出现在Select查询的where子句中情况会更糟,在这种情况下,为了匹配where子句指定的值,数据库 引擎不得不计算表中所有行中计算列的值,这是一个低效的过程,因为它总是需要全表扫描或全聚集索引 扫描。

因此问题就来了,如何提高计算列的性能呢?解决办法是在计算列上创建索引,当计算列上有索引后, SQL Server会提前计算结果,然后在结果之上构建索引。此外,当对应列(计算列依赖的列)的值更新时, 计算列上的索引值也会更新。因此,在执行查询时,数据库引擎不会为结果集中的每一行都执行一次计算 公式,相反,通过索引可直接获得计算列预先计算出的值,因此在计算列上创建一个索引将会加快查询速 度。

提示:如果你想在计算列上创建索引,必须确保计算列上的公式不能包括任何“非确定的 ”函数,例如getdate()就是一个非确定的函数,因为每次调用它,它返回的值都是不一样的。

创建索引视图

你是否知道可以在视图上创建索引?OK,不知道没关系,看了我的介绍你就明白了。

为什么要使用视图?

大家都知道,视图本身不存储任何数据,只是一条编译的select语句。数据库会为视图生成一个执行 计划,视图是可以重复使用的,因为执行计划也可以重复使用。

视图本身不会带来性能的提升,我曾经以为它会“记住”查询结果,但后来我才知道它除 了是一个编译了的查询外,其它什么都不是,视图根本记不住查询结果,我敢打赌好多刚接触SQL的人都 会有这个错误的想法。

但是现在我要告诉你一个方法让视图记住查询结果,其实非常简单,就是在视图上创建索引就可以了 。

如果你在视图上应用了索引,视图就成为索引视图,对于一个索引视图,数据库引擎处理SQL,并在数 据文件中存储结果,和聚集表类似,当基础表中的数据发生变化时,SQL Server会自动维护索引,因此当 你在索引视图上查询时,数据库引擎简单地从索引中查找值,速度当然就很快了,因此在视图上创建索引 可以明显加快查询速度。

但请注意,天下没有免费的午餐,创建索引视图可以提升性能,当基础表中的数据发生变化时,数据 库引擎也会更新索引,因此,当视图要处理很多行,且要求和,当数据和基础表不经常发生变化时,就应 该考虑创建索引视图。

时间: 2024-08-09 02:16:12

数据库优化实践:高级索引、反范式篇的相关文章

数据库优化实践:索引篇

你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错, 但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了 留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢 ,再次深入调查数据库后,你发现数据库表增长得很大,有些表甚至有上千万行数据,测试团队开始在生 产数据库上测试,发现订单提交过程需要花5分钟时间,但在网站上线前的测试中,提交一次订单只

数据库优化实践:性能检测工具篇

诊断数据库性能问题就象医生诊断病人病情一样,既要结合自己积累的经验,又要依靠科学的诊断报 告,才能准确地判断问题的根源在哪里.前面三篇文章我们介绍了许多优化数据库性能的方法,固然掌握 优化技巧很重要,但诊断数据库性能问题是优化的前提,本文就介绍一下如何诊断数据库性能问题. 第八步:使用SQL事件探查器和性能监控工具有效地诊断性能问题 在SQL Server应用领域SQL事件探查器可能是最著名的性能故障排除工具,大多数情况下,当得到一个 性能问题报告后,一般首先启动它进行诊断. 你可能已经知道,S

MySQL数据库优化技术之索引使用技巧总结_Mysql

本文实例总结了MySQL数据库优化技术的索引用法.分享给大家供大家参考,具体如下: 这里紧接上一篇<MySQL数据库优化技术之配置技巧总结>,进一步分析索引优化的技巧: (七)表的优化 1. 选择合适的数据引擎 MyISAM:适用于大量的读操作的表 InnoDB:适用于大量的写读作的表 2.选择合适的列类型 使用 SELECT * FROM TB_TEST PROCEDURE ANALYSE()可以对这个表的每一个字段进行分析,给出优化列类型建议 3.对于不保存NULL值的列使用NOT NUL

数据库优化实践:TSQL篇

在前面我们介绍了如何正确使用索引,调整索引是见效最快的性能调优方法,但一般而言,调整索引 只会提高查询性能.除此之外,我们还可以调整数据访问代码和TSQL,本文就介绍如何以最优的方法重构 数据访问代码和TSQL. 第四步:将TSQL代码从应用程序迁移到数据库中 也许你不喜欢我的这个建议,你或你的团队可能已经有一个默认的潜规则,那就是使用ORM(Object Relational Mapping,即对象关系映射)生成所有SQL,并将SQL放在应用程序中,但如果你要优化数据访 问性能,或需要调试应用

数据库优化实践:文件、文件组、分区篇

优化技巧主要是面向DBA的,但我认为即使是开发人员也应该掌握这些技巧,因为不是每个开发团队都 配有专门的DBA的. 第九步:合理组织数据库文件组和文件 创建SQL Server数据库时,数据库服务器会自动在文件系统上创建一系列的文件,之后创建的每一个 数据库对象实际上都是存储在这些文件中的.SQL Server有下面三种文件: 1).mdf文件 这是最主要的数据文件,每个数据库只能有一个主数据文件,所有系统对象都存储在主数据文件中, 如果不创建次要数据文件,所有用户对象(用户创建的数据库对象)也

数据库优化实践:信息跟踪篇

关联性能计数器日志和SQL事件探查器跟踪信息进行深入的分析 通过SQL事件探查器可以找出哪些SQL执行时间过长,但它却不能给出导致执行时间过长的上下文信息 ,但性能监视工具可以提供独立组件的性能统计数据(即上下文信息),它们正好互补. 如果相同的查询在生产库和测试库上的执行时间差别过大,那说明测试服务器的负载,环境和查询执 行上下文都和生产服务器不一样,因此需要一种方法来模拟生产服务器上的查询执行上下文,这时就需要 结合SQL事件探查器的跟踪信息和性能监视工具的性能计数器日志. 将二者结合起来分

数据库优化实践

  优化技巧主要是面向DBA的,但我认为即使是开发人员也应该掌握这些技巧,因为不是每个开发团队都配有专门的DBA的. 第九步:合理组织数据库文件组和文件 创建SQL Server数据库时,数据库服务器会自动在文件系统上创建一系列的文件,之后创建的每一个数据库对象实际上都是存储在这些文件中的.SQL Server有下面三种文件: 1).mdf文件 这是最主要的数据文件,每个数据库只能有一个主数据文件,所有系统对象都存储在主数据文件中,如果不创建次要数据文件,所有用户对象(用户创建的数据库对象)也都

数据库优化实践:MS SQL优化开篇

数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以 最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和 控制,数据库是数据管理的高级阶段,是在文件系统上发展起来的. 基本结构: 数据库分三个层次:分别为物理数据层.概念数据层.逻辑数据层. 物理数据层:它是数据库的最内层,是物理存贮设备上实际存储的数据的集合.这些数据是原始数据 ,是用户加工的对象,由内部模式描述的指令操作处理的位串.字符和字组成.

Oracle 12c数据库优化器统计信息收集的最佳实践

Oracle 12c数据库优化器统计信息收集的最佳实践 转载自     沃趣科技(ID:woqutech)  作者         刘金龙(译) 原文链接   http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-bp-for-stats-gather-12c-1967354.pdf 导  语 Oracle优化器会为SQL语句产生所有可能的访问路径(执行计划),然后从中选择一条COST值最低的执行路径,这个cost值是