ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

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というデータが登録されることになります。
と、ここまでは予備知識で、今HibernateJDBCの速度比較ってのをHSQLDBを使ってやってるんですが、JDBCでは項目を指定しないパターンで記述し、Hibernateでは項目を指定するパターン(これは勝手にそうなる)でやってみたところ、10倍以上の速度差でHibernateの方が速いという結果になってしまいました。そんなわけはないと思い、細かく調べてみたところ、上記の違いに当たりました。で、JDBCでも項目を指定するパターンで記述したところ、当然のことながらHibernateよりも速くなりました。
詳しい原因は良く分かってないのですが、一見すると同じようなSQLの書き方で、性能が何十倍も異なってくるというのは、結構ショッキングな出来事でした。う〜ん、HSQLDBの扱いって意外と難しいのかも。他のDBMSで同じ実験したらどうなるんだろうか。。