データ量を増やしてリトライ
65,536件ではメモリに収まってしまうため、さらに16倍して16,777,216件で比較してみたところ、大差がつきました。
レコード長は約80Kなので、それにレコード数を掛けると、約78GBとなります。
このデータ量なら、メモリには収まらず、ディスク容量の範囲で収まるテストになります。
テスト直後の画像ですが、およそそのような感じになりました。
データ件数を増やしたコード
Declare @cd nvarchar(max) = REPLICATE('X', 4000);
Declare @t1 datetime2;
Declare @t2 datetime2;
Declare @t3 datetime2;
Declare @t4 datetime2;
Declare @c1 nvarchar(max) = Convert(nvarchar, RAND(0));
Declare @c2 nvarchar(max) = Convert(nvarchar, SYSDATETIME(), 121);
Declare @c3 nvarchar(max) = Convert(nvarchar,Convert(char(255), NEWID()));
Drop Table If Exists #test1
Create Table #test1(
c0 bigint,
c1 nvarchar(max),
c2 nvarchar(max),
c3 nvarchar(max),
c4 nvarchar(max),
c5 nvarchar(max),
c6 nvarchar(max),
c7 nvarchar(max),
c8 nvarchar(max),
c9 nvarchar(max)
);
Set @t1 = SYSDATETIME();
With
N1(dummy) as (
Select 0 Union ALL Select 0), --2rows
N2(dummy) as (
Select 0 From N1 as T1 Cross Join N1 as T2), --4rows
N3(dummy) as (
Select 0 From N2 as T1 Cross Join N2 as T2), --16rows
N4(dummy) as (
Select 0 From N3 as T1 Cross Join N3 as T2), --256rows
N5(dummy) as (
Select 0 From N4 as T1 Cross Join N4 as T2), --65536rows
N6(dummy) as (
Select 0 From N3 as T1 Cross Join N5 as T2), --16777216 rows
NX(id) as (
Select ROW_NUMBER() over (order by(Select Null)) From N6)
Insert into #test1
Select id, @cd, @cd, @cd, @cd, @cd, @cd, @cd, @cd, @cd
From NX;
Set @t2 = SYSDATETIME();
Update #test1
Set c1 = @c1, c2 = @c2, c3 = @c3
Where (c0 % 7) = 3
Set @t3 = SYSDATETIME();
Select *
From #test1
Set @t4 = SYSDATETIME();
Select
DATEDIFF(MILLISECOND, @t1, @t2) as t1,
DATEDIFF(MILLISECOND, @t2, @t3) as t2,
DATEDIFF(MILLISECOND, @t3, @t4) as t3,
DATEDIFF(MILLISECOND, @t1, @t4) as t4
結果
tempdbの場所 | t1 | t2 | t3 | t4 |
---|---|---|---|---|
D: | 600,510 | 182,344 | 5,265,008 | 6,047,862(1時間40分48秒) |
E: | 589,095 | 43,823 | 1,348,648 | 1,981,566(33分2秒) |
コメント
トータル所要時間(t4)で約3倍の差がつきました。
ただし、t1の差はほとんどありません。
大量データをヒープテーブルに投入する場合は今回の条件下では差がつかなかったので、I/Oの特性が違うのだと思います。今後の課題としておきます。
CloudWatchの結果
t1区間と、t2, t3区間でのグラフがはっきりと違う傾向を示しました。
t1区間ではどちらのテストでも、約2000IOPS, 125MB/sec出ています。
このため時間的にも差がつかなかったと考えられます。
t2, t3区間では、IOPS・スループットともに大差がついていました。
Dドライブ(EBS)を使った場合
Eドライブ(インスタンスストア)を使った場合
終わりに
インスタンスストアは同コストのEBSと比べてやっぱり速かったです。
でも色々な条件によって得られる結果は変わってくると思うので、盲目的にならず、検証は必要だなと思いました。