SQL Server由表值函数引起的性能问题解决

原创 2018年04月16日 19:10:38

有段SQL使用了表值函数的伪代码是这样的:

select @TotalCount=count(*) from 
(
select * from FunA(@param1) a 
)
where a.Column1 in(select * from FunB(@param2))

其中FunA和FunB是表值函数(多语句表值函数),各返回一张表,并分别对返回的表进行再次查询操作

当数据量比较大时,其中FunA返回3万,FunB返回6万,则整个语句执行比较慢。

经查询相关文章,发现是多语句表值函数再进行操作时(如再次查询、join等),会产生大量额外的逻辑读导致的。

解决方法 :

方法1、如果表值函数只是返回一张表,则可以使用内联表值函数代替多语句表值函数,内联表值函数在SQL Server里会当作视图使用,因此读取是正常的,其和多语句表值函数在语法上有点区别,具体可以参考:

https://blog.csdn.net/winnyrain/article/details/79964815

方法2、将表值函数存入临时表后再操作。对动态结构的表创建临时表的语法是:select * into #temp from Table

在这里使用方法2解决上面的问题,代码如下:

select * into #tempA from (select * from FunA(@param1))
select * into #tempB from (select * from FunB(@param2))
select @TotalCount=count(*) from 
(
select * from #tempA a 
)
where a.Column1 in(select * from #tempB)

参考:

http://www.cnblogs.com/CareySon/p/4269897.html


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/winnyrain/article/details/79964510

sql server 2008表值函数的使用

场景:输入片区号,查询该片区的所有用户最后一次的消费记录。 有两张表:用户信息、流水账。如果用传统方法查: 1.查询该地区所有的人。 2.循环查询出每个人最后一次的消费记录问题:数据连接次数=人数+1...
  • u012662357
  • u012662357
  • 2016-04-06 17:34:33
  • 1577

sqlserver2008r2中使用表值函数

1.定义表值类型 CREATE TYPE [dbo].[TableType] AS TABLE( [Id] [varchar](20) NOT NULL, [Num] [int] NOT NULL...
  • lnc2003
  • lnc2003
  • 2015-01-08 13:20:11
  • 562

SQL Server函数——表值函数和标量函数

create table student (  sid int identity primary key,  sname varchar(20),  gender tinyint,  age...
  • ljxqsqmoliwei
  • ljxqsqmoliwei
  • 2015-06-04 10:28:17
  • 1333

Sql server 的表值函数是返回一个Table类型,table类型相当与一张存储在内存中的一张虚拟表。

Sql server 的表值函数是返回一个Table类型,table类型相当与一张存储在内存中的一张虚拟表。 实现表值函数很简单: 下面是一个不带输入参数的表值函数 ...
  • d_o_n_g2
  • d_o_n_g2
  • 2015-10-27 09:39:29
  • 1512

SqlServer性能监控和优化总结

如何监视和查看sql server的性能 http://jingyan.baidu.com/article/a378c9609af34eb32828303a.html 打开sql serv...
  • bcbobo21cn
  • bcbobo21cn
  • 2016-05-03 10:04:04
  • 3452

Sql Server REPLACE函数

Replaces all occurrences of a specified string value with another string value. 语法: REPLACE ( stri...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2014-05-15 09:30:33
  • 1317

SQL Server 2008 表变量参数(表值参数)用法

    表值参数是 SQL Server 2008 中的新参数类型。表值参数是使用用户定义的表类型来声明的。使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如...
  • htl258
  • htl258
  • 2010-06-27 02:28:00
  • 23331

SQL SERVER函数——表值函数的处理

SQL SERVER函数——表值函数的处理      有些情况可能用下表值函数,表值函数主要用于数据计算出来返回结果集,可以带参数(和视图的一个大的区别),如果函数中没有过多的逻辑处...
  • happymagic
  • happymagic
  • 2012-07-29 16:09:31
  • 5976

sqlserver自定义函数(标量值函数,表值函数)

在sqlserver中,根据函数返回值形式的不同将用户自定义的函数分为”标量值函数“和”表值函数“两种类型。如下图所示,可以在数据库中的可编程->函数中进行查看。 标量函数,返回单个值,表值函数返...
  • u014555474
  • u014555474
  • 2015-03-26 22:07:59
  • 2255

SQL Server查询性能调优、捕捉和评估查询性能

一、优化的层次:   1、语句级别(包含索引)   2、系统级别:索引碎片、锁定、统计信息、系统参数配置、数据库设计   3、底层级别:硬件、网络       二、SQL Serv...
  • kufeiyun
  • kufeiyun
  • 2014-04-15 10:46:44
  • 6304
收藏助手
不良信息举报
您举报文章:SQL Server由表值函数引起的性能问题解决
举报原因:
原因补充:

(最多只允许输入30个字)