2017-09-26 112 views
4

我有以下表[这里的SQL Fiddle]优化汇总查询的设置

CREATE TABLE TmpB 
    ([EpiSer] int, [SINum] int, [VolNum] int, [CTPQty] int, [VolAmt] int, [CTPActivityGroupCode] varchar(6)) 
; 

INSERT INTO TmpB 
    ([EpiSer], [SINum], [VolNum], [CTPQty], [VolAmt], [CTPActivityGroupCode]) 
VALUES 
    (104009, 21, 1, 1, 1, 'SUP001'), 
    (42698, 21, 1, 1, 1, 'SUP001'), 
    (82878, 21, 1, 1, 1, 'SUP001'), 
    (94081, 21, 1, 1, 1, 'SUP001'), 
    (80234, 21, 1, 1, 1, 'SUP001'), 
    (81856, 21, 1, 1, 1, 'SUP001'), 
    (19752, 21, 1, 1, 1, 'SUP001'), 
    (17830, 21, 1, 1, 1, 'SUP001'), 
    (73218, 21, 1, 1, 1, 'SUP001'), 
    (32713, 21, 1, 1, 1, 'SUP001'), 
    (90162, 21, 1, 1, 1, 'SUP001'), 
    (59414, 21, 1, 1, 1, 'SUP001'), 
    (63765, 21, 1, 1, 1, 'SUP001'), 
    (26554, 21, 1, 1, 1, 'SUP001'), 
    (72489, 21, 1, 1, 1, 'SUP001'), 
    (94324, 21, 1, 1, 1, 'SUP001'), 
    (34453, 21, 1, 1, 1, 'SUP001'), 
    (101487, 21, 1, 1, 1, 'SUP001'), 
    (21117, 21, 1, 1, 1, 'SUP001'), 
    (4169, 21, 1, 1, 1, 'SUP001'), 
    (27258, 21, 1, 1, 1, 'SUP001'), 
    (85282, 21, 1, 1, 1, 'SUP001'), 
    (98243, 21, 1, 1, 1, 'SUP001'), 
    (98436, 21, 1, 1, 1, 'SUP001'), 
    (15969, 21, 1, 1, 1, 'SUP001'), 
    (70324, 21, 1, 1, 1, 'SUP001'), 
    (9828, 21, 1, 1, 1, 'SUP001'), 
    (61929, 21, 1, 1, 1, 'SUP001'), 
    (3508, 21, 1, 1, 1, 'SUP001'), 
    (65344, 21, 1, 1, 1, 'SUP001'), 
    (19377, 21, 1, 1, 1, 'SUP001'), 
    (104502, 21, 1, 1, 1, 'SUP001'), 
    (57413, 21, 1, 1, 1, 'SUP001'), 
    (66841, 21, 1, 1, 1, 'SUP001'), 
    (39590, 21, 1, 1, 1, 'SUP001'), 
    (50640, 21, 1, 1, 1, 'SUP001'), 
    (66934, 21, 1, 1, 1, 'SUP001'), 
    (36675, 21, 1, 1, 1, 'SUP001'), 
    (65101, 21, 1, 1, 1, 'SUP001'), 
    (84464, 21, 1, 1, 1, 'SUP001'), 
    (74118, 21, 1, 1, 1, 'SUP001'), 
    (40101, 21, 1, 1, 1, 'SUP001'), 
    (18816, 21, 1, 1, 1, 'SUP001'), 
    (61936, 21, 1, 1, 1, 'SUP001'), 
    (23153, 21, 1, 1, 1, 'SUP001'), 
    (50947, 21, 1, 1, 1, 'SUP001'), 
    (39776, 21, 1, 1, 1, 'SUP001'), 
    (31377, 21, 1, 1, 1, 'SUP001'), 
    (106624, 21, 1, 1, 1, 'SUP001'), 
    (41255, 21, 2, 1, 1, 'SUP001'), 
    (82878, 21, 2, 1, 1, 'SUP001'), 
    (94081, 21, 2, 1, 1, 'SUP001'), 
    (80234, 21, 2, 1, 1, 'SUP001'), 
    (81856, 21, 2, 1, 1, 'SUP001'), 
    (19752, 21, 2, 1, 1, 'SUP001'), 
    (17830, 21, 2, 1, 1, 'SUP001'), 
    (73218, 21, 2, 1, 1, 'SUP001'), 
    (32713, 21, 2, 1, 1, 'SUP001'), 
    (90162, 21, 2, 1, 1, 'SUP001'), 
    (59414, 21, 2, 1, 1, 'SUP001'), 
    (63765, 21, 2, 1, 1, 'SUP001'), 
    (26554, 21, 2, 1, 1, 'SUP001'), 
    (72489, 21, 2, 1, 1, 'SUP001'), 
    (94324, 21, 2, 1, 1, 'SUP001'), 
    (34453, 21, 2, 1, 1, 'SUP001') 
