有四个相同的暂存表:
CREATE TABLE s_table_1
(
id INT IDENTITY(1, 4) NOT NULL PRIMARY KEY CLUSTERED
, some_data NVARCHAR(100)
);
CREATE TABLE s_table_2
(
id INT IDENTITY(2, 4) NOT NULL PRIMARY KEY CLUSTERED
, some_data NVARCHAR(100)
);
CREATE TABLE s_table_3
(
id INT IDENTITY(3, 4) NOT NULL PRIMARY KEY CLUSTERED
, some_data NVARCHAR(100)
);
CREATE TABLE s_table_4
(
id INT IDENTITY(4, 4) NOT NULL PRIMARY KEY CLUSTERED
, some_data NVARCHAR(100)
);
随后,它们在 View 中使用:
CREATE VIEW s_table AS
SELECT * FROM dbo.s_table_1
UNION ALL SELECT * FROM dbo.s_table_2
UNION ALL SELECT * FROM dbo.s_table_3
UNION ALL SELECT * FROM dbo.s_table_4;
这种结构背后的基本原理是能够在四个并行流中暂存数据,以利用服务器上的多核 CPU(数据来自本地驱动器的大型平面文本文件;读取该文件是很多,比将行写入目标表快得多;将其拆分为四个流使我的 ETL 速度提高了 3 倍以上,我需要它更快)
我需要 ID 值在所有四个暂存表中都是唯一的 - 这就是为什么我将它们创建为 IDENTITY(N, 4),其中 N 分别为 1、2、3 或 4。
这种设置在唯一性方面是否“有风险”?我的意思是,这四个 IDENTITY 列中的一个是否有可能与另一个列发生冲突?
欢迎任何提示。
SQL 服务器 2012
最佳答案
从 SQL Server 2012 开始,您可以在此类情况下使用序列而不是身份。 See here
但是 SQL Server 会使用所有内核,除非您使用 maxdop 来达到上限。如果您将表存储在不同驱动器上的不同文件组中以提高读取性能,则会带来性能优势。
关于sql-server - UNION SELECT、并行化和 IDENTITY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54213645/