[KEK Online Group] -> [Nakayoshi's Page] ->
[SQL Test] -> [Suzuki DB(2)]
Suzuki DB(2つのテーブルを使用)への対応(2)
サブクエリを用いたデータアップデート
- ハードウエア
- SQL Server/Client PC(Pentium II 300MHz, 196MB, DECchip 21142)
- ソフトウエア
- MySQL4.1.11
- Client Programs(C)
- データベース
- Magnet Parameter table(12 Columns x {200 - 2000} Rows)
- table format
+-----------+-------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+-------------------+-------+
| ID | smallint(6) | | PRI | 0 | |
| item1 | int(11) | YES | | NULL | |
| item2 | int(11) | YES | | NULL | |
| item3 | int(11) | YES | | NULL | |
| item4 | int(11) | YES | | NULL | |
| item5 | int(11) | YES | | NULL | |
| item6 | int(11) | YES | | NULL | |
| item7 | int(11) | YES | | NULL | |
| item8 | int(11) | YES | | NULL | |
| item9 | int(11) | YES | | NULL | |
| item10 | int(11) | YES | | NULL | |
| UPnichiji | timestamp | YES | | CURRENT_TIMESTAMP | |
+-----------+-------------+------+-----+-------------------+-------+
Magnet Name table(2 Columns x {200 - 2000} Rows)
table format
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| ID | smallint(6) | | PRI | 0 | |
| name | char(32) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
- 前堤条件として EPICS IOC と SQL サーバとの通信回数は、最小限にしたいという
ことがある。これは「ネットワーク通信による処理時間の不定性さ」をなるべく排除したいということによる。したがって EPICS IOC から SQL サーバへの通信は、1回の通信で実現したいと考えている。
- 以前の報告で述べたように、2つの表から目的のデータを取得するため表の結合(JOIN)を行ない1回のクエリの発行により実現可能であった。
- 2つの表から目的のデータの値をアップデートするためには、サブクエリ
を使用する(それ以外の方法で1回のクエリ発行での実現方法がわからなかったからである。ご存じの方は、教えてください)。
サブクエリは、通常なら2回のクエリをサーバーへ発行するべきものを、1回の
クエリで実現できるものである。ただし、MySQL ではバージョン 4.1 からのサポート
であるので、テスト用のPCに実験的に導入した(これまで使用していたのは 4.0.12)。
- 今回のテストでは、サブクエリが使えることを確かめること。とそのオーバヘッド
についておおよその知見を得ることが目的である。
- 電磁石の名前の表(name_table200)から、名前から ID を取り出し、その ID で
電磁石のパラメータの表(para_table200)の変更を行なうということを、サブクエリを
使って行なうと次のようになる。
update para_table200 set item = 100 where id = (select id from name_table200 where name = 'magnet1')
- サブクエリによるオーバヘッドをみるため、電磁石の名前の表(name_tablexxx)と
電磁石のパラメータの表(para_tablexxx)の行数を 200 から 2000まで変化させて処理に
要した時間を測定した(100回の平均値)。
- また比較のため、
update para_tablexxx set item = 100 where id = 100
というサブクエリを用いずに "id" を直接指定した場合に要した時間を測定した(100回の平均値)。測定結果をグラフを図1に示す。
図1 サブクエリと通常のクエリとの処理速度比較
- 図1
から、サブクエリを使わず1回のクエリによる UPDATE では、200行の場合も2000行の場合も処理時間は変らないことがわかる。サブクエリによる処理は、200行から2000行までの範囲では行数の増加に比例して処理時間も増加することがわかる。
この測定では、ネットワークを介したアクセスは行なっていないので、サブクエリによるオーバヘッドがみえていると思われる。
Copyright © 1999 - 2004 "Kazuo NAKAYOSHI" <kazuo.nakayoshi@kek.jp>
Last Modified: Apr. 21, 2005