HTML5技术

SQL SERVER中用户定义标量函数(scalar user defined function)的性能问题 - 潇湘隐(3)

字号+ 作者:H5之家 来源:H5之家 2016-01-26 15:00 我要评论( )

另外,我们来看看Performance Considerations of User-Defined Functions in SQL Server 2012这篇文章中,测试UDF的性能案例,本想单独翻译这篇文章,不过结合这篇文章,在此实验验证也是个不错的选择。下面案例全

另外,我们来看看Performance Considerations of User-Defined Functions in SQL Server 2012这篇文章中,测试UDF的性能案例,本想单独翻译这篇文章,不过结合这篇文章,在此实验验证也是个不错的选择。下面案例全部来自这篇博客。我们先准备测试环境:

CREATE FUNCTION dbo.Triple(@Input INT)        RETURNS INT AS BEGIN;   DECLARE @Result INT;   SET @Result = @Input * 3;   RETURN @Result; END; GO  CREATE TABLE dbo.LargeTable   (KeyVal INT NOT NULL PRIMARY KEY,    DataVal INT NOT NULL CHECK (DataVal BETWEEN 1 AND 10)   ); WITH Digits AS (SELECT d FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS d(d)) INSERT INTO dbo.LargeTable (KeyVal, DataVal) SELECT 1000000 * sm.d      + 100000 * ht.d + 10000 * tt.d + 1000 * st.d      + 100 * h.d + 10 * t.d + s.d + 1,        10 * RAND(CHECKSUM(NEWID())) + 1 FROM   Digits AS s,  Digits AS t,  Digits AS h,        Digits AS st, Digits AS tt, Digits AS ht,        Digits AS sm;GO CREATE INDEX NCL_LargeTable_DataVal ON dbo.LargeTable (DataVal);GO SET STATISTICS TIME ON;  SELECT MAX(dbo.Triple(DataVal)) AS MaxTriple FROM dbo.LargeTable AS d;  SELECT MAX(3 * DataVal) AS MaxTriple FROM dbo.LargeTable AS d;  SET STATISTICS TIME OFF;

 

如上所示,用户定义的标量函数dbo.Triple,测试用的的一个表dbo.LargeTable ,以及构造了1000000行数据。从下面我们可以看到用户定义标量函数性能确实很糟糕。

clipboard[8]

下面测试4中写法的性能。相信这个简单的脚本,大家都能看懂,在此不做过多描述、说明:

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;SET NOCOUNT ON;SET STATISTICS TIME ON; SELECT MAX(dbo.Triple(DataVal)) AS MaxTriple FROM dbo.LargeTable AS d;  SET STATISTICS TIME OFF;

clipboard[9]

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;SET STATISTICS TIME ON; SELECT MAX(dbo.Triple(DataVal)) AS MaxTriple FROM (SELECT DISTINCT DataVal FROM dbo.LargeTable) AS d; SET STATISTICS TIME OFF;

clipboard[10]

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS; SET STATISTICS TIME ON;  SELECT MAX(3 * DataVal) AS MaxTriple  FROM (SELECT DISTINCT DataVal FROM dbo.LargeTable) AS d;  SET STATISTICS TIME OFF;

clipboard[11]

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS; SET STATISTICS TIME ON;  SELECT MAX(3 * DataVal) AS MaxTriple  FROM dbo.LargeTable AS d;  SET STATISTICS TIME OFF;

clipboard[12]

Performance Considerations of User-Defined Functions in SQL Server 2012博客里面统计的数据如下所示

T-SQL Syntax

Avg CPU Time in ms

Avg Elapsed Time in ms

Function, no distinct subquery

12925.0

14247.8

Function, subquery

853.0

853.8

Inline calculation, subquery

853.2

850.4

Inline calculation, no distinct subquery

0.0

0.0

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Android 代码库(自定义一套 Dialog通用提示框 ) - 小小情意

    Android 代码库(自定义一套 Dialog通用提示框 ) - 小小情意

    2017-04-21 11:01

  • 自定义input默认placeholder样式 - 小碎步

    自定义input默认placeholder样式 - 小碎步

    2017-04-20 13:00

  • 腾讯云数据库团队:SQL Server 数据加密功能解析 - 腾讯云技术社区

    腾讯云数据库团队:SQL Server 数据加密功能解析 - 腾讯云技术社区

    2017-03-17 10:00

  • Omi实战-QQ附近用户列表Web页 - 【当耐特】

    Omi实战-QQ附近用户列表Web页 - 【当耐特】

    2017-02-24 09:33

网友点评
m