sql - 旋转 1300 万条记录时,tempDB 在 SQL Server 中已满,旋转需要超过 28 小时

标签 sql sql-server tsql pivot

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

Msg 1105, Level 17, State 2, Line 56
Could not allocate space for object 'dbo.WORKFILE GROUP large record overflow storage: 140761897762816' in database 'tempdb' because the 'PRIMARY' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup



此外,旋转所需的时间太长。 (超过 28 小时)当时没有其他任务在该 SQL 服务器上运行。

我们在机器中总共有 16GB 物理内存,其中 16GB,12GB 分配给 SQL 服务器。这台机器有4核。文件类型 ROWS Data 总共有 4 个文件组,所有 5 个文件都位于单独的驱动器中的 LOG 有一个文件组,该驱动器的总大小为 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

Table structure of synk_isheet_1_int

请注意,fieldname 可能更多,我们必须对其进行调整。

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

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

Query execution plan

Expected pivot look like

谢谢大家

最佳答案

首先:请不要发布数据图片。没有人想输入这个。最好尝试提供一个独立的示例来重现您的问题。
其次:即使这个表是临时创建的:对于如此昂贵的查询,创建索引是值得的。
而不是使用 PIVOT您可能会使用条件聚合。这个想法是,使用分组集,将您的目标集减少到每个实体一行(无论这是什么)并使用 CASE WHEN连同MAX()设置枢轴列。

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;
不知道你的表格和数据,这是蒙着眼睛的。但是我的魔法 Crystal 球告诉我,这可能会有所帮助...
一个简化的例子
这是 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

关于sql - 旋转 1300 万条记录时,tempDB 在 SQL Server 中已满,旋转需要超过 28 小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53663433/

相关文章:

sql - 一段时间内的平均值非常慢

sql - 如何将northwind数据库的sql文件导入到PostgreSQL中?

sql - 如何删除配置单元中特殊字符后的值

c# - 无法使用 NHibernate 登录到 SQL Server,但可以使用 Management Studio 或 sqlcmd

sql-server - 为什么 SQL Server 是 Big Endian?

sql-server - SQL 服务器 : connect to local instance by using

sql-server - null 未按预期工作的情况

sql - 将 varchar 值 'Blue color' 转换为数据类型 int 时转换失败

sql - 减去列值后在sql中排序

sql - 连接可能包含空值的人名的最短 TSQL 是什么