前言

上一节我们讨论了视图中的一些限制以及建议等,这节我们讲讲关于在UDF和视图中使用SCHEMABINDING的问题,简短的内容,深入的理解,Always to review the basics。

SCHEMABINDING

在上节中我们讲到在视图创建索引时必须指定SCHEMABINDING,所以我们有必要先去了解下这个知识点再继续往下讲解。SCHEMABINDING到底是什么呢?在视图和UDF中有这个选项,如果在视图和UDF函数中指定了这个选项,那么说明会将视图和UDF严格绑定到数据库对象中去,一来指定此选项可以将其严格绑定到数据库对象中去,二来可以提高查询计划执行的性能。下面我们来看看关于SCHEMABINDING在UDF和视图中的使用。

在UDF中的使用

创建UDF函数有三种方式,我们一一来过一遍。

(1)创建TVF内嵌表值函数

USE TSQL2012
GOIF OBJECT_ID('dbo.GetOrderId') IS NOT NULLDROP FUNCTION dbo.GetOrderId;
GOCREATE FUNCTION dbo.GetOrderId (@custid INT) RETURNS TABLE WITH SCHEMABINDING
AS
RETURNSELECT orderid FROM Sales.Orders WHERE custid = @custid
GO

上述UDF是通过TVF的方式来创建,当需要在里面声明一个临时变量并返回时我们需要像如下操作。

(2)创建标量值函数

USE TSQL2012
GOIF OBJECT_ID('dbo.GetOrderId') IS NOT NULLDROP FUNCTION dbo.GetOrderId;
GOCREATE FUNCTION dbo.GetOrderId
(@custid INT)  RETURNS INT WITH SCHEMABINDING
AS
BEGIN  DECLARE @tempID INT  SELECT @tempID = orderid FROM Sales.Orders  WHERE custid = @custid;      RETURN @tempID;
END;  

当利用UDF来对查询出来的数据进行插入到临时表中时,我们可以像如下操作

(3)创建多语句TVF内嵌表值函数

USE TSQL2012
GOCREATE FUNCTION [UDF]
(@PageNum int, @PageSize int)
RETURNS @TestTable TABLE (RowNumber INT, ID INT, Name VARCHAR(20))
AS
BEGINdeclare @RowNumber int;WITH CAs (SELECT 'RowNumber' = ROW_NUMBER() OVER(ORDER BY id DESC), orderid, shipnameFROM Sales.Orders)INSERT    @TestTableSELECT rownumber, orderid, shipnamefrom CRETURN
END

好了我们过了一遍关于UDF创建的几种方式,我们回到主题,我们创建一个如下UDF

USE TSQL2012
GOIF OBJECT_ID('dbo.GetId') IS NOT NULLDROP FUNCTION dbo.GetId;
GOCREATE FUNCTION dbo.GetId (@id INT) RETURNS TABLE WITH SCHEMABINDING
AS
RETURNSELECT val1 FROM compare.t_inner WHERE id = @id
GO

此时我们在对应数据库中的表值函数文件夹下能看到我们创建的函数

因为上述我们是查询表compare.t_inner中的值,此时我们删除该表看看。

此时我们会发现该表无法删除出现上述错误。因为我们上述创建的UDF依赖于compare.t_inner表,所以现在无法删除该表,该表引用了自定义函数GetId。下面我们修改上述我们在UDF中查询的列val1为val3看看

在VIEW中的使用

USE TSQL2012
GOIF OBJECT_ID('dbo.GetId') IS NOT NULLDROP FUNCTION dbo.GetId;
GOCREATE VIEW GetId WITH SCHEMABINDING
AS
SELECT val1 FROM compare.t_inner

此时删除表compare.t_inner依然会出现和UDF中的错误。在使用SCHEMABINDING约束时不能进行*操作,会出现如下图错误:

USE TSQL2012
GOIF OBJECT_ID('dbo.GetId') IS NOT NULLDROP FUNCTION dbo.GetId;
GOCREATE VIEW GetId WITH SCHEMABINDING
AS
SELECT * FROM compare.t_inner

下面再看其他情况利用视图到跨数据库进行查询,我们创建两个数据库并分别在对应数据库创建一个测试表。

CREATE DATABASE TEST1
CREATE DATABASE TEST2
GO
-- Table1
USE Test1
GO
CREATE TABLE TABLE1 (ID INT)
GO
USE Test2
GO
-- Table2
CREATE TABLE TABLE2 (ID INT)
GO
USE Test1
GO

接下来通过执行SCHEMABINDING来创建视图

CREATE VIEW CrossDBView
WITH SCHEMABINDING
AS
SELECT t1.ID AS t1id, t2.ID AS t2id
FROM Test1.dbo.Table1 t1
INNER JOIN Test2.dbo.Table2 t2 ON t1.ID = t2.ID
GO

上述指定SCHEMABINDING出现错误也就是说在跨数据库查询时会出现错误,对于引用对象仅限于两部分名称。到这里我们为在视图和UDF中使用SCHEMABINDING作出如下结论:

(1)在视图和UDF中使用SCHEMABINDING时必须满足两个要求,第一个是不允许在SELECT子句中使用*,第二个则是当引用对象时必须使用架构限定的两部分名称。

(2)在视图上创建索引时必须指定SCHEMABINDING。

