.:高级索引、反范式篇

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

第六步:应用高级索引

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

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

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

图 1 计算列

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

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

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

创建索引视图

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

为什么要使用视图?

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

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

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

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

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




转载请注明:http://www.xcqg58.com/zyyd/zyyd/13.html

  • 上一篇文章:
  •   
  • 下一篇文章: