sql标量值函数非常慢

Posted

技术标签:

【中文标题】sql标量值函数非常慢【英文标题】:sql scalar-valued functions incredibly slow 【发布时间】:2016-10-11 21:46:03 【问题描述】:

SQL Server 2012 - 我有一个视图(复杂的),其中一列需要去掉任何非数字的内容。以下工作到一定程度;

STUFF(dbo.campaign_tracking_clicks.tt_cpn, 1, PATINDEX('%[0-9]%', dbo.campaign_tracking_clicks.tt_cpn) - 1, '') AS emailerid

如果值的末尾有除数字以外的任何内容,我会收到错误消息。

我有一个标量值函数'

/****** Object:  UserDefinedFunction [dbo].[KeepNumCharacters]    Script Date: 10/11/2016 1:05:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Function [dbo].[KeepNumCharacters](@Temp VarChar(100)) Returns VarChar(100)
 AS
 Begin    
 While PatIndex('%[^0-9]%', @Temp) > 0  
 Set @Temp = Stuff(@Temp, PatIndex('%[^0-9+]%', @Temp), 1, '')    
  Return @TEmp
 End

我正在使用;

dbo.KeepNumCharacters(dbo.campaign_tracking_clicks.tt_cpn) AS emailerid

但是,执行需要很长时间。我已经搜索和搜索,但没有找到替代方案。

【问题讨论】:

听起来这个数据应该在它自己的字段中。 我没有那么奢侈。 你的表有多少行? 尝试查看估计的执行计划,它可能会提示缺失的索引对您的查询有帮助。 @dubstylee 索引将有助于检索行,但他的问题是SELECT 部分中的每一行由KeepNumCharacters 处理,这不会从索引中受益. 【参考方案1】:

是的,标量用户定义函数通常会使查询变慢。有时很慢。 参见例如T-SQL User-Defined Functions: the good, the bad, and the ugly。

在您的情况下,我看不到如何将标量函数重写为内联表值函数。

一种选择是在表中添加一个额外的列,用于保存标量函数计算的结果。您可以编写一个触发器,使其内容在主列更改时与主列保持同步。

它会减慢更新和插入的速度,但会加快您的 SELECT 查询速度。

【讨论】:

以上是关于sql标量值函数非常慢的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中调用标量值函数

sql [sql]标量值函数示例

为啥 SQL Server 标量值函数变慢?

具有嵌套 CASES 的 Sql 标量值函数

sql中的表值函数与标量值函数区别与用法

在 SQL Server 中计算 GS1 校验位的标量值函数