; 


CREATE TABLE TmpA 
    ([VolNum] int, [CostItem] varchar(15), [OCostUnit] numeric, [FCostUnit] numeric, [ResCstID] varchar(6)) 
; 

INSERT INTO TmpA 
    ([VolNum], [CostItem], [OCostUnit], [FCostUnit], [ResCstID]) 
VALUES 
    (1, 'AgencyOtherOH_V', 0.000155982435905091, 0.000155982435905091, 'CSC004'), 
    (1, 'CNST_F', 0.0166158829887076, 0.0166158829887076, 'CSC001'), 
    (1, 'Depreciation_F', 0.00044046833444276, 0.00338301131105729, 'CSC004'), 
    (1, 'GSOH_F', 0.002285123323198, 0.002285123323198, 'CSC004'), 
    (1, 'GSOH_S', 0.00291555947552205, 0.00291555947552205, 'CSC004'), 
    (1, 'GSOH_V', -7.85518770596873E-05, -7.85518770596873E-05, 'CSC004'), 
    (1, 'GSPayrollOH_S', 1.95806910092635E-05, 1.95806910092635E-05, 'CSC004'), 
    (1, 'INC001ET005', 0.000124265914489854, 0.000124265914489854, 'REC001'), 
    (1, 'PDC_F', 0.000897633427026484, 0.000897633427026484, 'CSC004'), 
    (1, 'R&D_F', 0, 0.0911004017527717, 'REC002'), 
    (1, 'R&D_S', 0, 0.184788054915322, 'REC002'), 
    (1, 'R&D_V', 0, -1.04534066995235, 'REC002'), 
    (1, 'R&DSW_S', 0, 1.7173336734415, 'REC002'), 
    (1, 'R&DSW_V', 0, 0.159935865317166, 'REC002'), 
    (1, 'SWOtherOH_F', 0.000101979332044079, 0.000101979332044079, 'CSC004'), 
    (1, 'SWOtherOH_S', 0.00997174733301197, 0.00997174733301197, 'CSC004'), 
    (1, 'SWOtherOH_V', 0.000224400291272709, 0.000224400291272709, 'CSC004'), 
    (2, 'AgencyOtherOH_V', 0.000155982435905091, 0.000155982435905091, 'CSC004'), 
    (2, 'CNST_F', 0.0166158829887076, 0.0166158829887076, 'CSC001'), 
    (2, 'Depreciation_F', 0.00044046833444276, 0.00338301131105729, 'CSC004'), 
    (2, 'GSOH_F', 0.002285123323198, 0.002285123323198, 'CSC004'), 
    (2, 'GSOH_S', 0.00291555947552205, 0.00291555947552205, 'CSC004'), 
    (2, 'GSOH_V', -7.85518770596873E-05, -7.85518770596873E-05, 'CSC004'), 
    (2, 'GSPayrollOH_S', 1.95806910092635E-05, 1.95806910092635E-05, 'CSC004'), 
    (2, 'INC001ET005', 0.000124265914489854, 0.000124265914489854, 'REC001'), 
    (2, 'PDC_F', 0.000897633427026484, 0.000897633427026484, 'CSC004'), 
    (2, 'R&D_F', 0, 0.0911004017527717, 'REC002'), 
    (2, 'R&D_S', 0, 0.184788054915322, 'REC002'), 
    (2, 'R&D_V', 0, -1.04534066995235, 'REC002'), 
    (2, 'R&DSW_S', 0, 1.7173336734415, 'REC002'), 
    (2, 'R&DSW_V', 0, 0.159935865317166, 'REC002'), 
    (2, 'SWOtherOH_F', 0.000101979332044079, 0.000101979332044079, 'CSC004'), 
    (2, 'SWOtherOH_S', 0.00997174733301197, 0.00997174733301197, 'CSC004'), 
    (2, 'SWOtherOH_V', 0.000224400291272709, 0.000224400291272709, 'CSC004') 
; 

我需要聚合使用TMPA在TmpB记录成本。要做到这一点,我使用下面的查询[已工作了“正常”大小的表精]

