Unpivot LARGE SQL 表并同时更新同一个表? (限于篇幅)

问题描述 投票:0回答:1

我工作的服务器空间非常低,我们目前正在努力解决这个问题。然而,我们也有一些快速的截止日期即将到来,我们需要尽快将这些数据放入那里。

Origin表:15亿行 反透视表:将有 11x 15 亿行......~170 亿行

有没有一种方法可以取消对原始表的透视并将其同时存储在原始表上?通常,我会将它存储为一个新表,然后删除旧表。但是,在这种情况下,这不是一种选择。我已经尝试过了,但由于空间限制而出错。

提前致谢!

sql database ssms
1个回答
0
投票

鉴于空间有限,我不确定这样做是否能满足“快速截止日期”,我会继续使用 ALTER DATABASE ADD FILE 添加一个新文件组和一个新文件。然后,使用 SELECT INTO 创建反透视表并使用 ON 子句指定新文件组。

-- Create a new filegroup and add a file to it
ALTER DATABASE [database_name]
ADD FILEGROUP [filegroup_name];

ALTER DATABASE [database_name]
ADD FILE (
  NAME = [file_name],
  FILENAME = 'C:\path\to\filegroup\file.ndf',
  SIZE = 100GB,
  MAXSIZE = UNLIMITED,
  FILEGROWTH = 10GB
)
TO FILEGROUP [filegroup_name];

-- Create the temporary table on the new filegroup
SELECT *
INTO [filegroup_name].[unpivoted_table]
FROM (
  SELECT id, col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11
  FROM origin_table
) AS t
UNPIVOT (
  value FOR col IN (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11)
) AS unpvt
ON [filegroup_name];

-- Optional: Rename the origin table
EXEC sp_rename 'origin_table', 'origin_table_backup';

-- Copy the unpivoted table to where the origin table is normally stored
SELECT *
INTO origin_table
FROM unpivoted_table;

-- Drop the backup table, once the oigin_table is verified
-- DROP TABLE origin_table_backup;

显然这可以分解成单独的步骤以适应,并且在当前有限的空间中处理备份表和新表可能是不可能的所以你可能想要延迟覆盖“origin_table”直到你解决了当前空间不足的问题.在重建 origin_table 之前,也许可以使用 unpivoted_table 代替。

© www.soinside.com 2019 - 2024. All rights reserved.