Sybaseでテーブル分割とその検証 〜その3 デバイスをさらに増やしてみる〜
Sybaseでテーブル分割とその検証
〜その3 デバイスをさらに増やしてみる〜
0.更新履歴
1.はじめに
このドキュメントでは,ASE11.0.3.3#ESD6にて,テーブル分割を行う手順と,そのパフォーマンスについて検証した結果について説明する.
なお,「テーブル分割」とは,Oracleでいうパーティションテーブルのことで,概略はドキュメント「テーブルのパーティション分割」を参照のこと.
2.前回のおさらいと今回のテストの説明
- 前回のテストでは,物理的に3つのデータベースファイル(デバイスファイル)を作成して,パーティションを3つに分け検証した.
デバイス名 |
サイズ |
PTest1_dat01 |
5MB |
PTest1_dat02 |
5MB |
PTest1_dat03 |
5MB |
- 今回は,前回の倍の6つのデバイスファイルで構成される,同じ容量で構成したセグメントにテーブルを作成して,同様のテストを尾行ってみる.
デバイス名 |
サイズ |
PTest1_dat11 |
2.5MB |
PTest1_dat12 |
2.5MB |
PTest1_dat13 |
2.5MB |
PTest1_dat14 |
2.5MB |
PTest1_dat15 |
2.5MB |
PTest1_dat16 |
2.5MB |
- デバイスが,物理的に分かれていないが,テーブル分割する事によって効果があるのかを検証する.
3.準備
1> sp_helpsegment
2> go
segment name status
------- ------------------------------ ------
0 system 0
1 default 1
2 logsegment 0
3 dat_seg 0
4 idx_seg 0
5 PTest_seg 0
6 NTest_seg 0
7 PTest15M_seg 0
8 PTest6_seg 0
(return status = 0)
1> sp_helpsegment PTest6_seg
2> go
segment name status
------- ------------------------------ ------
8 PTest6_seg 0
device size free_pages
------------------------------ ---------------------- -----------
PTest_dat11 2.0MB 1024
PTest_dat12 2.0MB 1024
PTest_dat13 2.0MB 1024
PTest_dat14 2.0MB 1024
PTest_dat15 2.0MB 1024
PTest_dat16 2.0MB 1024
(return status = 0)
1>
|
1> create table TestTable6
2> (
3> fieldA numeric(10,0) identity,
4> fieldB char(10)
5> ) on PTest6_seg
6> go
1>
|
- alter table文で,作成したテーブル分割を行う.
1> alter table TestTable6 partition 3
2> go
1>
|
1> sp_help TestTable6
2> go
Name Owner
Type
------------------------------ ------------------------------
----------------------
TestTable6 dbo
user table
Data_located_on_segment When_created
------------------------------ --------------------------
PTest6_seg Apr 24 2002 6:09PM
Column_name Type Length Prec Scale Nulls Default_name
Rule_name Identity
--------------- --------------- ------ ---- ----- ----- ---------------
--------------- --------
fieldA numeric 6 10 0 0 NULL
NULL 1
fieldB char 10 NULL NULL 0 NULL
NULL 0
Object does not have any indexes.
No defined keys for this object.
partitionid firstpage controlpage
----------- ----------- -----------
1 33282 33283
2 34305 34306
3 35329 35330
4 36353 36354
5 37377 37378
6 38401 38402
(return status = 0)
1>
|
4.直列時の計測テスト
この章での計測方法は,1プロセスだけでデータベースにI/O負荷をかけ,未分割のテーブルと分割テーブルの性能差について検証する.
4.1.直列でinsert文でデータ投入してみる
1> set nocount on
2> go
1> declare @c1 int
2> select @c1 = 1
3> print "Start"
4> select convert(char(12),getdate(),108)
5> while @c1 < 5000
6> begin
7> insert into TestTable6 values("aaa")
8> select @c1 = @c1 + 1
9> end
10> print "End"
11> select convert(char(12),getdate(),108)
12> go
Start
------------
18:13:20
End
------------
18:14:07
1>
|
- 46秒.
- ファイルが分かれていて,テーブル分割した第1回目のテストでは,同じテストで47秒だった.
- なんどかテストしていると,ほぼ47秒に近い46秒のようである.
4.2.直列でデータを削除してみる
- テーブル分割を行っているテーブルのデータを削除する.
1> select convert(char(12),getdate(),108)
2> delete TestTable6
3> select convert(char(12),getdate(),108)
4> go
------------
18:23:32
------------
18:23:34
1>
|
- 2秒.
- 前回のテストでは,2秒だったため,あまり変わりは無い.
- というか,ここまでくるとハードウェアのI/O待ちが原因ともおもわれる.
5.並列テスト用のプログラムを準備する
- 前回のテストで作成したinsertTable.sqlファイルのテーブル名を修正する.
insertTable.sql
bash$ cat insertTable.sql
declare @c1 int
select @c1 = 1
print "Start"
while @c1 < 5000
begin
insert into TestTable6 values("aaa")
select @c1 = @c1 + 1
end
print "End"
go
bash$
|
- その他のシェル等は,前回のテストので利用したものが再利用できる.
5.1.シェルを実行してみる
[sybase@poweredge sybase]$ insertTable.Multi.sh
Wed Apr 24 18:25:26 JST 2002
Wed Apr 24 18:25:26 JST 2002
Wed Apr 24 18:25:26 JST 2002
Wed Apr 24 18:25:26 JST 2002
Wed Apr 24 18:25:26 JST 2002
Wed Apr 24 18:26:27 JST 2002
Wed Apr 24 18:26:28 JST 2002
Wed Apr 24 18:26:28 JST 2002
Wed Apr 24 18:26:28 JST 2002
Wed Apr 24 18:26:28 JST 2002
[sybase@poweredge sybase]$
|
6.まとめ
6ファイルでテーブル分割した場合
|
開始時間 |
終了時間 |
実行時間 |
実行時間(秒) |
5個1回目 |
18:25:26 |
18:26:28 |
00:01:02 |
62 |
5個2回目 |
18:27:03 |
18:28:06 |
00:01:03 |
63 |
5個3回目 |
18:33:48 |
18:34:51 |
00:01:03 |
63 |
平均 |
63 |
- 他のデータと見比べてみる.
- 前回検証した,3つのデバイスファイルを使って,パーティションを3つとした場合の検証データと見比べてみる.
前回検証した,3ファイルでテーブル分割したテーブル
|
開始時間 |
終了時間 |
実行時間 |
実行時間(秒) |
分割1回目 |
18:41:00 |
18:42:29 |
00:01:29 |
89 |
分割2回目 |
18:45:31 |
18:46:59 |
00:01:28 |
88 |
分割3回目 |
18:51:33 |
18:53:02 |
00:01:29 |
89 |
平均 |
89 |
- やっぱり速くなっている.
- 1つのデバイスで,パーティションを3つとした場合の検証結果
1ファイルでテーブル分割したテーブル
|
開始時間 |
終了時間 |
実行時間 |
実行時間(秒) |
5個1回目 |
17:00:17 |
17:01:47 |
00:01:30 |
90 |
5個2回目 |
17:28:37 |
17:30:07 |
00:01:30 |
90 |
5個3回目 |
17:31:53 |
17:33:24 |
00:01:31 |
91 |
平均 |
90 |
3ファイルで,テーブル分割してない
|
開始時間 |
終了時間 |
実行時間 |
実行時間(秒) |
なし1回目 |
18:33:09 |
18:37:03 |
00:03:54 |
234 |
なし2回目 |
18:57:06 |
19:01:01 |
00:03:55 |
235 |
なし3回目 |
19:04:37 |
19:08:31 |
00:03:54 |
234 |
平均 |
234 |
- よって,テーブル分割する場合は,数多くデバイスファイルを分ける事をお勧めする.