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; 我真的很抱歉,因为我无法发表评论,所以我唯一的选择就是作为答案发表评论。我非常清楚评论就是评论,而回答不是评论。只是想帮点忙。谢谢你的建议。