谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

CLOBが遅い。CLOBへのキャストすら遅いんだ。

Apache DerbyでXML型を使ってるんだけど、
これをCLOBにキャストすると、凄く遅い。


リファレンスに掲載されている方法。
http://db.apache.org/derby/docs/10.3/ref/rrefsqljtypexml.html

SELECT XMLSERIALIZE (xcol as CLOB) FROM myXmlTable

これでSELECTすると、とても遅い。


これを

SELECT XMLSERIALIZE (xcol as VARCHAR(32000)) FROM myXmlTable

にしただけで、ものっそ早くなる。


「凄く」とか「とても」とか「ものっそ」とか
ホント曖昧なことばっかり言って申し訳ないんだけど
計測してないから、とても定量的には話せないんだ。


データサイズにも依ると思うけど、数百件の検索結果で
体感100倍ぐらい差があるんじゃないかと思うぐらい遅い。
(0.1秒で終わる処理に10秒掛かる感じ)


でも、VARCHARにすると、今度は32,672文字までしか扱えなくて困る。
http://db.apache.org/derby/docs/10.3/ref/rrefsqlj41207.html


XML型で、たとえば10万文字ぐらい扱いたい場合に
どうすれば良いか、知ってる or アイデアある方、いませんか?


複数のVARCHARに切り出して連結するとか、
いっそPostgreSQL8.3に乗り換えてJDBC4.0のjava.sql.SQLXML使うとか?
(あ、もしかしてCLOB(100000)にキャストすれば、遅くなかったりとか?)