Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --===== Test for 1000000 rows ==================================
- GO
- --===== Traditional RECURSIVE CTE method
- WITH Tally (N) AS
- (
- SELECT 1 UNION ALL
- SELECT 1 + N FROM Tally WHERE N < 1000000
- )
- SELECT N
- INTO #Tally1
- FROM Tally
- OPTION (MAXRECURSION 0);
- GO
- --===== Traditional WHILE LOOP method
- CREATE TABLE #Tally2 (N INT);
- SET NOCOUNT ON;
- DECLARE @Index INT;
- SET @Index = 1;
- WHILE @Index <= 1000000
- BEGIN
- INSERT #Tally2 (N)
- VALUES (@Index);
- SET @Index = @Index + 1;
- END;
- GO
- --===== Traditional CROSS JOIN table method
- SELECT TOP (1000000)
- ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS N
- INTO #Tally3
- FROM Master.sys.All_Columns ac1
- CROSS JOIN Master.sys.ALL_Columns ac2;
- GO
- --===== Itzik's CROSS JOINED CTE method
- WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1),
- E02(N) AS (SELECT 1 FROM E00 a, E00 b),
- E04(N) AS (SELECT 1 FROM E02 a, E02 b),
- E08(N) AS (SELECT 1 FROM E04 a, E04 b),
- E16(N) AS (SELECT 1 FROM E08 a, E08 b),
- E32(N) AS (SELECT 1 FROM E16 a, E16 b),
- cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY N) FROM E32)
- SELECT N
- INTO #Tally4
- FROM cteTally
- WHERE N <= 1000000;
- GO
- --===== Housekeeping
- DROP TABLE #Tally1, #Tally2, #Tally3, #Tally4;
- GO
- SPID TextData Dur(ms) CPU Reads Writes
- ---- ---------------------------------------- ------- ----- ------- ------
- 51 --===== Test for 100 rows ============== 8 0 0 0
- 51 --===== Traditional RECURSIVE CTE method 16 0 868 0
- 51 --===== Traditional WHILE LOOP method CR 73 16 175 2
- 51 --===== Traditional CROSS JOIN table met 11 0 80 0
- 51 --===== Itzik's CROSS JOINED CTE method 6 0 63 0
- 51 --===== Housekeeping DROP TABLE #Tally 35 31 401 0
- 51 --===== Test for 1000 rows ============= 0 0 0 0
- 51 --===== Traditional RECURSIVE CTE method 47 47 8074 0
- 51 --===== Traditional WHILE LOOP method CR 80 78 1085 0
- 51 --===== Traditional CROSS JOIN table met 5 0 98 0
- 51 --===== Itzik's CROSS JOINED CTE method 2 0 83 0
- 51 --===== Housekeeping DROP TABLE #Tally 6 15 426 0
- 51 --===== Test for 10000 rows ============ 0 0 0 0
- 51 --===== Traditional RECURSIVE CTE method 434 344 80230 10
- 51 --===== Traditional WHILE LOOP method CR 671 563 10240 9
- 51 --===== Traditional CROSS JOIN table met 25 31 302 15
- 51 --===== Itzik's CROSS JOINED CTE method 24 0 192 15
- 51 --===== Housekeeping DROP TABLE #Tally 7 15 531 0
- 51 --===== Test for 100000 rows =========== 0 0 0 0
- 51 --===== Traditional RECURSIVE CTE method 4143 3813 800260 154
- 51 --===== Traditional WHILE LOOP method CR 5820 5547 101380 161
- 51 --===== Traditional CROSS JOIN table met 160 140 479 211
- 51 --===== Itzik's CROSS JOINED CTE method 153 141 276 204
- 51 --===== Housekeeping DROP TABLE #Tally 10 15 761 0
- 51 --===== Test for 1000000 rows ========== 0 0 0 0
- 51 --===== Traditional RECURSIVE CTE method 41349 37437 8001048 1601
- 51 --===== Traditional WHILE LOOP method CR 59138 56141 1012785 1682
- 51 --===== Traditional CROSS JOIN table met 1224 1219 2429 2101
- 51 --===== Itzik's CROSS JOINED CTE method 1448 1328 1217 2095
- 51 --===== Housekeeping DROP TABLE #Tally 8 0 415 0
- WITH Nbrs ( n ) AS (
- SELECT 1 UNION ALL
- SELECT 1 + n FROM Nbrs WHERE n < 500 )
- SELECT n FROM Nbrs
- OPTION ( MAXRECURSION 500 )
- WITH
- E00 (N) AS (
- SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
- SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 ),
- E01 (N) AS (SELECT a.N FROM E00 a CROSS JOIN E00 b),
- E02 (N) AS (SELECT a.N FROM E01 a CROSS JOIN E01 b ),
- E03 (N) AS (SELECT a.N FROM E02 a CROSS JOIN E02 b
- LIMIT 11000 -- end record 11,000 good for 30 yrs dates
- ), -- max is 100,000,000, starts slowing e.g. 1 million 1.5 secs, 2 mil 2.5 secs, 3 mill 4 secs
- Tally (N) as (SELECT row_number() OVER (ORDER BY a.N) FROM E03 a)
- SELECT N
- FROM Tally
- CREATE VIEW dbo.Numbers
- WITH SCHEMABINDING
- AS
- WITH Int1(z) AS (SELECT 0 UNION ALL SELECT 0)
- , Int2(z) AS (SELECT 0 FROM Int1 a CROSS JOIN Int1 b)
- , Int4(z) AS (SELECT 0 FROM Int2 a CROSS JOIN Int2 b)
- , Int8(z) AS (SELECT 0 FROM Int4 a CROSS JOIN Int4 b)
- , Int16(z) AS (SELECT 0 FROM Int8 a CROSS JOIN Int8 b)
- , Int32(z) AS (SELECT TOP 2147483647 0 FROM Int16 a CROSS JOIN Int16 b)
- SELECT ROW_NUMBER() OVER (ORDER BY z) AS n
- FROM Int32
- GO
Add Comment
Please, Sign In to add comment