SQL Server

SQL Server的優化器會快取標量子查詢結果集嗎

Google+ Pinterest LinkedIn Tumblr

在這篇部落格 「 ORACLE當中自定義函式性優化淺析 中,我們介紹了通過標量子查詢快取來優化函式效能: 標量子查詢快取(scalar subquery caching)會通過快取結果減少SQL對函式(Function)的呼叫次數, ORACLE會在記憶體中構建一個雜湊表來快取標量子查詢的結果。 那麼SQL Server的優化器是否也會有類似這樣的功能呢? 抱著這樣的疑問,動手測試了一下,準備測試環境

CREATE TABLE TEST
(
   ID  INT
);
 
 
DECLARE @RowIndex INT =1;
 
WHILE @RowIndex <= 8 
BEGIN
    INSERT INTO TEST
    SELECT @RowIndex ;
    
    SET  @RowIndex = @RowIndex +1;
END

然後建立函式SLOW_FUNCTION, 本想在函式裏面使用 WAITFOR DELAY 延遲2秒構造那種效能開銷較大的函式,來模擬達到實驗效果。但是函式裏面不允許使用WAITFOR DELAY,報 Invalid use of a side-effecting operator ‘WAITFOR’ within a function.

CREATE  FUNCTION SLOW_FUNCTION(@p_value INT )
RETURNS INT
AS
BEGIN
    WAITFOR DELAY '00:00:00.002';
    RETURN @p_value+10;
END;

那麼我就變相構造一個這樣的函式,用一個迴圈一直延遲2秒後,函式才返回執行結果。

 
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;

SQL Server的優化器會快取標量子查詢結果集嗎

構造出現重複資料的情況,然後測試對比,測試對比發現,在SQL Server中,優化器根本不會快取子查詢結果集。這種優化函式的技術在SQL Server中根本行不通。優化器根本沒有這樣的優化功能。

TRUNCATE TABLE TEST ;

GO

INSERT INTO TEST

SELECT 1   UNION ALL

SELECT 1   UNION ALL

SELECT 1   UNION ALL

SELECT 2   UNION ALL

SELECT 2   UNION ALL

SELECT 2   UNION ALL

SELECT 3   UNION ALL

SELECT 3 ;

SQL Server的優化器會快取標量子查詢結果集嗎

Write A Comment