关闭

SQL Server索引的四个高级特性

发表于:2013-3-28 10:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yzsind    来源:51Testing软件测试网采编

  MySQL

  MySQL MYISAM存储引擎只支持堆存储,不支持聚集索引。

  MySQL INNODB存储引擎只能按主键聚集,如果没有主键就用一个内部隐藏主键代替。

  Oracle

  Oracle默认是堆存储,如果建成索引组织表则按主键聚集存储。Oracle还有一个种更高级的聚集存储,概念叫簇(Cluster),可以定义一个簇对象,然后将一个或多个表按字段顺序聚集的存储在这个簇中,从而实现多个表聚集存储,适用于一些主从表,如订单与订单明细,它们的数据是按关联字段聚集的存储在一个数据块中,订单与订单明细经常一起查询,所以这种逻辑只要读取一次数据块即可,如果用非Cluster,那需要读取多个数据块才OK。

  四、VIEW INDEX(视图索引)

  在视图上建索引,感觉没有意义,因为视图本身就是一个逻辑的概念,并不存储物理数据,何来索引之说。

  SQLServer

  支持。视图上建索引首先视图需要绑定架构。视图上需要先建一个唯的聚集索引,把数据持久化,持久化后还可以建其它新的索引,像普通表一样处理了。

  视图上建索引可以让数据持久化,一般有两种用途

  1、统计类数据查询性能优化

  如经常要做select sum(amount) from t2这样的操作,性能不好优化,并且t表数据变化不多,那么可以建一个视图(注意:需要加上with schemabinding选项):

CREATE VIEW V2
with schemabinding
AS
SELECT     SUM(amount) as sum_amount,COUNT_BIG (*) as cnt
FROM         t2

  然后在这个视图上建一个唯一聚集索引,数据就持久化了。

CREATE UNIQUE CLUSTERED INDEX idx_4 ON V2 (sum_amount)

  然后我们用noexpand方式查询v2索引视图,如下:

SELECT  sum_amount FROM  v2 WITH(NOEXPAND)

  性能会非常好,因为视图里只有一行数据,直接读取即可,不需要再从t2全表扫描汇总。

  2、自动实现多维度聚集存储

  数据库的表一般只能设计为按一种方式聚集存储(只允许有一个聚集索引),但在实际业务中存在一些多个维度的查询,比如交易表,需要按买家维度查询,也需要按卖家维度查询。普通表只能选择一种,如果要两种维度性能都很好很难,有时只能人工的分为两张表,一张表按买家聚集,一张表按卖家聚集,用程序或触发器维护两张表数据的一致性,这样看起来很别扭。采用视图索引后可以在主表(买家维度表)上建个视图,然后在视图上用卖家维度建聚集索引,以后如果要按买家查询则查询主表,如果按卖家查询才查询索引视图。

  这种性能优化方式只是一个方案设计,实践中没有经过验证。

  MySQL:不支持

  Oracle:不支持,物化视图可以起到类似的作用,并提供了更多的数据同步控制特性。

33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号