当前位置:新注册送38元体验金 > 开户送38体验金不限id数据库 > SQL Server的优化器会缓存标量子查询结果集吗

SQL Server的优化器会缓存标量子查询结果集吗

文章作者:开户送38体验金不限id数据库 上传时间:2019-11-03

SELECT 2  UNION ALL

开户送38体验金不限id 1

 

 

 

DROP FUNCTION SLOW_FUNCTION;

GO

CREATE  FUNCTION SLOW_FUNCTION ( @p_value INT )

RETURNS INT

AS

    BEGIN

        DECLARE @dt_start DATETIME;

        DECLARE @dt_end DATETIME;

 

        SET @dt_start = GETDATE();

        SET @dt_end = DATEADD(ss, 2, GETDATE())

        WHILE @dt_start < @dt_end

            SET @dt_start = GETDATE();

 

        RETURN @p_value 10;

    END;

在这篇博客“ORACLE当中自定义函数性优化浅析”中,我们介绍了通过标量子查询缓存来优化函数性能: 标量子查询缓存(scalar subquery caching)会通过缓存结果减少SQL对函数(Function)的调用次数, ORACLE会在内存中构建一个哈希表来缓存标量子查询的结果。 那么SQL Server的优化器是否也会有类似这样的功能呢? 抱着这样的疑问,动手测试了一下,准备测试环境

 

 

 

开户送38体验金不限id, 

INSERT INTO TEST

 

SELECT 1  UNION ALL

SELECT 3  UNION ALL

然后创建函数SLOW_FUNCTION, 本想在函数里面使用WAITFOR DELAY延迟2秒构造那种性能开销较大的函数,来模拟达到实验效果。但是标量函数里面不允许使用WAITFOR DELAY,报“Invalid use of a side-effecting operator 'WAITFOR' within a function.”

 

CREATE TABLE TEST

(

   ID  INT

);

 

 

DECLARE @RowIndex INT =1;

 

WHILE @RowIndex <= 8 

BEGIN

    INSERT INTO TEST

    SELECT @RowIndex ;

    

    SET  @RowIndex = @RowIndex  1;

END

 

 

SELECT 1  UNION ALL

GO

 

SELECT 2  UNION ALL

CREATE  FUNCTION SLOW_FUNCTION(@p_value INT )

RETURNS INT

AS

BEGIN

    WAITFOR DELAY '00:00:00.002';

    RETURN @p_value 10;

END;

 

 

 

SELECT 3;

 

开户送38体验金不限id 2

构造出现重复数据的情况,然后测试对比,测试对比发现,在SQL Server中,优化器根本不会缓存子查询结果集。这种优化函数的技术在SQL Server中根本行不通。优化器根本没有这样的优化功能。

 

SELECT 1  UNION ALL

那么我就变相构造一个这样的函数,用一个循环一直延迟2秒后,标量函数才返回执行结果。

 

TRUNCATE TABLE TEST;

SELECT 2  UNION ALL

 

 

 

本文由新注册送38元体验金发布于开户送38体验金不限id数据库,转载请注明出处:SQL Server的优化器会缓存标量子查询结果集吗

关键词: