加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

T-SQL查询进阶:视图详解

发布时间:2016-09-27 16:47:45 所属栏目:MsSql教程 来源:站长网
导读:副标题#e# 简介 视图可以看作定义在SQL Server上的虚拟表.视图正如其名字的含义一样,是另一种查看数据的入口.常规视图本身并不存储实际的数据,而仅仅存储一个Select语句和所涉及表的metadata. 视图简单的理解如下: 通过视图,客户端不再需要知道底层table

这时,我建立视图并在这个视图上建立唯一聚集索引:

--建立视图CREATEVIEW v_Test_IndexedView
WITH SCHEMABINDING
ASSELECT p.Name,s.OrderQty,s.SalesOrderDetailID
FROM Production.Product p
 innerjoin Sales.SalesOrderDetail s
ON p.ProductID=s.ProductID
GO--在视图上建立索引CREATEUNIQUECLUSTEREDINDEX indexedview_test1
ON v_Test_IndexedView(SalesOrderDetailID)

接下来,套用刘谦的台词:见证奇迹的时刻到了,我们再次执行之前的查询:

T-SQL查询进阶:视图详解

从上面这个例子中,可以体会到索引视图的强大威力,即使你的查询语句中不包含这个索引视图,查询分析器会自动选择这个视图,从而大大的提高了性能.当然,这么强力的性能,只有在SQL SERVER企业版和开发版才有哦(虽然我见过很多SQL Server的开发人员让公司掏着Enterprise版的钱,用着Express版的功能……)

分割视图(Partitioned View)

分割视图其实从微观实现方式来说,整个视图所返回的数据由几个平行表(既是几个表有相同的表结构,也就是列和数据类型,但存储的行集合不同)进行UNION连接(对于UNION连接如果不了解,请看我之前的博文)所获得的数据集.

分割视图总体上可以分为两种:

1.本地分割视图(Local Partitioned View)

2.分布式分割视图(Distributed Partitioned View)

因为本地分割视图仅仅是为了和SQL Server 2005之前的版本的一种向后兼容,所以这里仅仅对分布式分割视图进行说明.

分布式分割视图其实是将由几个由不同数据源或是相同数据源获得的平行数据集进行连接所获得的,一个简单的概念图如下:

T-SQL查询进阶:视图详解

上面的视图所获得的数据分别来自三个不同数据源的表,每一个表中只包含四行数据,最终组成了这个分割视图.

使用分布式分割视图最大的好处就是提升性能.比如上面的例子中,我仅仅想取得ContactID为8这位员工的信息,如果通过分布式视图获取的话,SQL Server可以非常智能的仅仅扫描包含ContactID为8的表2,从而避免了整表扫描。这大大减少了IO操作,从而提升了性能.

这里要注意的是,分布式分割视图所涉及的表之间的主键不能重复,比如上面的表A ContactID是1-4,则表B的ContactID不能是2-8这个样子.

还有一点要注意的是,一定要为分布式分割索引的主键加Check约束,从而让SQL Server的查询分析器知道该去扫描哪个表,下面来看个例子.

在微软示例数据库AdventureWorks数据库,我通过ContactID从前100行和100-200行的数据分别存入两个表,Employee100和Employee200,代码如下:

--create Employee100SELECTTOP 100 * INTO Employee100
FROM HumanResources.Employee 
ORDERBY EmployeeID
--create Employee200SELECT *  INTO Employee200
FROM 
(SELECTTOP 100 *
FROM HumanResources.Employee 
WHERE EmployeeID NOTIN (SELECTTOP 100 EmployeeID FROM HumanResources.Employee ORDERBY EmployeeID)
ORDERBY HumanResources.Employee.EmployeeID)AS e

这时来建立分布式分割视图:

CREATEVIEW v_part_view_test
ASSELECT * FROM Employee100
UNIONSELECT * FROM Employee200

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读