乍一听到这个名字,可能感到有点陌生,这个对象是干嘛的呢?原理是什么?不用着急,我们看看下面的内容,慢慢就明白了。顾名思义,索引视图就是建有索引的视图,这是MSSQL提供的一项技术,用于提升某些SQL语句的查询性能。索引视图上的第一个索引必须是唯一簇索引,之后,可以在视图上创建更多的非簇索引,因为视图上的簇索引存储方式和表上的簇索引一样,因此,视图上的簇索引可以提升某些查询的性能。查询优化器可以通过索引视图来加速查询的执行,同时,索引视图的名字不必出现于相关查询中。看到这里,常用Oracle的同学是否开始看出了物化视图(materialized view)的意思?,呵呵,继续往下看。

听起来不错,原来MSSQL也提供了类似Oracle中物化视图的东西,只是名字不同,先别高兴,MSSQL的这个东西虽然不错,但似乎限制和要求还挺多的,似乎比Oracle的物化视图还多,接下来看看使用索引视图时的要求吧。

1)   确保索引视图参考的表的set options都是正确的;

2)   确保创建表和视图前会话的set option是正确的;

3)   确保视图定义是确定性的;

4)   确保要以WITH SCHEMABINDING option创建视图;

5)   确保首先在视图上创建唯一簇索引;

6)   上面提到的set options正确值如下所示:

Ø  ANSI_NULLS                      ON

Ø  ANSI_PADDING                    ON

Ø  ANSI_WARNINGS*                 ON

Ø  ARITHABORT                       ON

Ø  CONCAT_NULL_YIELDS_NULL      ON

Ø  NUMERIC_ROUNDABORF          OFF

Ø  QUOTED_IDENTIFIER                ON

此外,还会有如下要求:

1)   运行CREATEINDEX命令的用户必须是视图的属主;

2)   创建索引时,IGNORE_DUP_KEY option必须被设置为OFF(默认值);

3)   视图定义中的表名必须包含模式名,例如:schema.tablename;

4)   视图中参考的用户自定义函数必须以WITH SCHEMABINDING option创建;

5)   视图中参考的任何用户定义的函数名必须包含模式名,例如: schema.function;

6)   用户定义后函数的数据存取属性必须是NO SQL,并且,外部存取属性必须是NO;

7)   通用语言运行时Common language runtime (CLR)函数可以出现于视图的selectlist中,但其不能是簇索引键列,同时,CLR函数也不能出现于视图的where子句和连接操作的on子句中。

8)   视图中CLR函数和CLR用户自定义类型的方法必须是下列的属性设置:

Ø  DETERMINISTIC =TRUE

Ø  PRECISE = TRUE

Ø  DATA ACCESS = NOSQL

Ø  EXTERNAL ACCESS =NO

9)   视图必须以WITH SCHEMABINDING option创建;

10)  视图必须仅参考同一个数据库中的基表。视图中不能参考其他视图。

11)  视图定义中的select语句不能包含下述T-SQL元素:

Ø  COUNTROWSET

Ø  functions (OPENDATASOURCE, OPENQUERY,OPENROWSET, AND OPENXML)

Ø  OUTER joins (LEFT, RIGHT, or FULL)

Ø  Derived table (defined by specifying aSELECT statement in the FROM clause)

Ø  Self-joins

Ø  Specifying columns by using SELECT * orSELECT table_name.*

Ø  DISTINCT

Ø  STDEV, STDEVP, VAR, VARP, or AVG

Ø  Common table expression (CTE)

Ø  float*, text, ntext, image, XML, orfilestream columns

Ø  Subquery

Ø  OVER clause, which includes ranking oraggregate window functions

Ø  Full-text predicates (CONTAIN, FREETEXT)

Ø  SUM function that references a nullableexpression

Ø  ORDER BY

Ø  CLR user-defined aggregate function

Ø  TOP

Ø  CUBE, ROLLUP, or GROUPING SETS operators

Ø  MIN, MAX

Ø  UNION, EXCEPT, or INTERSECT operators

Ø  TABLESAMPLE

Ø  Table variables

Ø  OUTER APPLY or CROSS APPLY

Ø  PIVOT, UNPIVOT

Ø  Sparse column sets

Ø  Inline or multi-statement table-valuedfunctions

Ø  OFFSET

Ø  CHECKSUM_AGG

12)  索引视图可以包含float列,但这些列不能出现在簇索引中;

13)  如果存在GROUP BY,则视图定义必须包含COUNT_BIG(*)且一定不要包含HAVING。这些GROUP BY限制仅用于视图定义中。一个查询可以在其计划中使用索引视图即使并不满足这条GROUPBY限制;

14)  如果视图定义包含一个GROUP BY子句,则唯一簇索引只能参考GROUP BY子句中确定的列。

好了,前面说了这么多限制和要求,让人看了头疼,不用想那么严重,很多技术都会写诸多的要求和限制,可我们不还是能自由自在的使用吗?别光说不练了,看看下面我们怎么创建和使用索引视图吧。

USE AdventureWorks2012;  
GO  
--为了支持索引视图设置相关options
SET NUMERIC_ROUNDABORT OFF;  
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL,ARITHABORT,  
    QUOTED_IDENTIFIER, ANSI_NULLS ON;  
GO  
--以with schemabinding创建索引视图
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL  
DROP VIEW Sales.vOrders ;  
GO  
CREATE VIEW Sales.vOrders  
WITH SCHEMABINDING  
AS  
    SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) ASRevenue,  
        OrderDate, ProductID, COUNT_BIG(*) ASCOUNT  
    FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader ASo  
    WHERE od.SalesOrderID = o.SalesOrderID  
    GROUP BY OrderDate, ProductID;  
