繁体   English   中英

在转发1300万条记录时,tempDB在SQL Server中变满,并且转动需要超过28小时

[英]While pivoting 13 million records tempDB gets full in SQL Server and pivoting takes more than 28 hours

我有一个表消耗了1300万条记录(数据将来会增加),大约2.5gb此外,这个表不是临时表。 当我们尝试透视表SQL时,给我如下结果

消息1105,第17级,状态2,第56行
无法为数据库'tempdb'中的对象'dbo.WORKFILE GROUP大记录溢出存储:140761897762816'分配空间,因为'PRIMARY'文件组已满。 通过删除不需要的文件,删除文件组中的对象,向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间

此外,枢轴需要很长时间。 (超过28小时)当时没有其他任务在该SQL服务器上运行。

我们在16gb机器中共有16GB物理内存,12gb分配给SQL服务器。 这台机器有4个核心。 文件类型ROWS数据总共有4个文件组,LOG有一个文件组,所有5个文件都位于单独的驱动器中,该驱动器的总大小为50gb。 tempdb初始大小为14gb。 所有数据文件的自动增长为100MB,Maxsize为无限制。

SQL查询如下:

SET nocount ON 

SELECT * 
INTO isheetnewdata1_4_27 
FROM 
    (SELECT 
         historyid, 
         requestentityid, 
         fieldname, 
         fieldvalue, 
         siteid, 
         isheetid 
     FROM   
         synk_isheet_1_int  
     WHERE  
         historyid = 6 
         AND group1id = 27 
         AND group2id = 4) AS A 
PIVOT 
    (MAX(fieldvalue) 
     FOR fieldname IN ([ID], [LastName], [FirstName], [Age], [externalId])
    ) AS pvt 
ORDER BY 
    historyid, requestentityid

synk_isheet_1_int的表结构

请注意,fieldname可以是我们必须转动的更多内容。

我在Microsoft Azure中使用SQL Server 2016。 我主要担心的是,旋转需要超过28小时,并且由于tempdb大小达到了该驱动器的最大大小。

我不知道在这个阶段该做什么。 我是否应该增加tempdb数据库文件所在的驱动器的大小? 并增加该机器的物理内存并为SQL Server提供更多内存?

查询执行计划

期望的支点看起来像

谢谢大家

首先:请不要发布数据图片。 没有人愿意输入此内容。最好尝试提供一个独立的示例来重现您的问题。

其次:即使这个表是临时创建的:使用如此昂贵的查询,创建索引也是值得的。

您可以使用条件聚合,而不是使用PIVOT 我们的想法是,使用分组集,将目标集减少到每个实体一行 (这是什么),并使用CASE WHENMAX()来设置枢轴列

SELECT t.historyid
      ,t.requestentityid
      ,MAX(CASE WHEN fieldname='ID' THEN fieldvalue END) AS ID
      ,MAX(CASE WHEN fieldname='LastName' THEN fieldvalue END) AS LastName
      ,MAX(CASE WHEN fieldname='Age' THEN fieldvalue END) AS Age
      ,MAX(CASE WHEN fieldname='externalId' THEN fieldvalue END) AS externalId
FROM synk_isheet_1_int t
WHERE t.historyid = 6 
  AND t.group1id = 27 
  AND t.group2id = 4
GROUP BY t.historyid,t.requestentityid;

不知道你的桌子和数据这是盲目的折叠。 但我的魔法水晶球告诉我,这可能会有所帮助......

一个简化的例子

这是1)显示原则和2)向您展示如何设置独立样本。

DECLARE @tbl TABLE(id INT,fieldname varchar(max),fieldvalue varchar(max));
insert into @tbl VALUES(1,'lastname','hugo')
                      ,(2,'age','23')
                      ,(1,'ID','12')
                      ,(2,'LastName','test');

SELECT t.id
      ,MAX(CASE WHEN t.fieldname='ID' THEN t.fieldvalue END) AS ID
      ,MAX(CASE WHEN t.fieldname='LastName' THEN t.fieldvalue END) AS LastName
      ,MAX(CASE WHEN t.fieldname='Age' THEN t.fieldvalue END) AS Age
      ,MAX(CASE WHEN t.fieldname='externalId' THEN t.fieldvalue END) AS externalId
FROM @tbl t
GROUP BY t.id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM