位置: 编程技术 - 正文

和表值函数连接引发的性能问题分析(数据表的联接)

编辑:rootadmin

推荐整理分享和表值函数连接引发的性能问题分析(数据表的联接),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:数据表的联接,表格函数连接,表与表之间的数据匹配,和表值函数连接在一起,表值函数怎么调用,表格函数连接,表值函数怎么调用,和表值函数连接在一起,内容如对您有帮助,希望把文章链接给更多的朋友!

表值函数

SQL Server中提供了类似其他编程语言的函数,而函数的本质通常是一段代码的封装,并返回值。在SQL Server中,函数除了可以返回简单的数据类型之外(Int、Varchar等),还可以返回一个集合,也就是返回一个表。 而根据是否直接返回集合或是定义后再返回集合,表值函数又分为内联用户定义表值函数和用户定义表值函数(下文统称为表值函数,省去“用户定义”四个字)。

内联表值函数 内联表值函数和普通函数并无不同,唯一的区别是返回结果为集合(表),而不是简单数据类型,一个简单的内联表值函数如代码清单1所示(摘自MSDN)。

代码清单1.一个简单的表值函数

用户定义表值函数而用户定义表值函数,需要在函数开始时定义返回的表结构,然后可以写任何代码进行数据操作,插入到定义的表结构之后进行返回,一个稍微负责的用户定义表值函数示例如代码清单2所示(摘自MSDN)。

代码订单2.表值函数

为什么要用表值函数 看起来表值函数所做的事情和存储过程并无不同,但实际上还是有所差别。是因为表值函数可以被用于写入其他查询,而存储过程不行。此外,表值函数和Apply操作符联合使用可以极大的简化连接操作。

如果存储过程符合下述条件的其中一个,可以考虑重写为表值函数。

&#;存储过程逻辑非常简单,仅仅是一个Select语句,不用视图的原因仅仅是由于需要参数。&#;存储过程中没有更新操作。&#;存储过程中没有动态SQL。&#;存储过程中只返回一个结果集。&#;存储过程的主要目的是为了产生临时结果集,并将结果集存入临时表以供其他查询调用。

用户定义表值函数的问题

表值函数与内联表值函数不同,内联表值函数在处理的过程中更像是一个视图,这意味着在查询优化阶段,内联表值函数可以参与查询优化器的优化,比如将筛选条件(Where)推到代数树的底部,这意味着可以先Where再Join,从而可以利用索引查找降低IO从而提升性能。 让我们来看一个简单的例子。下面代码示例是一个简单的和表值函数做Join的例子: 首先我们创建表值函数,分别为内联表值函数方式和表值函数方式,如代码清单3所示。

代码清单3.创建两种不同的函数

现在,我们使用相同的查询,对这两个表值函数进行Join,代码如代码清单4所示。

和表值函数连接引发的性能问题分析(数据表的联接)

代码清单4.表值函数和内联表值函数做Join

执行的成本如图1所示。

图1.两种方式的成本

从IO来看,很明显是选择了次优的执行计划,BusinessEntityContact选择了次查找,而不是一次扫描。而内联表函数能够正确知道扫描一次的成本远低于一次查找。

