MSSQL索引视图(indexed view)之简述及使用
乍一听到这个名字,可能感到有点陌生,这个对象是干嘛的呢?原理是什么?不用着急,我们看看下面的内容,慢慢就明白了。顾名思义,索引视图就是建有索引的视图,这是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)之简述及使用的更多相关文章
- 索引视图DEMO1
--use tempdb ----------------------在创建视图和所有底层表时,必须打开ANSI_NULLS以及QUOTED_IDENTIFIER选项 --SET ANSI_NULLS ...
- SQL Server索引视图以(物化视图)及索引视图与查询重写
本位出处:http://www.cnblogs.com/wy123/p/6041122.html 经常听Oracle的同学说起来物化视图,物化视图的作用之一就是可以实现查询重写,听起来有一种高大上的感 ...
- 数据库视图 (View)和EntityFramework Code First结合使用
问题来源: 项目需要进行查询操作,会涉及多表间的联合查询,使用Entity Framework会牵涉到效率问题,为增加查询速度,所以使用数据库视图技术,综合来讲是将Model类映射到数据库View. ...
- SQL Server 索引视图 聚簇索引
创建示例: 朋友的网站速度慢,让我帮忙看下,他用的SQL Server里面 有一个文章表里面有30多万条记录 还有一个用户表里面也差不多17万记录 偏偏当初设计的时候没有冗余字段 很多帖子信息需要JO ...
- MySQL索引视图
一.索引 索引是存放在模式(schema)中的一个数据库对象,索引的作用就是提高对表的检索查询速度, 索引是通过快速访问的方法来进行快速定位数据,从而减少了对磁盘的读写操作. 索引是数据库的一个对象, ...
- 使用SQL Server 2000索引视图提高性能
什么是索引视图? 许多年来,Microsoft? SQL Server? 一直都提供创建虚拟表(称为视图)的功能.在过去,这些视图主要有两种用途: 提供安全机制,将用户限制在一个或多个基表中的数据的某 ...
- SQLServer之创建索引视图
索引视图创建注意事项 对视图创建的第一个索引必须是唯一聚集索引. 创建唯一聚集索引后,可以创建更多非聚集索引. 为视图创建唯一聚集索引可以提高查询性能,因为视图在数据库中的存储方式与具有聚集索引的表的 ...
- Oracle视图 create View
视图是一种虚表,使用CREATE VIEW语句来定义视图,该视图是基于一个或多个表或视图的逻辑表.一个视图本身不包含任何数据, 视图所基于的表称为基表. 视图就相当于一条select 语句,定义了一个 ...
- 序列&权限&索引&视图的语句
create sequence 订单_订单编号_seq -- 创建序列 (成功后在sequence中查询) increment by start with maxvalue nocycle nocac ...
随机推荐
- 正则表达式 & re
本节主要内容: 1.正则表达式 2.re模块的使用 一.正则表达式 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE), 计算机 ...
- CentOS7 下更改源
在CentOS 7下更改yum源与更新系统. [1] 首先备份/etc/yum.repos.d/CentOS-Base.repo cp /etc/yum.repos.d/CentOS-Base.rep ...
- Qt532.线程(_beginthread)
1.(20180928)环境:Win7x64.Qt5.3.2 MSVC2010 OpenGL.ms2010 2.测试代码: ZC:我记得 之前在 VC6.vs08 上,还要选择 使用的是哪种 运行时线 ...
- jq ‘’操作‘’伪元素
1. 伪元素非 dom 元素,jq无法操作,但可以间接影响. 2. 操作方式 2.1 修改类 <!DOCTYPE html> <html lang="en"> ...
- Vue 中 export及export default的区别
相信很多人都在vue使用过export.export default.import,然而它们到底有什么区别呢? 在ES6中,export与export default均可用于导出常量.函数.文件.模块 ...
- P359 usestock2.cpp
IDE Qt Creator 4.0.3 stock.h #ifndef STOCK_H #define STOCK_H #include <string> class Stock //类 ...
- Android接入微信SDK之一:发起微信授权登录
1.重要的事情首先说! 包名.应用签名.app id 三者都必须和在腾讯上申请的一致!!!否则将不能成功. 包名:就是在腾讯上申请的包名 应用签名:使用微信官网提供的<签名生成工具>(这个 ...
- 第 7 章 多主机管理 - 047 - 管理 Machine
管理 Machine Docker Machine 则很简单 docker-machine env host1 显示访问 host1 需要的所有环境变量: 根据提示,执行 eval $(docker- ...
- Linux awk命令详解 + 练习
https://www.cnblogs.com/ftl1012/p/9250541.html 练习步骤: 1.我先是在root文件下面创建一个yan.txt文件,然后在文件中随便敲了几个字符串,由空格 ...
- eclipse java项目转idea java项目Invalid bound statement (not found): com.mapper 报错问题
再pom文件中加上 <build> <resources> <resource> <directory>src/main/java</direct ...