Sql server 无法为对象分配空间'&书信电报;临时系统对象:422212632707072>';在数据库中';tempdb&x27;因为';初级';文件组已满
我试图执行此语句,但出现以下错误: 无法在数据库“tempdb”中为对象“”分配空间,因为“主”文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件启用自动增长来创建磁盘空间 SQL语句:Sql server 无法为对象分配空间'&书信电报;临时系统对象:422212632707072>';在数据库中';tempdb&x27;因为';初级';文件组已满,sql-server,tsql,Sql Server,Tsql,我试图执行此语句,但出现以下错误: 无法在数据库“tempdb”中为对象“”分配空间,因为“主”文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件启用自动增长来创建磁盘空间 SQL语句: DECLARE @curvaTipicaPeriodoMes VARCHAR(50), @curvaTipicaPeriodoAnio VARCHAR(50), @curvaTipicaTipo VARCHAR(50), @curvaTipicaTipoInicia
DECLARE
@curvaTipicaPeriodoMes VARCHAR(50),
@curvaTipicaPeriodoAnio VARCHAR(50),
@curvaTipicaTipo VARCHAR(50),
@curvaTipicaTipoInicial VARCHAR(50),
@fronteraEstado VARCHAR(50),
@fronteraFechaFin DATETIME,
@birrelacion VARCHAR(50),
@birrelacionTipo VARCHAR(50)
SET @curvaTipicaPeriodoMes='10'
SET @curvaTipicaPeriodoAnio= '2014'
SET @curvaTipicaTipo='ValorTipico'
SET @curvaTipicaTipoInicial='ValorTipicoInicial'
SET @fronteraEstado='Operacion'
SET @fronteraFechaFin = NULL
SET @birrelacion='Bir0111'
SET @birrelacionTipo='Tfr0005'
SELECT
Consulta.tipoDia,
CASE WHEN Consulta.ValorTipico > 0 THEN Consulta.ValorTipico ELSE Consulta.ValorTipicoInicial END AS Calculo
FROM
(SELECT
C.tipoDia,
(SELECT (ISNULL(SUM(CC.periodo01),0) + ISNULL(SUM(CC.periodo02),0) + ISNULL(SUM(CC.periodo03),0) + ISNULL(SUM(CC.periodo04),0) + ISNULL(SUM(CC.periodo05),0) + ISNULL(SUM(CC.periodo06),0) + ISNULL(SUM(CC.periodo07),0) + ISNULL(SUM(CC.periodo08),0) + ISNULL(SUM(CC.periodo09),0) + ISNULL(SUM(CC.periodo10),0) + ISNULL(SUM(CC.periodo11),0) + ISNULL(SUM(CC.periodo12),0) + ISNULL(SUM(CC.periodo13),0) + ISNULL(SUM(CC.periodo14),0) + ISNULL(SUM(CC.periodo15),0) + ISNULL(SUM(CC.periodo16),0) + ISNULL(SUM(CC.periodo17),0) + ISNULL(SUM(CC.periodo18),0) + ISNULL(SUM(CC.periodo19),0) + ISNULL(SUM(CC.periodo20),0) + ISNULL(SUM(CC.periodo21),0) + ISNULL(SUM(CC.periodo22),0) + ISNULL(SUM(CC.periodo23),0) + ISNULL(SUM(CC.periodo24),0)
)
FROM
[registrar].[CurvaTipica] CC
WHERE
CC.tipo = @curvaTipicaTipo
AND CC.tipoDia=C.tipoDia
AND
DATEPART(MONTH,CC.periodo) = @curvaTipicaPeriodoMes
AND DATEPART(YEAR,CC.periodo) = @curvaTipicaPeriodoAnio
) * COUNT(C.tipoDia)
AS ValorTipico,
(
SELECT
(
ISNULL(SUM(CC.periodo01),0) + ISNULL(SUM(CC.periodo02),0) + ISNULL(SUM(CC.periodo03),0) + ISNULL(SUM(CC.periodo04),0) +
ISNULL(SUM(CC.periodo05),0) + ISNULL(SUM(CC.periodo06),0) + ISNULL(SUM(CC.periodo07),0) + ISNULL(SUM(CC.periodo08),0) +
ISNULL(SUM(CC.periodo09),0) + ISNULL(SUM(CC.periodo10),0) + ISNULL(SUM(CC.periodo11),0) + ISNULL(SUM(CC.periodo12),0) +
ISNULL(SUM(CC.periodo13),0) + ISNULL(SUM(CC.periodo14),0) + ISNULL(SUM(CC.periodo15),0) + ISNULL(SUM(CC.periodo16),0) +
ISNULL(SUM(CC.periodo17),0) + ISNULL(SUM(CC.periodo18),0) + ISNULL(SUM(CC.periodo19),0) + ISNULL(SUM(CC.periodo20),0) +
ISNULL(SUM(CC.periodo21),0) + ISNULL(SUM(CC.periodo22),0) + ISNULL(SUM(CC.periodo23),0) + ISNULL(SUM(CC.periodo24),0)
)
FROM
[registrar].[CurvaTipica] CC
WHERE
CC.tipo = @curvaTipicaTipoInicial
AND CC.tipoDia=C.tipoDia
AND
DATEPART(MONTH,CC.periodo) = @curvaTipicaPeriodoMes
AND DATEPART(YEAR,CC.periodo) = @curvaTipicaPeriodoAnio
) * COUNT(C.tipoDia)
AS ValorTipicoInicial
FROM [registrar].[CurvaTipica] C
INNER JOIN [dbo].[Frontera] F ON c.frtID=F.objID
INNER JOIN [dbo].[Birrelacion] B ON B.objID1=C.frtID
WHERE
DATEPART(MONTH,C.periodo) = @curvaTipicaPeriodoMes
AND
DATEPART(YEAR,C.periodo) = @curvaTipicaPeriodoAnio
AND
F.estado = @fronteraEstado
AND
F.fechaFin IS NULL
AND
B.objID = @birrelacion
AND
B.objID2 = @birrelacionTipo
GROUP BY
C.tipoDia
) Consulta
ORDER BY
Calculo
我检查了一下,tempdb的大小为1400mb,自动增长率为10%。我很难理解这个查询的上下文,这使我无法提供我认为是答案的全部潜力。特别是,当你按蒂波迪亚分组时,为什么你的总数乘以蒂波迪亚的计数,我感到困惑 简言之,我发现有一些事情会导致大量不希望的日志增长:
- 处理日期限制的方式:基本上需要在整个表上运行datepart,然后才能进行筛选。将其更改为中间值,表中的列上没有函数
- 非常不寻常的嵌套:我只是无法理解它,但我怀疑这是造成巨大的临时空间使用。我在下面给出了一些示例代码,说明了如何避免这种情况,但我意识到,与您的原始声明不匹配是不完整的。它应该能为你指明正确的方向。如果没有其他问题,请将查询分解为三到四个较小的临时表,然后将它们重新连接在一起,而不是尝试将所有内容都包含在一个包含这么多连接的大型语句中
- NULLIFs:这实际上又与嵌套有关,但我怀疑NULLIF正在为表的每一行列出的每一列上运行。去掉嵌套语句也可以解决这个问题,或者在嵌套部分之外进行添加
DECLARE @curvaTipicaPeriodoBegin datetime, @curvaTipicaPeriodoEnd datetime, @curvaTipicaTipo VARCHAR(50), @curvaTipicaTipoInicial VARCHAR(50), @fronteraEstado VARCHAR(50), @birrelacion VARCHAR(50), @birrelacionTipo VARCHAR(50); SET @curvaTipicaPeriodoBegin = '2014-10-01'; SET @curvaTipicaPeriodoEnd = '2014-10-31'; SET @curvaTipicaTipo='ValorTipico'; SET @curvaTipicaTipoInicial='ValorTipicoInicial'; SET @fronteraEstado='Operacion'; SET @birrelacion='Bir0111'; SET @birrelacionTipo='Tfr0005'; SELECT CurvaTipica.tipoDia, CurvaTipica.tipo, SUM ( ISNULL(CurvaTipica.periodo01,0) + ISNULL(CurvaTipica.periodo02,0) + ISNULL(CurvaTipica.periodo03,0) + ISNULL(CurvaTipica.periodo04,0) + ISNULL(CurvaTipica.periodo05,0) + ISNULL(CurvaTipica.periodo06,0) + ISNULL(CurvaTipica.periodo07,0) + ISNULL(CurvaTipica.periodo08,0) + ISNULL(CurvaTipica.periodo09,0) + ISNULL(CurvaTipica.periodo10,0) + ISNULL(CurvaTipica.periodo11,0) + ISNULL(CurvaTipica.periodo12,0) + ISNULL(CurvaTipica.periodo13,0) + ISNULL(CurvaTipica.periodo14,0) + ISNULL(CurvaTipica.periodo15,0) + ISNULL(CurvaTipica.periodo16,0) + ISNULL(CurvaTipica.periodo17,0) + ISNULL(CurvaTipica.periodo18,0) + ISNULL(CurvaTipica.periodo19,0) + ISNULL(CurvaTipica.periodo20,0) + ISNULL(CurvaTipica.periodo21,0) + ISNULL(CurvaTipica.periodo22,0) + ISNULL(CurvaTipica.periodo23,0) + ISNULL(CurvaTipica.periodo24,0) ) ValorTipico FROM registrar.CurvaTipica JOIN Frontera ON CurvaTipica.frtID = Frontera.objID JOIN Birrelacion ON CurvaTipica.frtID = Birrelacion.objID1 WHERE CurvaTipica.periodo BETWEEN @curvaTipicaPeriodoBegin AND @curvaTipicaPeriodoEnd AND Frontera.estado = @fronteraEstado AND Frontera.fechaFin IS NULL AND Birrelacion.objID = @birrelacion AND Birrelacion.objID2 = @birrelacionTipo AND ( CurvaTipica.tipo = @curvaTipicaTipo OR CurvaTipica.tipo = @curvaTipicaTipoInicial ) GROUP BY CurvaTipica.tipoDia, CurvaTipica.tipo;