Advertisement
anchormodeling

Optimizing BETWEEN joins

Feb 5th, 2018
11,746
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 2.20 KB | None | 0 0
  1. declare @totalSize int = 1000000;
  2. declare @drawSize int = 10000;
  3.  
  4. if OBJECT_ID('tempdb..#idRand') is not null
  5. drop table #idRand;
  6.  
  7. with idGen as (
  8.     select 1 as id
  9.     union all
  10.     select id + 1 from idGen where id < @totalSize
  11. )
  12. select
  13.     id,
  14.     rand(checksum(id)) as randomNumber
  15. into -- drop table
  16.     #idRand
  17. from
  18.     idGen
  19. option (MAXRECURSION 0);
  20.  
  21. if OBJECT_ID('tempdb..#interval') is not null
  22. drop table #interval;
  23.  
  24. select
  25.     id,
  26.     sum(randomNumber) over (order by id) - randomNumber as intervalFrom,
  27.     sum(randomNumber) over (order by id) as intervalTo
  28. into -- drop table
  29.     #interval
  30. from
  31.     #idRand;
  32.  
  33. create unique clustered index uq_intervals on #interval (intervalFrom, intervalTo);
  34.  
  35. if OBJECT_ID('tempdb..#sequence') is not null
  36. drop table #sequence;
  37.  
  38. select
  39.     id,
  40.     sum(randomNumber) over (order by id) as intervalTo
  41. into -- drop table
  42.     #sequence
  43. from
  44.     #idRand;
  45.  
  46. create unique clustered index uq_sequence on #sequence (intervalTo);
  47.  
  48. declare @intervalLength float = (select max(intervalTo) from #interval);
  49.  
  50. if OBJECT_ID('tempdb..#draw') is not null
  51. drop table #draw;
  52.  
  53. select top (@drawSize)
  54.     rand(checksum(newid())) * @intervalLength as luckyNumber
  55. into -- drop table
  56.     #draw
  57. from
  58.     #idRand;
  59.  
  60. create unique clustered index pk_draw on #draw (luckyNumber);
  61.  
  62. if OBJECT_ID('tempdb..#winners_between') is not null
  63. drop table #winners_between;
  64.  
  65. if OBJECT_ID('tempdb..#winners_apply') is not null
  66. drop table #winners_apply;
  67.  
  68. set STATISTICS PROFILE on;
  69. set STATISTICS IO on;
  70. set STATISTICS TIME on;
  71.  
  72. select
  73.     id
  74. into -- drop table
  75.     #winners_between
  76. from
  77.     #interval i
  78. join
  79.     #draw d
  80. on
  81.     d.luckyNumber between i.intervalFrom and i.intervalTo;
  82.  
  83. set STATISTICS TIME off;
  84. set STATISTICS IO off;
  85. set STATISTICS PROFILE off;
  86.  
  87. set STATISTICS PROFILE on;
  88. set STATISTICS IO on;
  89. set STATISTICS TIME on;
  90.  
  91. select
  92.     x.id
  93. into -- drop table
  94.     #winners_apply
  95. from
  96.     #draw d
  97. cross apply (
  98.     select top 1
  99.         i.id
  100.     from
  101.         #sequence i
  102.     where
  103.         d.luckyNumber < i.intervalTo
  104.     order by
  105.         d.luckyNumber desc
  106. ) x
  107.  
  108. set STATISTICS TIME off;
  109. set STATISTICS IO off;
  110. set STATISTICS PROFILE off;
  111.  
  112. --select * from #winners_between order by id
  113. --select * from #winners_apply order by id
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement