夏椰の東屋

- お遊び記録 -

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  108  : 記事  1  : コメント  3916  : トラックバック  30

ニュース


落書きしてね♪

IAM
僕がとった写真です。
ご自由にお使いください。

フィードメーター - 夏椰の東屋 track feed
広告


記事カテゴリ

書庫

日記カテゴリ

Other Site From Kaya

以前、ランダムで遊んでみたを書きましたが、あれの複数行バージョンを考えてみました。 普通にこんな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
実行プラン1

テーブル '#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;
実行プラン2

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;
;

実行プラン3

 

・・・ちなみに、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

実行プラン4


テーブル '#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 ミリ秒。
投稿日時 : 2007年12月6日 17:13

コメント

No comments posted yet.

Post Feedback

タイトル
名前
Url:
コメント