以前、
ランダムで遊んでみたを書きましたが、あれの複数行バージョンを考えてみました。 普通にこんなSQLで行けるかなとやってみたらいけました(ぉぃ
select
num,
( select num from
(select top 1 NEWID() as nid , num
from GENERATE_SERIES(1, 100, 1) rnd
order by nid) t
) random
from GENERATE_SERIES(1, 100, 1);
;
num |
random |
1 |
68 |
2 |
10 |
3 |
64 |
4 |
30 |
5 |
52 |
中略 |
96 |
56 |
97 |
40 |
98 |
59 |
99 |
67 |
100 |
74 |
テーブル '#00FF1D08'。スキャン回数 100、論理読み取り数 100、物理読み取り数 0、先行読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB 先行読み取り数 0。
テーブル '#000AF8CF'。スキャン回数 1、論理読み取り数 1、物理読み取り数 0、先行読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB 先行読み取り数 0。
SQL Server 実行時間:
、CPU 時間 = 343 ミリ秒、経過時間 = 673 ミリ秒。
ただし、以下の2パターンのSQLではできません。
結果が同じものしか返らないので・・・・。
with qry as
( select num from
(select top 1 NEWID() as nid , num
from GENERATE_SERIES(1, 100, 1) rnd
order by nid) t
)
select
g.num,
qry.num
from GENERATE_SERIES(1, 100, 1)g, qry;
select
g.num,
qry.num
from GENERATE_SERIES(1, 100, 1)g,
( select num from
(select top 1 NEWID() as nid , num
from GENERATE_SERIES(1, 100, 1) rnd
order by nid) t
) qry;
;
・・・ちなみに、GENERATE_SERIESを関数化しているので以前話したことのあるCLOSS APPLYを使うこともできるのですが、
最初のSQLよりも遅くなります・・・orz
SELECT
t.num as id, g.num as random
FROM
GENERATE_SERIES(1, 100, 1) t
cross apply
(select top 1 NEWID() as nid , num
from GENERATE_SERIES(t.num-t.num+1, 100, 1)) g
テーブル '#00FF1D08'。スキャン回数 100、論理読み取り数 100、物理読み取り数 0、先行読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB 先行読み取り数 0。
テーブル '#000AF8CF'。スキャン回数 1、論理読み取り数 1、物理読み取り数 0、先行読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB 先行読み取り数 0。
、CPU 時間 = 36719 ミリ秒、経過時間 = 44679 ミリ秒。
SQL Server の構文解析とコンパイルの時間:
CPU 時間 = 0 ミリ秒、経過時間 = 1 ミリ秒。