SELECT [s1].[EpiSer] as ActivityRecordID, 
     [s1].[CTPActivityGroupCode] as ActCstID, 
     [t].[ResCstID], 
     [s1].[VolAmt], 
     [s1].[CTPQty] AS ActCnt, 
     SUM([s1].[VolAmt] * [t].[OCostUnit]) AS TotOCst, 
     SUM([s1].[VolAmt] * [t].[FCostUnit]) AS TotFCst 
FROM [TmpB] AS s1 
    INNER JOIN 
     TmpA AS t ON [s1].[VolNum] = [t].[VolNum] 
GROUP BY [s1].[EpiSer], 
     [s1].[CTPActivityGroupCode], 
     [t].[ResCstID], 
     [s1].[VolAmt], 
     [s1].[CTPQty]; 

现在的问题是,我们目前的情况下,表TmpB是一个巨大的26M记录和TMPA 140000 。这对我们来说是不寻常的,但我们无能为力。上面的查询,由于聚集和使用的加入对非唯一列,被从而导致tempdb臃肿的地步查询与[进入从应用程序日志文件]停止:

2017-09-26 06:11:07.027 ERROR:: r.d(): The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) ...

我们如何能修改/优化查询,以避免这个问题 - 我试图索引,但是这是所有我能做什么?

CREATE NONCLUSTERED INDEX [IX_TmpB] 
ON [TmpB] ([EpiSer], [VolNum]); 

CREATE NONCLUSTERED INDEX [IX_TmpA] 
ON [TmpA] ([VolNum]); 

尝试解决#1:

我使用索引

CREATE NONCLUSTERED INDEX [IX_ServDataCtp_Stage1] 
ON [ServDataCtp_Stage1] ([VolNum]) 
INCLUDE ([EpiSer], [CTPQty], [VolAmt], [CTPActivityGroupCode]); 
GO 

我需要承担在执行一个完整的尝试,看看这个补救措施有线索问题。

试图解决#2:

我已经然后尝试使用索引视图

SET NUMERIC_ROUNDABORT OFF; 
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, 
    ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON; 
GO 

CREATE VIEW vB 
WITH SCHEMABINDING 
AS 
    SELECT [ServDataCtp_Stage1].[EpiSer] as ActivityRecordID, 
      [ServDataCtp_Stage1].[CTPActivityGroupCode] as ActCstID, 
      [TmpA].[ResCstID], 
      [ServDataCtp_Stage1].[VolAmt], 
      [ServDataCtp_Stage1].[CTPQty] AS ActCnt, 
      SUM([ServDataCtp_Stage1].[VolAmt] * [TmpA].[OCostUnit]) AS TotOCst, 
      SUM([ServDataCtp_Stage1].[VolAmt] * [TmpA].[FCostUnit]) AS TotFCst, 
      COUNT_BIG(*) AS _COUNT 
    FROM [ServDataCtp_Stage1] INNER JOIN 
      [TmpA] ON [ServDataCtp_Stage1].[VolNum] = [TmpA].[VolNum] 
    GROUP BY [ServDataCtp_Stage1].[EpiSer], 
      [ServDataCtp_Stage1].[CTPActivityGroupCode], 
      [TmpA].[ResCstID], 
      [ServDataCtp_Stage1].[VolAmt], 
      [ServDataCtp_Stage1].[CTPQty]; 
GO 

但第二个查询提供以下错误的艾伦的建议:

Msg 4512, Level 16, State 3, Procedure vB, Line 4 [Batch Start Line 360] Cannot schema bind view 'vB' because name 'ServDataCtp_Stage1' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.

你能帮助解决这个问题吗?

+1

尝试这些指标。我不知道这是否会避免tempdb完全问题,但它应该会提高性能。 'CREATE CLUSTERED INDEX cdx ON [TmpA](VolNum,ResCstID); CREATE CLUSTERED INDEX CDX ON [TmpB](VolNum,[EpiSer],[CTPActivityGroupCode],[VolAmt],[CTPQty]); ' –

+0

