HSQLDBでINSERT(Hibernate vs JDBC)
CUSTOMER(id int, name varchar(16))のようなテーブルがあった場合、このテーブルにデータを登録するには、SQL文に以下のような書き方があります。
- 項目を指定しない場合
- INSERT INTO CUSTOMER VALUES(1, 'taka_2')
- 項目を指定する場合
- INSERT INTO CUSTOMER(ID, NAME) VALUES(1, 'taka_2')
違いとしては、前者は全ての項目を指定するのに対し、後者ではNULLでも良い項目は省くことが出来ます。たとえば、
- INSERT INTO CUSTOMER(ID) VALUES(1)
のように書けます。この結果、ID=1, NAME=NULLというデータが登録されることになります。
と、ここまでは予備知識で、今HibernateとJDBCの速度比較ってのをHSQLDBを使ってやってるんですが、JDBCでは項目を指定しないパターンで記述し、Hibernateでは項目を指定するパターン(これは勝手にそうなる)でやってみたところ、10倍以上の速度差でHibernateの方が速いという結果になってしまいました。そんなわけはないと思い、細かく調べてみたところ、上記の違いに当たりました。で、JDBCでも項目を指定するパターンで記述したところ、当然のことながらHibernateよりも速くなりました。
詳しい原因は良く分かってないのですが、一見すると同じようなSQLの書き方で、性能が何十倍も異なってくるというのは、結構ショッキングな出来事でした。う〜ん、HSQLDBの扱いって意外と難しいのかも。他のDBMSで同じ実験したらどうなるんだろうか。。