0

질문 :TVF를 호출하는 저장 프로 시저가 TVF를 인라인하는 프로 시저보다 속도가 느릴 수 있습니까?

나는 두 가지보기가 있습니다

V_Room, 14969 rows, 9 tables joined together 
V_parkings, 3265 rows, 9 tables joined together 

은 그 때 나는 V_Room과 V_parkings

사이의 결합이

그럼 난 테이블이 평가 한 것입니다 볼 수

V_Rooms_UsageTypes with 18234 rows 

이 이런 식으로 기능 기능

개 테이블 을 조인하고 볼 V_Rooms_UsageTypes에 다음과 같은 77 개 부속 선택한다 (210)
CREATE FUNCTION [dbo].[tfu_RPT_UsageTypesBySIADetail] 
(@in_reporting_date datetime) 
-- Add the parameters for the function here 
RETURNS TABLE 

다음
(
     SELECT 
      ISNULL(SUM(ZO_RMArea_Area), 0.0) 
     FROM dbo.V_Rooms_UsageTypes 
     WHERE V_Rooms_UsageTypes.FL_UID = T_Floor.FL_UID 

     AND (V_Rooms_UsageTypes.DIN277_Major = 9) 
     AND (V_Rooms_UsageTypes.DIN277_Minor = 4) 

     AND (V_Rooms_UsageTypes.ZO_RMUT_DateFrom <= @in_reporting_date) 
     AND (V_Rooms_UsageTypes.ZO_RMUT_DatumTo >= @in_reporting_date) 

     AND (V_Rooms_UsageTypes.ZO_RMArea_DateFrom <= @in_reporting_date) 
     AND (V_Rooms_UsageTypes.ZO_RMArea_DatumTo >= @in_reporting_date) 

     AND (V_Rooms_UsageTypes.RM_DateFrom <= @in_reporting_date) 
     AND (V_Rooms_UsageTypes.RM_DatumTo >= @in_reporting_date) 

     AND (V_Rooms_UsageTypes.SO_DateFrom <= @in_reporting_date) 
     AND (V_Rooms_UsageTypes.SO_DatumTo >= @in_reporting_date) 

     AND (V_Rooms_UsageTypes.BG_DateFrom <= @in_reporting_date) 
     AND (V_Rooms_UsageTypes.BG_DatumTo >= @in_reporting_date) 

     AND (V_Rooms_UsageTypes.FL_DateFrom <= @in_reporting_date) 
     AND (V_Rooms_UsageTypes.FL_DatumTo >= @in_reporting_date) 
    ) AS RPT_VF_9_4 

I이 (동적 SQL을 사용하여 테이블 반환 함수 를 호출하는 저장 프로 시저 때문에 여러 언어에 대한 열 앨리어싱

CREATE PROCEDURE [dbo].[sp_RPT_DATA_AreaByDIN277_old] 
    @in_customer varchar(3), 
    @in_language varchar(2), 
    @in_site varchar(36), 
    @in_building varchar(36), 
    @in_floor varchar(36), 
    @in_reporting_date varchar(50) 
AS 
    DECLARE 
    @sql varchar(8000), 
    @reporting_date datetime 

    -- Abrunden des Eingabedatums auf 00:00:00 Uhr 
    SET @reporting_date= CONVERT(DATETIME, @in_reporting_date) 
    SET @reporting_date= Cast(Floor(Cast(@reporting_date As Float)) As DateTime) 
    SET @in_reporting_date= CONVERT(varchar(50), @reporting_date) 

    SET NOCOUNT ON; 



    SET @sql='SELECT 

    FIELD_1_' + @in_language +' AS RPT_FIELD_1 
    ,FIELD_2_' + @in_language +' AS RPT_FIELD_2 
    ,FIELD_3 AS RPT_FIELD_3 
    ,table_valued_function_column1 AS RPT_table_valued_function_column1 
    ,table_valued_function_column2 AS RPT_table_valued_function_column2 
    ,table_valued_function_columnN AS RPT_table_valued_function_columnN 

    ' 



    SET @[email protected] + 'FROM dbo.tfu_RPT_FM_NutzungsartenNachSIADetail(''' + @in_reporting_date + ''') ' 

    SET @[email protected] + 'WHERE ST_Customer = ''' + @in_customer + ''' ' 


    IF @in_site  <> '00000000-0000-0000-0000-000000000000' SET @[email protected] + 'AND (ST_UID = ''' + @in_site + ''') ' 
    IF @in_building <> '00000000-0000-0000-0000-000000000000' SET @[email protected] + 'AND (BG_UID = ''' + @in_building + ''') ' 
    IF @in_floor <> '00000000-0000-0000-0000-000000000000' SET @[email protected] + 'AND (FL_UID = ''' + @in_floor + ''') ' 

    EXECUTE (@sql) 
: 하나의 일관된 열 이름을 필요로 서비스, )이 같은

보고

예상대로 결과를 반환하는 쿼리에 다소 시간이 오래 걸렸습니다 (20 초). 그래서 전체 테이블 값 함수를 동적 SQL 저장 프로 시저 으로 옮기고 대략 반 (10 초)의 실행 속도를 제외했습니다.

대신 실행 시간이 30 초입니다. 이유가 무엇인가요?

+7

실행 계획을 비교하면 무엇을 알 수 있습니까? –

+0

EAV 시스템입니까? 또한 기능이있는 뷰의 뷰는 나와 함께 냄새 테스트를 통과하지 못합니다. 조회 또는 기능이없는 한 번만 쿼리를 잘라내거나 붙여 넣을 수 있으며 실행 속도를 확인하여 실행할 수 있습니다. –

답변

2

엔진이 훨씬 더 큰 쿼리의 일부일 때보 다 TVF를 개별적으로 최적화하는 것이 더 효과적 일 수 있습니다. 또한 동적 SQL은 계획이 캐시되는 방식을 변경할 수 있습니다. 사용중인 SQL Server 버전을 언급하는 것을 잊었지만 "optimize for ad hoc workloads"설정 또는 OPTIMIZE FOR UNKNOWN ??으로 재생 했습니까?

+0

SQL Server 2008 R1 –

관련 문제