Hier sind einige Codebeispiele aus dem Internet und Antworten auf diese Frage.
Für jede Methode habe ich den Originalcode so geändert, dass jede dieselbe Tabelle und Spalte verwendet: NumbersTest und Number, mit 10.000 Zeilen oder so nah wie möglich daran. Außerdem habe ich Links zum Herkunftsort bereitgestellt.
METHODE 1 ist hier eine sehr langsame Schleifenmethode. Von hier aus wurden
durchschnittlich 13,01 Sekunden
dreimal am höchsten entfernt, hier sind Zeiten in Sekunden: 12,42, 13,60
DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
CREATE TABLE NumbersTest(Number INT IDENTITY(1,1))
SET NOCOUNT ON
WHILE COALESCE(SCOPE_IDENTITY(), 0) < 100000
BEGIN
INSERT dbo.NumbersTest DEFAULT VALUES
END
SET NOCOUNT OFF
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE())/1000.0)+' seconds'
SELECT COUNT(*) FROM NumbersTest
METHODE 2 ist eine viel schnellere Schleife von hier aus.
Durchschnittlich 1,1658 Sekunden wurden
11 Mal am höchsten entfernt. Hier sind die Zeiten in Sekunden: 1,117, 1,140, 1,203, 1,170, 1,173, 1,156, 1,203, 1,153, 1,173, 1,170
DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
CREATE TABLE NumbersTest (Number INT NOT NULL);
DECLARE @i INT;
SELECT @i = 1;
SET NOCOUNT ON
WHILE @i <= 10000
BEGIN
INSERT INTO dbo.NumbersTest(Number) VALUES (@i);
SELECT @i = @i + 1;
END;
SET NOCOUNT OFF
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE())/1000.0)+' seconds'
SELECT COUNT(*) FROM NumbersTest
METHODE 3 Hier ist ein einzelnes INSERT basierend auf dem Code von hier.
Durchschnittlich 488,6 Millisekunden,
die 11 Mal am höchsten entfernt wurden. Hier sind Zeiten in Millisekunden: 686, 673, 623, 686,343,343,376,360,343,453
DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
CREATE TABLE NumbersTest (Number int not null)
;WITH Nums(Number) AS
(SELECT 1 AS Number
UNION ALL
SELECT Number+1 FROM Nums where Number<10000
)
insert into NumbersTest(Number)
select Number from Nums option(maxrecursion 10000)
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE()))+' milliseconds'
SELECT COUNT(*) FROM NumbersTest
METHODE 4 hier ist eine "Semi-Looping" -Methode von hier aus
durchschnittlich 348,3 Millisekunden (es war schwierig, ein gutes Timing zu erhalten, da "GO" in der Mitte des Codes vorhanden ist, Vorschläge wären willkommen),
die hier 11 Mal am höchsten entfernt ausgeführt wurde sind Zeiten in Millisekunden: 356, 360, 283, 346, 360, 376, 326, 373, 330, 373
DROP TABLE NumbersTest
DROP TABLE
CREATE TABLE
INSERT INTO
CREATE TABLE NumbersTest (Number int NOT NULL);
INSERT NumbersTest values (1);
GO
INSERT NumbersTest SELECT Number + (SELECT COUNT(*) FROM NumbersTest) FROM NumbersTest
GO 14
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
SELECT CONVERT(varchar(20),datediff(ms,RunDate,GETDATE()))+' milliseconds' FROM
SELECT COUNT(*) FROM NumbersTest
METHODE 5 hier ist ein einzelnes INSERT aus Philip Kelleys Antwort.
Durchschnittlich 92,7 Millisekunden
liefen 11-mal entfernt am höchsten, hier sind Zeiten in Millisekunden: 80, 96, 96, 93, 110, 110, 80, 76, 93, 93
DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
CREATE TABLE NumbersTest (Number int not null)
;WITH
Pass0 as (select 1 as C union all select 1),
Pass1 as (select 1 as C from Pass0 as A, Pass0 as B),
Pass2 as (select 1 as C from Pass1 as A, Pass1 as B),
Pass3 as (select 1 as C from Pass2 as A, Pass2 as B),
Pass4 as (select 1 as C from Pass3 as A, Pass3 as B),
Tally as (select row_number() over(order by C) as Number from Pass4)
INSERT NumbersTest
(Number)
SELECT Number
FROM Tally
WHERE Number <= 10000
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE()))+' milliseconds'
SELECT COUNT(*) FROM NumbersTest
METHODE 6 hier ist ein einzelnes INSERT von Mladen Prajdic Antwort
durchschnittlich 82,3 Millisekunden
liefen 11-mal entfernt am höchsten, hier sind Zeiten in Millisekunden: 80, 80, 93, 76, 93, 63, 93, 76, 93, 76
DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
CREATE TABLE NumbersTest (Number int not null)
INSERT INTO NumbersTest(Number)
SELECT TOP 10000 row_number() over(order by t1.number) as N
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number);
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE()))+' milliseconds'
SELECT COUNT(*) FROM NumbersTest
METHODE 7 ist hier ein einzelnes INSERT basierend auf dem Code von hier.
Durchschnittlich 56,3 Millisekunden wurden
11 Mal am höchsten entfernt, hier sind Zeiten in Millisekunden: 63, 50, 63, 46, 60, 63, 63, 46, 63, 46
DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
SELECT TOP 10000 IDENTITY(int,1,1) AS Number
INTO NumbersTest
FROM sys.objects s1
CROSS JOIN sys.objects s2
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE()))+' milliseconds'
SELECT COUNT(*) FROM NumbersTest
Nachdem ich mir all diese Methoden angesehen habe, mag ich Methode 7, die am schnellsten war und deren Code auch ziemlich einfach ist.