질문 :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 초입니다. 이유가 무엇인가요?
실행 계획을 비교하면 무엇을 알 수 있습니까? –
EAV 시스템입니까? 또한 기능이있는 뷰의 뷰는 나와 함께 냄새 테스트를 통과하지 못합니다. 조회 또는 기능이없는 한 번만 쿼리를 잘라내거나 붙여 넣을 수 있으며 실행 속도를 확인하여 실행할 수 있습니다. –