GO  
--在视图上创建第一个唯一簇索引
CREATE UNIQUE CLUSTERED INDEX IDX_V1   
    ON Sales.vOrders (OrderDate, ProductID);  
GO  
--该查询能使用索引视图即使FROM子句中并未确定该视图
SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev,   
    OrderDate, ProductID  
FROM Sales.SalesOrderDetail AS od  
    JOIN Sales.SalesOrderHeader AS o ONod.SalesOrderID=o.SalesOrderID  
        AND ProductID BETWEEN 700 and 800  
        AND OrderDate >=CONVERT(datetime,'05/01/2002',101)  
GROUP BY OrderDate, ProductID  
ORDER BY Rev DESC;  
GO  
--该查询可以使用以上索引视图  
SELECT  OrderDate, SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) ASRev  
FROM Sales.SalesOrderDetail AS od  
    JOIN Sales.SalesOrderHeader AS o ONod.SalesOrderID=o.SalesOrderID  
        AND DATEPART(mm,OrderDate)= 3  
        AND DATEPART(yy,OrderDate) = 2002  
GROUP BY OrderDate  
ORDER BY OrderDate ASC;  
GO

 

MSSQL索引视图(indexed view)之简述及使用的更多相关文章

  1. 索引视图DEMO1

    --use tempdb ----------------------在创建视图和所有底层表时,必须打开ANSI_NULLS以及QUOTED_IDENTIFIER选项 --SET ANSI_NULLS ...

  2. SQL Server索引视图以(物化视图)及索引视图与查询重写

    本位出处:http://www.cnblogs.com/wy123/p/6041122.html 经常听Oracle的同学说起来物化视图,物化视图的作用之一就是可以实现查询重写,听起来有一种高大上的感 ...

  3. 数据库视图 (View)和EntityFramework Code First结合使用

    问题来源: 项目需要进行查询操作,会涉及多表间的联合查询,使用Entity Framework会牵涉到效率问题,为增加查询速度,所以使用数据库视图技术,综合来讲是将Model类映射到数据库View. ...

  4. SQL Server 索引视图 聚簇索引

    创建示例: 朋友的网站速度慢,让我帮忙看下,他用的SQL Server里面 有一个文章表里面有30多万条记录 还有一个用户表里面也差不多17万记录 偏偏当初设计的时候没有冗余字段 很多帖子信息需要JO ...

  5. MySQL索引视图

    一.索引 索引是存放在模式(schema)中的一个数据库对象,索引的作用就是提高对表的检索查询速度, 索引是通过快速访问的方法来进行快速定位数据,从而减少了对磁盘的读写操作. 索引是数据库的一个对象, ...

  6. 使用SQL Server 2000索引视图提高性能

    什么是索引视图? 许多年来,Microsoft? SQL Server? 一直都提供创建虚拟表(称为视图)的功能.在过去,这些视图主要有两种用途: 提供安全机制,将用户限制在一个或多个基表中的数据的某 ...

  7. SQLServer之创建索引视图

    索引视图创建注意事项 对视图创建的第一个索引必须是唯一聚集索引. 创建唯一聚集索引后,可以创建更多非聚集索引. 为视图创建唯一聚集索引可以提高查询性能,因为视图在数据库中的存储方式与具有聚集索引的表的 ...

  8. Oracle视图 create View

    视图是一种虚表,使用CREATE VIEW语句来定义视图,该视图是基于一个或多个表或视图的逻辑表.一个视图本身不包含任何数据, 视图所基于的表称为基表. 视图就相当于一条select 语句,定义了一个 ...

  9. 序列&权限&索引&视图的语句

    create sequence 订单_订单编号_seq -- 创建序列 (成功后在sequence中查询) increment by start with maxvalue nocycle nocac ...

随机推荐

  1. 登陆ArcGIS Server Manager时一直显示”请稍后……”

    登陆Server Manager时一直显示”请稍后……”新建完成ARcGIS ServerSite,设置用户名和密码.但是登陆时却发现一直处于等待状态,如下图: 更换为IE浏览器后发现,已经可以登陆并 ...

  2. python,函数的基本用法

    一.函数 函数的概念:对功能或者动作的封装可以帮我们把一段公共的代码提取出来 语法如下 def 函数名(形参): 函数体 函数名(实参) # 函数名() def yue(): print(" ...

  3. fit_transform和transform的区别

    来自:泡泡糖nana 来自:俞驰 1. fit_transform是fit和transform的组合. 2. fit(x,y)传两个参数的是有监督学习的算法,fit(x)传一个参数的是无监督学习的算法 ...

  4. 《剑指offer》第五十九题(队列的最大值)

    // 面试题59(二):队列的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小 ...

  5. Centos 7 Docker安装配置

    版本介绍 Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE.社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设 ...

  6. PhantomJS框架(初识无头浏览器)

    博主今天看到大神聊起 headless,首先我去了解了下这个概念  无头浏览器 selenium框架是有头浏览器的代表,即可看得见的浏览器 而headless browser无头浏览器,即看不见的浏览 ...

  7. putty 显示 ubuntu的文件乱码

    http://www.linuxidc.com/Linux/2012-01/52252.htm 下面几个注意点 1) Windows - Appearance - Font settings 里可以更 ...

  8. springboot---->获取不到yml配置文件指定的值

    import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.Spr ...

  9. pandas dataframe的合并(append, merge, concat)

    创建2个DataFrame: >>> df1 = pd.DataFrame(np.ones((4, 4))*1, columns=list('DCBA'), index=list(' ...

  10. redis 基本指令

    redis-cli开启redis客户端 1. set key value // 设置key-value 2. get key // 获取key 3. delete key [] // 删除key 4. ...