你能发布预计的执行计划吗?使用[粘贴该计划@ brentozar.com(https://www.brentozar.com/pastetheplan/)这里的指令分享您的执行计划:如何使用计划粘贴(HTTPS://www.brentozar。 COM/pastetheplan /说明书/)。 – SqlZim

+0

您的加入正在创建笛卡尔产品,它是否正确? –

回答

2

这ResCstId是使事情更复杂一点。 GROUP BY导致排序。将来自多个表格的柱子分组使其更难从任何指标中受益。我敢打赌,你的执行计划中有一个或多个非常重要。

如果你不需要这个resCstId,你可以在EpiSer,CTPActivityGroupCode,VolAmt,CTPQty上引发一个非聚集索引,这会大大加快速度。

如果需要ResCstId,那么你可以把你的查询到索引视图;他们是为这种事情而设计的。你需要包含一个count_big列(它是一个奇怪的SQL Server索引视图)。请参阅此链接了解详情:https://docs.microsoft.com/en-us/sql/relational-databases/views/create-indexed-views

----- ----- UPDATE

创建索引视图比我拳头想麻烦一点,但我做到了。 侧面说明:这是为什么张贴DDL和样本数据是如此的帮助。

首先让我们看一下我们正在努力解决这个问题。使用DDL提供,查询创建此执行计划: enter image description here 那种是罪魁祸首。如果你将鼠标悬停在它你会得到更深入的了解: enter image description here

与创建索引视图的问题是,我们需要一套独特的,你没有列(根据您发布的DDL)。为了解决这个问题,我为每个表添加了一个代理键列,并在每个表中将其命名为“someId”。这可能是一个交易断路器,但至少我在这里展示的是这种解决方案如何工作。

下面是更新DDL:

if object_id('dbo.tmpA') is not null drop table tmpA; 
if object_id('dbo.tmpB') is not null drop table tmpB; 

CREATE TABLE TmpB 
    (someid int identity, [EpiSer] int, [SINum] int, [VolNum] int, [CTPQty] int, [VolAmt] int, [CTPActivityGroupCode] varchar(6)) 
; 
INSERT INTO TmpB 
    ([EpiSer], [SINum], [VolNum], [CTPQty], [VolAmt], [CTPActivityGroupCode]) 
VALUES 
    (104009, 21, 1, 1, 1, 'SUP001'), 
    (42698, 21, 1, 1, 1, 'SUP001'), 
    (82878, 21, 1, 1, 1, 'SUP001'), 
    (94081, 21, 1, 1, 1, 'SUP001'), 
    (80234, 21, 1, 1, 1, 'SUP001'), 
    (81856, 21, 1, 1, 1, 'SUP001'), 
    (19752, 21, 1, 1, 1, 'SUP001'), 
    (17830, 21, 1, 1, 1, 'SUP001'), 
    (73218, 21, 1, 1, 1, 'SUP001'), 
    (32713, 21, 1, 1, 1, 'SUP001'), 
    (90162, 21, 1, 1, 1, 'SUP001'), 
    (59414, 21, 1, 1, 1, 'SUP001'), 
    (63765, 21, 1, 1, 1, 'SUP001'), 
    (26554, 21, 1, 1, 1, 'SUP001'), 
    (72489, 21, 1, 1, 1, 'SUP001'), 
    (94324, 21, 1, 1, 1, 'SUP001'), 
    (34453, 21, 1, 1, 1, 'SUP001'), 
    (101487, 21, 1, 1, 1, 'SUP001'), 
    (21117, 21, 1, 1, 1, 'SUP001'), 
    (4169, 21, 1, 1, 1, 'SUP001'), 
    (27258, 21, 1, 1, 1, 'SUP001'), 
    (85282, 21, 1, 1, 1, 'SUP001'), 
    (98243, 21, 1, 1, 1, 'SUP001'), 
    (98436, 21, 1, 1, 1, 'SUP001'), 
    (15969, 21, 1, 1, 1, 'SUP001'), 
    (70324, 21, 1, 1, 1, 'SUP001'), 
    (9828, 21, 1, 1, 1, 'SUP001'), 
    (61929, 21, 1, 1, 1, 'SUP001'), 
    (3508, 21, 1, 1, 1, 'SUP001'), 
    (65344, 21, 1, 1, 1, 'SUP001'), 
    (19377, 21, 1, 1, 1, 'SUP001'), 
    (104502, 21, 1, 1, 1, 'SUP001'), 
    (57413, 21, 1, 1, 1, 'SUP001'), 
    (66841, 21, 1, 1, 1, 'SUP001'), 
    (39590, 21, 1, 1, 1, 'SUP001'), 
    (50640, 21, 1, 1, 1, 'SUP001'), 
    (66934, 21, 1, 1, 1, 'SUP001'), 
    (36675, 21, 1, 1, 1, 'SUP001'), 
    (65101, 21, 1, 1, 1, 'SUP001'), 
    (84464, 21, 1, 1, 1, 'SUP001'), 
    (74118, 21, 1, 1, 1, 'SUP001'), 
    (40101, 21, 1, 1, 1, 'SUP001'), 
    (18816, 21, 1, 1, 1, 'SUP001'), 
    (61936, 21, 1, 1, 1, 'SUP001'), 
    (23153, 21, 1, 1, 1, 'SUP001'), 
    (50947, 21, 1, 1, 1, 'SUP001'), 
    (39776, 21, 1, 1, 1, 'SUP001'), 
    (31377, 21, 1, 1, 1, 'SUP001'), 
    (106624, 21, 1, 1, 1, 'SUP001'), 
    (41255, 21, 2, 1, 1, 'SUP001'), 
    (82878, 21, 2, 1, 1, 'SUP001'), 
    (94081, 21, 2, 1, 1, 'SUP001'), 
    (80234, 21, 2, 1, 1, 'SUP001'), 
    (81856, 21, 2, 1, 1, 'SUP001'), 
    (19752, 21, 2, 1, 1, 'SUP001'), 
    (17830, 21, 2, 1, 1, 'SUP001'), 
    (73218, 21, 2, 1, 1, 'SUP001'), 
    (32713, 21, 2, 1, 1, 'SUP001'), 
    (90162, 21, 2, 1, 1, 'SUP001'), 
    (59414, 21, 2, 1, 1, 'SUP001'), 
    (63765, 21, 2, 1, 1, 'SUP001'), 
    (26554, 21, 2, 1, 1, 'SUP001'), 
    (72489, 21, 2, 1, 1, 'SUP001'), 
    (94324, 21, 2, 1, 1, 'SUP001'), 
    (34453, 21, 2, 1, 1, 'SUP001') 
; 
CREATE TABLE TmpA 
    (someid int identity, [VolNum] int, [CostItem] varchar(15), [OCostUnit] numeric, [FCostUnit] numeric, [ResCstID] varchar(6)) 
; 
INSERT INTO TmpA 
    ([VolNum], [CostItem], [OCostUnit], [FCostUnit], [ResCstID]) 
VALUES 
    (1, 'AgencyOtherOH_V', 0.000155982435905091, 0.000155982435905091, 'CSC004'), 
    (1, 'CNST_F', 0.0166158829887076, 0.0166158829887076, 'CSC001'), 
    (1, 'Depreciation_F', 0.00044046833444276, 0.00338301131105729, 'CSC004'), 
    (1, 'GSOH_F', 0.002285123323198, 0.002285123323198, 'CSC004'), 
    (1, 'GSOH_S', 0.00291555947552205, 0.00291555947552205, 'CSC004'), 
    (1, 'GSOH_V', -7.85518770596873E-05, -7.85518770596873E-05, 'CSC004'), 
    (1, 'GSPayrollOH_S', 1.95806910092635E-05, 1.95806910092635E-05, 'CSC004'), 
    (1, 'INC001ET005', 0.000124265914489854, 0.000124265914489854, 'REC001'), 
    (1, 'PDC_F', 0.000897633427026484, 0.000897633427026484, 'CSC004'), 
    (1, 'R&D_F', 0, 0.0911004017527717, 'REC002'), 
    (1, 'R&D_S', 0, 0.184788054915322, 'REC002'), 
    (1, 'R&D_V', 0, -1.04534066995235, 'REC002'), 
    (1, 'R&DSW_S', 0, 1.7173336734415, 'REC002'), 
    (1, 'R&DSW_V', 0, 0.159935865317166, 'REC002'), 
    (1, 'SWOtherOH_F', 0.000101979332044079, 0.000101979332044079, 'CSC004'), 
    (1, 'SWOtherOH_S', 0.00997174733301197, 0.00997174733301197, 'CSC004'), 
    (1, 'SWOtherOH_V', 0.000224400291272709, 0.000224400291272709, 'CSC004'), 
    (2, 'AgencyOtherOH_V', 0.000155982435905091, 0.000155982435905091, 'CSC004'), 
    (2, 'CNST_F', 0.0166158829887076, 0.0166158829887076, 'CSC001'), 
    (2, 'Depreciation_F', 0.00044046833444276, 0.00338301131105729, 'CSC004'), 
    (2, 'GSOH_F', 0.002285123323198, 0.002285123323198, 'CSC004'), 
    (2, 'GSOH_S', 0.00291555947552205, 0.00291555947552205, 'CSC004'), 
    (2, 'GSOH_V', -7.85518770596873E-05, -7.85518770596873E-05, 'CSC004'), 
    (2, 'GSPayrollOH_S', 1.95806910092635E-05, 1.95806910092635E-05, 'CSC004'), 
    (2, 'INC001ET005', 0.000124265914489854, 0.000124265914489854, 'REC001'), 
    (2, 'PDC_F', 0.000897633427026484, 0.000897633427026484, 'CSC004'), 
    (2, 'R&D_F', 0, 0.0911004017527717, 'REC002'), 
    (2, 'R&D_S', 0, 0.184788054915322, 'REC002'), 
    (2, 'R&D_V', 0, -1.04534066995235, 'REC002'), 
    (2, 'R&DSW_S', 0, 1.7173336734415, 'REC002'), 
    (2, 'R&DSW_V', 0, 0.159935865317166, 'REC002'), 
    (2, 'SWOtherOH_F', 0.000101979332044079, 0.000101979332044079, 'CSC004'), 
    (2, 'SWOtherOH_S', 0.00997174733301197, 0.00997174733301197, 'CSC004'), 
    (2, 'SWOtherOH_V', 0.000224400291272709, 0.000224400291272709, 'CSC004') 
; 
GO 

下一页视图和索引:

CREATE VIEW dbo.vwTmpAB 
WITH SCHEMABINDING AS 
SELECT id1 = s1.someid, 
     id2 = t.someid, 
     s1.[EpiSer] as ActivityRecordID, 
     s1.[CTPActivityGroupCode] as ActCstID, 
     t.[ResCstID], 
     s1.[VolAmt], 
     s1.[CTPQty] AS ActCnt, 
     t.OCostUnit, 
     t.FCostUnit 
FROM dbo.TmpB AS s1 
INNER JOIN dbo.TmpA AS t ON [s1].[VolNum] = [t].[VolNum]; 
GO 
CREATE UNIQUE CLUSTERED INDEX uq_cl_vwTempAB 
    ON dbo.vwTmpAB(ActivityRecordID, ActCstID, ResCstID, VolAmt, ActCnt, id1, id2); 
GO 

现在我们做对视图聚集,如下图所示。这里真正神奇的是,当我运行原来的查询,优化是足够聪明的使用索引视图上,即使它不会被引用:

SELECT 
    ActivityRecordID, 
    ActCstID, 
    ResCstID, 
    VolAmt, 
    ActCnt, 
    SUM(VolAmt * OCostUnit) AS TotOCst, 
    SUM(VolAmt * FCostUnit) AS TotFCst 
FROM dbo.vwTmpAB 
GROUP BY ActivityRecordID, ActCstID, ResCstID, VolAmt, ActCnt; 

SELECT [s1].[EpiSer] as ActivityRecordID, 
     [s1].[CTPActivityGroupCode] as ActCstID, 
     [t].[ResCstID], 
     [s1].[VolAmt], 
     [s1].[CTPQty] AS ActCnt, 
     SUM([s1].[VolAmt] * [t].[OCostUnit]) AS TotOCst, 
     SUM([s1].[VolAmt] * [t].[FCostUnit]) AS TotFCst 
FROM [TmpB] AS s1 
    INNER JOIN 
     TmpA AS t ON [s1].[VolNum] = [t].[VolNum] 
GROUP BY [s1].[EpiSer], 
     [s1].[CTPActivityGroupCode], 
     [t].[ResCstID], 
     [s1].[VolAmt], 
     [s1].[CTPQty]; 

两个查询返回相同的结果,并用这样做更好的查询计划。 Sort不见了。我包含了你的原始查询,以演示在某些情况下,你甚至不需要引用视图来利用索引。

enter image description here

让我知道,如果这有助于。

+0

艾伦你好,如果你有这些类型的查询体验,你愿意帮我写一个上面 - 我明明奖励你的麻烦一个体面的奖金? – MoonKnight

+0

@MoonKnight - 我更新了我的答案。看看,让我知道这是否有帮助。 –

+1

你绝对的传奇。我刚刚开始添加一个索引表,因为意识到这是需要的 - 但我遇到了创建INDEXED VIEW的问题,所以非常感谢这个......添加标识列绝对不是一个交易断路器 - 这是一个我已经在这个网站上复活了最好的答案。非常感谢您花时间回答,这真的帮了我很大的忙。 – MoonKnight