PIVOT Perfomance在SQL中非常慢

时间:2017-10-05 07:34:50

标签: sql-server tsql pivot

我附上了一个样本。这就像查询方法。但是我在存储过程中使用这个查询。查询非常快。但是程序很慢。原因是什么。

DECLARE @lsId VARCHAR(20);
DECLARE @lsDate VARCHAR(20);
SET @lsId = '802306';
SET @lsDate = '2017-10-02';
SELECT fld_region [REGION],
       ISNULL([CINEMA], 0) [CINEMA],
       ISNULL([ECONOMY], 0) [ECONOMY],
       ISNULL([HD PRIME], 0) [HD PRIME],
       ISNULL([HD SUPREME], 0) [HD SUPREME],
       ISNULL([HD ULTRA], 0) [HD ULTRA],
       ISNULL([INDI], 0) [INDI],
       ISNULL([KUSHI], 0) [KUSHI],
       ISNULL([MEGA], 0) [MEGA],
       ISNULL([ROI VALUE], 0) [ROI VALUE],
       ISNULL([ROI VALUE PLUS], 0) [ROI VALUE PLUS],
       ISNULL([SOUTH VALUE], 0) [SOUTH VALUE],
       ISNULL([SUPER VALUE], 0) [SUPER VALUE],
       ISNULL([WORLD], 0) [WORLD]
FROM
(
    SELECT b.fld_region,
           a.fld_pack_name,
           a.fld_count
    FROM TBL_ACTIVE_CUSTOMER_DT_PLAN_WISE a
         JOIN VHierarchyDT b ON b.FLD_DTCODE = a.FLD_DTCODE
                                AND b.SH_ID = @lsId
                                AND a.fld_act_date = @lsDate
) x PIVOT(SUM(fld_count) FOR fld_pack_name IN([CINEMA],
                                              [ECONOMY],
                                              [HD PRIME],
                                              [HD SUPREME],
                                              [HD ULTRA],
                                              [INDI],
                                              [KUSHI],
                                              [MEGA],
                                              [ROI VALUE],
                                              [ROI VALUE PLUS],
                                              [SOUTH VALUE],
                                              [SUPER VALUE],
                                              [WORLD])) p; 

1 个答案:

答案 0 :(得分:0)

也许尝试设置变量数据类型

DECLARE @lsId INT; --If this is the correct data type
DECLARE @lsDate DATE; --If this is the correct data type

SET @lsId = 802306;
SET @lsDate = '2017-10-02';

SELECT fld_region [REGION],
       ISNULL([CINEMA], 0) [CINEMA],
       ISNULL([ECONOMY], 0) [ECONOMY],
       ISNULL([HD PRIME], 0) [HD PRIME],
       ISNULL([HD SUPREME], 0) [HD SUPREME],
       ISNULL([HD ULTRA], 0) [HD ULTRA],
       ISNULL([INDI], 0) [INDI],
       ISNULL([KUSHI], 0) [KUSHI],
       ISNULL([MEGA], 0) [MEGA],
       ISNULL([ROI VALUE], 0) [ROI VALUE],
       ISNULL([ROI VALUE PLUS], 0) [ROI VALUE PLUS],
       ISNULL([SOUTH VALUE], 0) [SOUTH VALUE],
       ISNULL([SUPER VALUE], 0) [SUPER VALUE],
       ISNULL([WORLD], 0) [WORLD]
FROM
(
    SELECT b.fld_region,
           a.fld_pack_name,
           a.fld_count
    FROM TBL_ACTIVE_CUSTOMER_DT_PLAN_WISE a
         JOIN VHierarchyDT b ON b.FLD_DTCODE = a.FLD_DTCODE
                                AND b.SH_ID = @lsId
                                AND a.fld_act_date = @lsDate
) x PIVOT(SUM(fld_count) FOR fld_pack_name IN([CINEMA],
                                              [ECONOMY],
                                              [HD PRIME],
                                              [HD SUPREME],
                                              [HD ULTRA],
                                              [INDI],
                                              [KUSHI],
                                              [MEGA],
                                              [ROI VALUE],
                                              [ROI VALUE PLUS],
                                              [SOUTH VALUE],
                                              [SUPER VALUE],
                                              [WORLD])) p;  

或者将初始数据拉入临时表

 DECLARE @lsId INT; --If this is the correct data type
 DECLARE @lsDate DATE; --If this is the correct data type

    SET @lsId = 802306;
    SET @lsDate = '2017-10-02';


    IF OBJECT_ID('tempdb..##PivotData') IS NOT NULL 
            DROP TABLE ##PivotData

    SELECT b.fld_region,
           a.fld_pack_name,
           a.fld_count
    INTO ##PivotData --I would normally create and not select into.
    FROM TBL_ACTIVE_CUSTOMER_DT_PLAN_WISE a
    JOIN VHierarchyDT b ON b.FLD_DTCODE = a.FLD_DTCODE
                        AND b.SH_ID = @lsId
                        AND a.fld_act_date = @lsDate

    SELECT fld_region [REGION],
           ISNULL([CINEMA], 0) [CINEMA],
           ISNULL([ECONOMY], 0) [ECONOMY],
           ISNULL([HD PRIME], 0) [HD PRIME],
           ISNULL([HD SUPREME], 0) [HD SUPREME],
           ISNULL([HD ULTRA], 0) [HD ULTRA],
           ISNULL([INDI], 0) [INDI],
           ISNULL([KUSHI], 0) [KUSHI],
           ISNULL([MEGA], 0) [MEGA],
           ISNULL([ROI VALUE], 0) [ROI VALUE],
           ISNULL([ROI VALUE PLUS], 0) [ROI VALUE PLUS],
           ISNULL([SOUTH VALUE], 0) [SOUTH VALUE],
           ISNULL([SUPER VALUE], 0) [SUPER VALUE],
           ISNULL([WORLD], 0) [WORLD]
    FROM ##PivotData x 
    PIVOT(SUM(fld_count) FOR fld_pack_name IN([CINEMA],
                                              [ECONOMY],
                                              [HD PRIME],
                                              [HD SUPREME],
                                              [HD ULTRA],
                                              [INDI],
                                              [KUSHI],
                                              [MEGA],
                                              [ROI VALUE],
                                              [ROI VALUE PLUS],
                                              [SOUTH VALUE],
                                              [SUPER VALUE],
                                              [WORLD])) p;