在 SQL Server 中插入 3 万行的最快方法

Jen*_*nha 5 performance sql-server insert t-sql query-performance

我必须在##MyTempTable只有一列 ( ID int)的临时表中插入 30000 个 ID,我想知道哪种方式可以最快地完成。

我已经尝试了 30000 次普通插入

insert into ##MyTempTable (ID) ...
Run Code Online (Sandbox Code Playgroud)

我试过了

insert into ##MyTempTable (ID) (
 select 1002000 union all 
 select 1002001 union all 
 select 1002002 ... 
Run Code Online (Sandbox Code Playgroud)

迄今为止最快的方法是:

insert into ##MyTempTable (ID)
values
(1002000),(1002001),(1002002),(1002003) ...
Run Code Online (Sandbox Code Playgroud)

因为这种类型的插入最多只接受一千行,所以我重复插入了 30 次。

你能帮我吗?

Aar*_*and 5

如果您真的只是尝试插入 30000 个从 1002000 开始递增 1 的 ID 值,我非常怀疑您是否能够在 C# 中设置比以下更快的任何内容:

INSERT ##MyTable(ID)
  SELECT 1001999 + n FROM
  (
    SELECT TOP (30000) n = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
    FROM sys.all_objects AS s1
    CROSS JOIN sys.all_objects AS s2
    ORDER BY s1.[object_id]
  ) AS x;
Run Code Online (Sandbox Code Playgroud)

在我的 Mac 主机上的低级 Windows 虚拟机中,这种情况发生在不到一秒的时间内。

有关在不循环的情况下生成集合/序列的其他想法(例如数字表可能更快),请参阅此博客系列:

http://www.sqlperformance.com/2013/01/t-sql-queries/generate-a-set-1

http://www.sqlperformance.com/2013/01/t-sql-queries/generate-a-set-2

http://www.sqlperformance.com/2013/01/t-sql-queries/generate-a-set-3

如果定义了值而不是某种增量序列(例如,您以某种方式强制将 30,000 个值强制到 DataTable 中),那么您可以考虑使用表值参数。首先,在数据库中创建此类型(只需执行一次):

CREATE TYPE dbo.MyIDs AS TABLE(ID INT PRIMARY KEY);
Run Code Online (Sandbox Code Playgroud)

现在有一个接受此操作的存储过程:

CREATE PROCEDURE dbo.TakeMyIDs
  @m dbo.MyIDs READONLY
AS
BEGIN
  SET NOCOUNT ON;

  INSERT ##MyTable(ID) SELECT ID FROM @m;
END
GO
Run Code Online (Sandbox Code Playgroud)

现在从 C# 调用存储过程并将 DataTable 作为参数传递:

INSERT ##MyTable(ID)
  SELECT 1001999 + n FROM
  (
    SELECT TOP (30000) n = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
    FROM sys.all_objects AS s1
    CROSS JOIN sys.all_objects AS s2
    ORDER BY s1.[object_id]
  ) AS x;
Run Code Online (Sandbox Code Playgroud)