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 次。
你能帮我吗?
如果您真的只是尝试插入 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)
| 归档时间: |
|
| 查看次数: |
16488 次 |
| 最近记录: |