那问题的根源是内联表值函数,对于SQL Server来说,和视图是一样的,这意味着内联表值函数可以参与到逻辑执行计划的代数运算(或者是代数树优化)中,这意味着内敛表可以进一步拆分(如图1所示,第二个内联表的查询,执行计划具体知道内敛表中是SalesOrderHeader表和SalesOrderDetail表,由于查询只选择了一列,所以执行计划优化直到可以无需扫描SalesOrderHeader表),对于内联表值函数来说,执行计划可以完整知道所涉及的表上的索引以及相关统计信息等元数据。另一方面,表值函数,如图1的第一部分所示,表值函数对整个执行计划来说是一个黑箱子,既不知道统计信息,也没有索引。执行计划中不知道表值函数所涉及的表(图1中为#AE4E这个临时表,而不是具体的表明),因此对整个执行计划来说该结果集SQL Server会假设返回的结果非常小,当表值函数返回的结果较多时(如本例所示),则会产生比较差的执行计划。因此综上所述,在表值函数返回结果极小时,对性能可能没有影响,但返回结果如果略多,则一定会影响执行计划的质量。

如何处理首先,在SQL Server中,我们要找出现存的和表值函数做Join的语句,通过挖掘执行计划,我们可以找出该类语句,使用的代码如代码清单5所示。

代码清单5.从执行计划缓存中找出和表值函数做Join的查询

结果如图2所示。

图2.执行计划缓存中已经存在的和表值函数做Join的查询

小结本文阐述了表值函数的概念,表值函数为何会影响性能以及在执行计划缓存中找出和表值函数做Join的查询。对于和表值函数做Apply或表值函数返回的行数非常小的查询,或许并不影响。但对于返回结果较多的表值函数做Join,则可能产生性能问题,因此如果有可能,把表值函数重写为内联表值函数或将表值函数的结果存入临时表再进行Join可提升性能。

参考资料:

SQLSERVER数据备份文件的分割备份方法 当完整备份数据库的时候,我们有时候可能会遇到一种极端情况,比如服务器上C,D,E三个盘符都只剩下5G空间了但是如果要完整备份业务库需要G的空间

sql server的 update from 语句的深究 一般来说update一个表,使用where语句即可:UPDATETtestSETstatusInd='ACTIVE'WHEREid=注意:update语句后面的table名称,是不可以启用别名的。那么此时的id字段,

sqlserver 增删改查一些不常用的小技巧 一Insert语句1.在数据中只插入默认值:insertinto[DBTrain].[dbo].[log_info]defaultvalues2.在可以为null的字段中,如果要设置null,可以按下[Ctrl+0],注意是零不是o,如

标签: 数据表的联接

本文链接地址:https://www.jiuchutong.com/biancheng/348061.html 转载请保留说明!

上一篇:在SQL Server中将数据导出为XML和Json的方法(在sqlserver数据库中,执行sql语句)

下一篇:SQLSERVER数据备份文件的分割备份方法(sqlserver数据备份恢复)

  • 用友U8财务报表UFO怎么生成
  • 资产负债表中没有实收资本
  • 季度盈利可以弥补以用以前年度亏损弥补
  • 跨年度冲红的账务处理
  • 专利奖励金额
  • 超市购物卡购物刷卡显帐号吗
  • 适用会计制度备注怎么填?
  • 购买自用应税车辆的应自购买之日起
  • 丢失发票已报税证明单取消
  • 公司成立时代垫资合法吗
  • 设备维修费怎么入账
  • 传媒公司的成本构成有哪些
  • 资产负债表年初余额是不是一直不变
  • 个人可以去税务局开票吗?
  • 医疗器械技术服务合同
  • 原始股 出售
  • 商品进销差价的核算方法
  • 农民工预储金怎么开户
  • 赎回股份是利好还是利空
  • 多结转成本会导致什么
  • 车间机物料消耗属于间接生产费用吗
  • 农民合作社扶持政策
  • 发票来了冲预付账款怎么记账
  • php随机生成1到3的数字
  • 公司帮员工代缴社保有风险吗
  • vue编写网页
  • vrvarp.exe是什么
  • fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
  • 员工冲借款应该怎么做账
  • 企业所得税的征税范围是什么
  • 出现又离开
  • 陶尔米纳电影节
  • ROS2+cartographer+激光雷达+IMU里程计数据融合(robot_locazation) 建图
  • php正则表达式匹配字符串
  • php 银行卡支付
  • 分页显示怎么实现
  • thinkphp3.0
  • php抽奖程序源码
  • 实收资本挂在其他应收款怎么冲销
  • 大前端最新
  • 简述跨期摊提账户
  • 差旅费取得发票怎么处理
  • 其他发票包括哪些
  • 商业承兑汇票退回给上手公司怎么操作
  • 发票开预付卡充值可以计入费用吗
  • 纳税人识别号和公司税号一样吗
  • 临时工工资账务处理该怎么进行
  • 员工福利费属于什么会计科目
  • 小规模的认定标准
  • 复利现值系数表系数表
  • 公司支付员工工资方式有几种
  • 银行定期利息怎么算一年
  • 税控盘上报
  • 工程安装公司注册条件
  • 跨年收入冲销如何申报
  • 支付宝账户收到美元怎么转换成人民币
  • 怎么设置库存限额
  • ie8 开发者工具
  • 你所不知道的童话动画版免费观看
  • fedora使用
  • 如何重装系统win7具体步骤
  • UPnPFramework.exe - UPnPFramework进程介绍
  • win8怎样关闭系统更新
  • 什么叫另类
  • win10开始无法打开
  • win8怎么玩帝国时代2
  • /usr/bin/install: 无法创建一般文件‘/usr/local/man/man1/cjpeg.1’: 没有那个文件
  • pebble框架
  • js里的this指向
  • android images
  • js中的表达式是什么
  • linux 批量修改
  • jquery easy ui
  • javascript面向对象编程
  • 企业分期收款销售商品,即商品已经交付
  • 甘肃增值税发票查验平台官网
  • 湖北省国家税务局历任局长
  • 国家税务总局在哪
  • 登录上海电子税务局显示获取公告失败
  • 2018年北京个人所得税查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设