Sql server 在SQL中,PIVOT性能非常慢

Sql server 在SQL中,PIVOT性能非常慢,sql-server,tsql,pivot,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

我附上了一个示例。这类似于查询方法。但我在存储过程中使用此查询。查询非常快。但在过程中非常慢。原因是什么

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; 

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

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;  

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

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;  

标记您正在使用的dbms。该代码是特定于产品的。(可能是sql server。)看起来像sql server,但请标记。SP执行缓慢可能是一个参数嗅探问题
JOIN VHierarchyDT
建议使用视图;内部查询的性能是什么样的?另外,如果作为存储过程的一部分调用时运行较慢,则最好查看该过程的估计和实际查询执行计划。最初,您可以尝试更改该过程,并在此查询中添加一个
选项(重新编译)
,并检查执行时间。@TT。随机尝试是没有用的。但是它会很痛。OP没有发布足够的信息。交易呢?存储过程在做什么?谁在调用它?执行计划在哪里?活动监视器显示什么?标记您正在使用的dbms。该代码是特定于产品的。(可能是sql server。)看起来像sql server,但请标记。SP执行缓慢可能是一个参数嗅探问题
JOIN VHierarchyDT
建议使用视图;内部查询的性能是什么样的?另外,如果作为存储过程的一部分调用时运行较慢,则最好查看该过程的估计和实际查询执行计划。最初,您可以尝试更改该过程,并在此查询中添加一个
选项(重新编译)
,并检查执行时间。@TT。随机尝试是没有用的。但是它会很痛。OP没有发布足够的信息。交易呢?存储过程在做什么?谁在调用它?执行计划在哪里?活动监视器显示什么?这应该是评论,而不是回答。有一个原因,人们不能发表评论代表少于50。你必须首先熟悉,明白答案应该是that@PanagiotisKanavos; 我真的很抱歉,因为我无法发表评论,所以我唯一的选择就是作为答案发表评论。我非常清楚评论就是评论,而回答不是评论。我只是想帮你。谢谢你的建议。这应该是评论,而不是回答。有一个原因,人们不能发表评论代表少于50。你必须首先熟悉,明白答案应该是that@PanagiotisKanavos; 我真的很抱歉,因为我无法发表评论,所以我唯一的选择就是作为答案发表评论。我非常清楚评论就是评论,而回答不是评论。只是想帮点忙。谢谢你的建议。