我有一个查询,该查询检索大约184K行并将其存储到临时表中。现在,在第二个查询中,我首先从临时表中检索所有数据并将其旋转。旋转时,我遇到了错误。
信息1105,第17级,州2,第56行 无法为数据库“ tempdb”中的对象“ dbo.WORKFILE GROUP大记录溢出存储:140761897762816”分配空间,因为“ PRIMARY”文件组已满。 通过删除不需要的文件,删除文件组中的对象,向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。
SQL查询如下:
SELECT *
FROM
(
SELECT Id,
Name,
ROW_NUMBER() OVER (PARTITION BY Id,
Name
ORDER BY
(
SELECT NULL
)
) AS [Row Number],
[Value]
FROM #Data --184K Rows
) AS S
PIVOT
(
MAX([Value])
FOR Name IN ([A],[B],[C],[D],[E],[F],[G],[H],[I],[J],[K],[L],[M],[N],[O],[P],[Q],[R]
)
) AS PVT;
能否在不增加tempDB大小的情况下解决此问题?
答案 0 :(得分:0)
(猜测,因为您没有发布sql或计划)如果使用的是PIVOT,则通常会以汇总形式出现,并且可能会出现流式增长。这可以有一个排序(将转到tempdb)。这不太可能单独耗尽空间。但是,我们看到的另一种模式是对每个属性进行子选择SELECT(SELECT MAX(col1)FROM T WHERE col ='value',…)FROM...。这可能导致可以通过排序实现的聚合每个属性。因此,这是可行的,这可能是如果您最终尝试旋转非常大的表时查询空间可能用完的原因。请考虑您用于编写查询的模式。如果您的查询计划中有许多线轴/排序,则可以移至PIVOT并减少所需的排序数量。