1

我正在尝试将 100,000,000 条基于简单坐标的记录插入表中。有没有比下面的 t-sql 命令更快的方法来实现这一点

declare @x int
declare @y int
set @x = 0
set @y = 0

begin tran
while @x < 10000
begin
    while @y < 10000
    begin
        insert into world (x,y) VALUES (@x,@y)
        set @y = @y + 1
    end
    set @y = 0
    set @x = @x + 1
end
commit tran
4

4 回答 4

3

如果您有数字表,请使用您自己的数字表。否则,您可以使用 spt_values,如下所示。

WITH base_num AS
(SELECT number FROM master..spt_values WHERE type = 'P' AND number < 100)
, num AS 
(SELECT b1.number * 100 + b2.number AS number
 FROM base_num b1
 CROSS JOIN base_num b2
) 
INSERT INTO world (x,y)
SELECT n1.number AS x, n2.number AS y 
FROM num n1
CROSS JOIN num n2
于 2013-04-30T17:22:24.780 回答
2

如果 100 个轧机行对于服务器来说不是太大,那么这样的事情可能会起作用 - 这显然取决于日志文件的大小和速度。

WITH counter AS 
(SELECT TOP 10000 ROW_NUMBER() 
   OVER (ORDER BY a.[object_id], a.name, b.[object_id]) AS rownum 
   FROM sys.columns a, sys.columns b) 
INSERT INTO World (x,y) 
SELECT a.rownum, b.rownum 
  FROM counter a, counter b
于 2013-04-30T17:18:31.223 回答
2

您可以使用数字表

 SELECT TOP 10000 -- use a smaller value for testing, this will take a bit
        IDENTITY(INT,1,1) as N
   INTO #Numbers
   FROM Master.dbo.SysColumns sc1,
        Master.dbo.SysColumns sc2

然后像

SELECT
    n1.N as 'N1'
    , n2.N as 'N2'
INTO #values
FROM #Numbers n1
    CROSS JOIN #Numbers n2


SELECT COUNT(*) FROM #values

要获得集合的笛卡尔坐标,前提是您可以使用简化的坐标值。

于 2013-04-30T17:23:53.760 回答
2

如果你没有数字表,你可以用 CTE 模拟一个:

with cte as
(select 1 i union all select i+1 i from cte where i < 10000)
INSERT into World (x,y) 
SELECT x.i, y.i 
from cte x cross join cte y
option (maxrecursion 0)
于 2013-04-30T17:45:21.877 回答