我有以下表[这里的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.
你能帮助解决这个问题吗?
尝试这些指标。我不知道这是否会避免tempdb完全问题,但它应该会提高性能。 'CREATE CLUSTERED INDEX cdx ON [TmpA](VolNum,ResCstID); CREATE CLUSTERED INDEX CDX ON [TmpB](VolNum,[EpiSer],[CTPActivityGroupCode],[VolAmt],[CTPQty]); ' –
你能发布预计的执行计划吗?使用[粘贴该计划@ brentozar.com(https://www.brentozar.com/pastetheplan/)这里的指令分享您的执行计划:如何使用计划粘贴(HTTPS://www.brentozar。 COM/pastetheplan /说明书/)。 – SqlZim
您的加入正在创建笛卡尔产品,它是否正确? –