code_junkie

SQL, Auxiliary table of numbers

Nov 10th, 2011
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.89 KB | None | 0 0
  1. --===== Test for 1000000 rows ==================================
  2. GO
  3. --===== Traditional RECURSIVE CTE method
  4. WITH Tally (N) AS
  5. (
  6. SELECT 1 UNION ALL
  7. SELECT 1 + N FROM Tally WHERE N < 1000000
  8. )
  9. SELECT N
  10. INTO #Tally1
  11. FROM Tally
  12. OPTION (MAXRECURSION 0);
  13. GO
  14. --===== Traditional WHILE LOOP method
  15. CREATE TABLE #Tally2 (N INT);
  16. SET NOCOUNT ON;
  17. DECLARE @Index INT;
  18. SET @Index = 1;
  19. WHILE @Index <= 1000000
  20. BEGIN
  21. INSERT #Tally2 (N)
  22. VALUES (@Index);
  23. SET @Index = @Index + 1;
  24. END;
  25. GO
  26. --===== Traditional CROSS JOIN table method
  27. SELECT TOP (1000000)
  28. ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS N
  29. INTO #Tally3
  30. FROM Master.sys.All_Columns ac1
  31. CROSS JOIN Master.sys.ALL_Columns ac2;
  32. GO
  33. --===== Itzik's CROSS JOINED CTE method
  34. WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1),
  35. E02(N) AS (SELECT 1 FROM E00 a, E00 b),
  36. E04(N) AS (SELECT 1 FROM E02 a, E02 b),
  37. E08(N) AS (SELECT 1 FROM E04 a, E04 b),
  38. E16(N) AS (SELECT 1 FROM E08 a, E08 b),
  39. E32(N) AS (SELECT 1 FROM E16 a, E16 b),
  40. cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY N) FROM E32)
  41. SELECT N
  42. INTO #Tally4
  43. FROM cteTally
  44. WHERE N <= 1000000;
  45. GO
  46. --===== Housekeeping
  47. DROP TABLE #Tally1, #Tally2, #Tally3, #Tally4;
  48. GO
  49.  
  50. SPID TextData Dur(ms) CPU Reads Writes
  51. ---- ---------------------------------------- ------- ----- ------- ------
  52. 51 --===== Test for 100 rows ============== 8 0 0 0
  53. 51 --===== Traditional RECURSIVE CTE method 16 0 868 0
  54. 51 --===== Traditional WHILE LOOP method CR 73 16 175 2
  55. 51 --===== Traditional CROSS JOIN table met 11 0 80 0
  56. 51 --===== Itzik's CROSS JOINED CTE method 6 0 63 0
  57. 51 --===== Housekeeping DROP TABLE #Tally 35 31 401 0
  58.  
  59. 51 --===== Test for 1000 rows ============= 0 0 0 0
  60. 51 --===== Traditional RECURSIVE CTE method 47 47 8074 0
  61. 51 --===== Traditional WHILE LOOP method CR 80 78 1085 0
  62. 51 --===== Traditional CROSS JOIN table met 5 0 98 0
  63. 51 --===== Itzik's CROSS JOINED CTE method 2 0 83 0
  64. 51 --===== Housekeeping DROP TABLE #Tally 6 15 426 0
  65.  
  66. 51 --===== Test for 10000 rows ============ 0 0 0 0
  67. 51 --===== Traditional RECURSIVE CTE method 434 344 80230 10
  68. 51 --===== Traditional WHILE LOOP method CR 671 563 10240 9
  69. 51 --===== Traditional CROSS JOIN table met 25 31 302 15
  70. 51 --===== Itzik's CROSS JOINED CTE method 24 0 192 15
  71. 51 --===== Housekeeping DROP TABLE #Tally 7 15 531 0
  72.  
  73. 51 --===== Test for 100000 rows =========== 0 0 0 0
  74. 51 --===== Traditional RECURSIVE CTE method 4143 3813 800260 154
  75. 51 --===== Traditional WHILE LOOP method CR 5820 5547 101380 161
  76. 51 --===== Traditional CROSS JOIN table met 160 140 479 211
  77. 51 --===== Itzik's CROSS JOINED CTE method 153 141 276 204
  78. 51 --===== Housekeeping DROP TABLE #Tally 10 15 761 0
  79.  
  80. 51 --===== Test for 1000000 rows ========== 0 0 0 0
  81. 51 --===== Traditional RECURSIVE CTE method 41349 37437 8001048 1601
  82. 51 --===== Traditional WHILE LOOP method CR 59138 56141 1012785 1682
  83. 51 --===== Traditional CROSS JOIN table met 1224 1219 2429 2101
  84. 51 --===== Itzik's CROSS JOINED CTE method 1448 1328 1217 2095
  85. 51 --===== Housekeeping DROP TABLE #Tally 8 0 415 0
  86.  
  87. WITH Nbrs ( n ) AS (
  88. SELECT 1 UNION ALL
  89. SELECT 1 + n FROM Nbrs WHERE n < 500 )
  90. SELECT n FROM Nbrs
  91. OPTION ( MAXRECURSION 500 )
  92.  
  93. WITH
  94. E00 (N) AS (
  95. SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
  96. SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 ),
  97. E01 (N) AS (SELECT a.N FROM E00 a CROSS JOIN E00 b),
  98. E02 (N) AS (SELECT a.N FROM E01 a CROSS JOIN E01 b ),
  99. E03 (N) AS (SELECT a.N FROM E02 a CROSS JOIN E02 b
  100. LIMIT 11000 -- end record 11,000 good for 30 yrs dates
  101. ), -- max is 100,000,000, starts slowing e.g. 1 million 1.5 secs, 2 mil 2.5 secs, 3 mill 4 secs
  102. Tally (N) as (SELECT row_number() OVER (ORDER BY a.N) FROM E03 a)
  103.  
  104. SELECT N
  105. FROM Tally
  106.  
  107. CREATE VIEW dbo.Numbers
  108. WITH SCHEMABINDING
  109. AS
  110. WITH Int1(z) AS (SELECT 0 UNION ALL SELECT 0)
  111. , Int2(z) AS (SELECT 0 FROM Int1 a CROSS JOIN Int1 b)
  112. , Int4(z) AS (SELECT 0 FROM Int2 a CROSS JOIN Int2 b)
  113. , Int8(z) AS (SELECT 0 FROM Int4 a CROSS JOIN Int4 b)
  114. , Int16(z) AS (SELECT 0 FROM Int8 a CROSS JOIN Int8 b)
  115. , Int32(z) AS (SELECT TOP 2147483647 0 FROM Int16 a CROSS JOIN Int16 b)
  116. SELECT ROW_NUMBER() OVER (ORDER BY z) AS n
  117. FROM Int32
  118. GO
Add Comment
Please, Sign In to add comment