SQL Server 使用SQL创建1000万个产品

k2arahey  于 2022-11-28  发布在  其他
关注(0)|答案(1)|浏览(173)

我正在尝试将1000万个产品添加到我的产品表中。
这就是我目前的尝试:

INSERT INTO Artikel (Hersteller, Artikelnummer, Artikelnamen, Artikelbeschreibung, Preis)
VALUES (
    
    (SELECT TOP 1 Hersteller FROM Artikel ORDER BY NEWID()) ,
    (SELECT FLOOR(RAND() * (100000000000-101 + 1)) + 101 ) ,
    (SELECT REPLACE(NEWID(),'-','')),
    (SELECT REPLACE(NEWID(),'-','')),
    (SELECT ROUND(RAND(CHECKSUM(NEWID())) * (9999), 2))
)
GO 10000000

但是这需要很长时间。大约45分钟后,我的查询还没有接近200 K的值。有没有更快/更有效的解决方案?

pepwfjgg

pepwfjgg1#

您实际想要的是什么并不清楚,但是,通过在几个批处理中执行此操作,您可能会获得一些非常好的性能。我不明白为什么您从表(Artikel)中获取一个值(Hersteller),然后再次将其插入到表中,但无论如何,我已经将其合并了。
这将INSERT分为两批,每批5,000,000个:

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2, N N3, N N4, N N5, N N6, N N7), --10,000,000 rows
Dataset AS(
    SELECT TOP (5000000)
           A.Hersteller
    FROM dbo.Artikel A
         CROSS JOIN Tally T)
INSERT INTO dbo.Artikel
SELECT D.Hersteller,
       FLOOR(RAND() * (100000000000-101 + 1)) + 101, --This'll be the same for every row, is that intended?
       REPLACE(NEWID(),'-',''),
       REPLACE(NEWID(),'-',''),
       ROUND(RAND(CHECKSUM(NEWID())) * (9999), 2) --This'll be the same for every row, is that intended?
FROM Dataset D;
GO 2

注意我对RAND的评论,它会在每一行上产生相同的值(在批处理中)。如果这不是所期望的,那么请看这篇关于每行产生一个随机数的文章:How do I generate a random number for each row in a T-SQL select?

相关问题