sql-server - UNION SELECT、并行化和 IDENTITY

标签 sql-server parallel-processing identity

有四个相同的暂存表:

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/

相关文章:

c++ - 在 C++ OpenMP 代码中测量执行时间

multithreading - 将自定义主体和身份与 WCF 服务一起使用时出现问题

asp.net - 本地数据库文件的连接字符串不起作用

java - 无法使用并行 Java 2 库 作者:Alan Kaminsky 教授。 (无法找到或加载主类pj2)

c# - 我需要像树结构一样在下拉列表中显示数据,我尝试过但无法在 ASP.Net 中正确显示

c++ - 并行搜索不同的值?

user-interface - microsoft.aspnetcore.identity 的用户界面

c# - 角色/帐户更改时使 Identity Core 中的用户无效

SQL Server 存储过程 if 语句注入(inject)字符串

sql - exec sp_updatestats 的作用是什么?