如上讲了这么多关于SCHEMABINDING使用的限制,可以算是缺点吧,难道就没优点了么,如果没优点我们也不会讲了,当然也没必要给出SCHEMABINDING的使用了。当指定SCHEMABINDING时能提高UDF和视图的查询性能,当对象指定架构对象时,在查询计划中不会产生不必要的Spoll操作。我们看如下例子:

CREATE FUNCTION dbo.ComputeNum(@i int)
RETURNS int
BEGIN  RETURN @i * 2 + 50
END  

上述我们没有提供SCHEMABINDING选项,此时UDF不会访问任何数据库对象,当一个函数和视图没有SCHEMABINDING选项时就无法确保底层的数据库对象是什么,所以此时会去访问每个正在执行的UDF,为了避免这种性能问题,我们通过指定SCHEMABINDING是安全的并且不会去遍历访问每一个正在运行的UDF。所以在视图和UDF中一般建议指定SCHEMABINDING选项。

总结

本节我们讨论了在UDF和视图中指定SCHEMABINDING的问题,其实对视图查询还是有诸多限制,大部分情况下利用常规查询和存储过程来实现更加灵活。我们下节看看APPLY运算符的使用,简短的内容,深入的理解,我们下节再会。

转载于:https://www.cnblogs.com/CreateMyself/p/6193163.html

SQL Server-聚焦在视图和UDF中使用SCHEMABINDING(二十六)相关推荐

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

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

  2. 增强的PolyBase SQL 2019-外部表SQL Server,目录视图和下推式

    This article is part 4 of the series for SQL Server 2019 Enhanced PolyBase. Let quickly recap the pr ...

  3. SQL Server实验——数据库视图的定义与使用

    SQL Server实验--数据库视图的定义与使用 学生选课数据库的创建 创建学生信息表student 创建课程信息表course 创建学生选课信息表sc 插入相关信息 视图的创建 基本应用 一.创建 ...

  4. SQL Server通过动态视图里查找阻塞超过30秒的会话

    SQL Server通过动态视图里查找阻塞的会话 简介 对于阻塞我们可以通过动态视图dm_exec_requests.dm_tran_locks等关联通过构建递归式树形结构来查找出阻塞超过30秒的会话 ...

  5. SQL Server里的 ISNULL 与 Oracle 中的 NULLIF

    SQL Server里的 ISNULL 与 Oracle 中的 NULLIF不同: SQL Server 中有两个参数,语法:     ISNULL(check_expression, replace ...

  6. 报错:此版本的SQL Server Data Tools与此计算机中安装的数据库运行时组件不兼容...

    在Visual Studio 2012中使用Entity Framework,根据模型生成数据库时,报如下错误: 无法在自定义编辑器中打开Transact-SQL文件 此版本的SQL Server D ...

  7. 在SQL Server Management Studio(SSMS)中调试存储过程

    Debugging is one of the most important but painful parts of any software process. To find some error ...

  8. SQL Server 2017 在Windows Server2012 R2中安装失败的解决方法

    SQL Server 2017 在Windows Server2012 R2中安装失败的解决方法 由于Windows Server2012 R2更新问题导致SQL Server 2017安装失败.提示 ...

  9. SQL Server 数据库的整理优化的基本过程(二)

    SQL Server 数据库的整理优化的基本过程(二) 高建刚 第一节 基本维护 第二节 索引 索引相信大家都不陌生,而且在因特网上,有了很多关于如何通过索引来优化数据库的文章,在这里,我主要是结合我 ...

最新文章

  1. vs2010中添加项目中找不到EntityFramework实体框架解决办法
  2. 2022年度BCI奖 |THE ANNUAL BCI AWARD
  3. 优化tableView性能(针对滑动时出现卡的现象)
  4. java 访问 网络swf_JAVA访问网络资源
  5. 隐藏与显现_手机键盘摇一摇,隐藏功能立马显现,太棒了
  6. 人类资产数字化是大势所趋
  7. Lua和C++交互详细总结
  8. 如何远程调试部署在CloudFoundry平台上的nodejs应用
  9. Java基础---分支结构(if--else / switch---case)
  10. origin2016中怎么画多条曲线,并且分别给不同曲线设置标记
  11. classes目录绝对路径
  12. 读书笔记_中国期货市场量化交易(李尉)04
  13. java类加载配置文件_如何在java类中读取Properties配置文件
  14. 查询正在使用的用户(删除用户时)
  15. Yasm的作用及NASM详解
  16. Toast调整显示位置
  17. 2016年度中国手游报告:梦幻西游手游是最大赢家
  18. Kruskal算法 数据结构 浙江大学 陈越、何钦铭
  19. 拼多多秒杀活动的谣言
  20. Processing 入门基础【秒懂小白篇】

热门文章

  1. C# mysql 链接 遇到 异常 Authentication with old password no longer supported, use 4.1 style passwords....
  2. Slackware Linux 14.0 RC5 发布
  3. 如何找回系统盘丢失的空间
  4. Flutter Button 图文分析、效果浏览
  5. Android对Bitmap的内存优化
  6. Win10系统Win键无法使用
  7. CompletionService VS ExecutorService
  8. 原创:Spring整合junit测试框架(简易教程 基于myeclipse,不需要麻烦的导包)
  9. android支付宝支付开发过程
  10. (TOJ1531)爱的伟大意义