Monthly Archives: 11月 2009

重箱の隅をつつく話

国語 英和 和英 カタカナ 漢字 – Infoseek マルチ辞書
会社で “代替” を “だいがえ” 読んでる人がいて、気になったので調べてみた。音読みと訓読みを組み合わせてしまう “重箱読み” という読み方だそうです。
「湯桶読み」と「重箱読み」: 最強!覚えなければ恥をかく用語集
音読みと訓読みとどちらが先かで “湯桶読み” ってのもあるそうです。
日本語的には避けるべき感はあるけど、慣用になってしまっていたりするので、全てが間違いってわけではなさそう。”代替” も元は “だいたい” だけど、今や “だいがえ” も辞書に載っているぐらいなので間違いとまでは言えないっぽいです。
まー、言葉なんて伝わりゃいいってことなんですかねー。
重箱の隅をつつく話でした。

久々のサーバメンテナンスは怖い

曖昧スラッシュ
ブログを移行したレンタルサーバを久々にメンテナンスしてた。家に置いといたら模様替えの時とかに落ちるのが嫌で移行したんだけど、結局はメンテナンスで半日ぐらい落としちゃった。意味ねー。
何してたかって言うと、OpenVZ のファイルシステムを XFS から Ext3 に移行してました。SATA は遅い。確か RAID ミラーリングとかでもないはずだし・・・。
なんで Ext3 にしたかというと、ハードリンクを使って容量節約をするためです。OpenVZ って、言っちゃあ強化版 chroot jail なんですよ。なので、同一ファイルシステム内ならハードリンクが効くっぽいんです。
この元になったのはこちら。
Shared webhosting – OpenVZ Wiki
MySQL が開くソケットをハードリンクで他のコンテナにつなぐことができるんです。たぶん PostgreSQL でもできるよね。
ってなわけで、いくつかのベースとなるコンテナを作っておいて、必要に応じてハードリンクで複製して起動すれば、ディスクを節約できるんじゃないかと思っています。カーネルのファイルキャッシュも少なく済むんじゃないかと期待。でも、使いまわせるのはバイナリだけだから、あんま意味ないかな。
あ、ハードリンクとファイルシステムの種類は関係ないって言われそうですね。実際、直接は関係ないです。XFS だと OpenVZ のクォータが効かないので、コンテナごとに LVM で論理ボリュームを作っていたのですが、全体を単一のファイルシステムにするならクォータが必要になるので Ext3 にしました。まぁ、まだ他人に貸してないからクォータは使ってないんですけどね。
で、yum update でカーネルがアップデートされて、カーネルパニックしたのもシステム停止時間を引き延ばしました。なんだったんだろう、ちゃんと調べてないんだけど。とりあえず新しいのを削除して、古いので起動しています。怖い×2。

今日の悲しいこと

最近ブログを更新してないのは知っていました。でも、そんな時もあると思います。というわけで、今日の悲しいことをひとつ。
今日は業後に会社の PC で遊んでいました。Virtual PC に Gentoo Linux を入れて、ごりごりコンパイルをし、カーネルの不要と思われるモジュールを削ぎ落とし・・・。とても楽しかったです。
そして再起動。しっかり上がってきました。dmesg でカーネルログを見ても問題はなさそう。しかし、emerge -a –depclean して不要パッケージを削除しようとしたら、途中でエラーになり止まってしまいました。
よく見るとカーネルソースパッケージ内に変なファイルがいるじゃないですか。名前は読めるけどパーミションも所有者情報も全て ??? って感じ。削除もできない・・・。
とりあえず問題のパッケージ以外を削除し、revdep-rebuild。なんとかアップデート手順が済んだので、再起動。上がってきたー、と思ったら大間違い。ファイルシステムを読めなくてカーネルがパニックしちゃいました。
カーネルのモジュールを削ぎすぎたかなぁ。やり過ぎにはご用心です。特に必要な仮想マシンでもないので、深入りはしないことにしています。
というわけで、業後の一時間半が無駄に過ぎたとさ。チャンチャン。

PostgreSQLとOracleのインデックス実装

“ Bツリー索引とは逆に、ビットマップ索引は、データの分布率が低い列(例えば、性別とか年度など)に作成すると効果が得られます。”

3-6-2-2 正しい索引の使用方法
ビットマップ索引なんてあるんだ。Oracle の話。PostgreSQL にはないみたい。

“PostgreSQLでは、B-tree、Hash、GiST、GINといった複数の種類のインデックスを使用可能です。”

インデックスの種類
論理値データ型で似たような実装ができるかな?
論理値データ型
新しい値が入ってきたら ALTER TABLE で列を追加しちゃうとか。組み込み関数とか使って、しっかり作り込まなきゃならないかな。面倒だな。そう考えると Oracle って便利だね。

SQLのTRUNCATEコマンドを知った

“TRUNCATEはテーブル群から全ての行を素早く削除します。各テーブルに対して条件指定のないDELETEコマンドの実行と同じ効果を持ちますが、実際にテーブルを走査しない分、このコマンドの方が高速です。さらに、その後にVACUUM操作を行うことなく、このコマンドはディスク領域を即座に回収します。このコマンドは、大きなテーブルを対象とする場合に最も有用です。 “

TRUNCATE
あまりないシチュエーションですが、テーブルの構造は残してデータを消したい場合に使うコマンドだそうです。そういう場合、すぐに思いつくのは DELETE * from table; ですが、TRUNCATE は ON DELETE トリガを発行しないので高速なんだそうです。
高速なのは嬉しいですが、高速さのために整合性を捨てているようです。運用中には使うなら、特徴を知っておく必要がありそうです。AFTER TRUNCATE トリガもあるようなので、これを利用するのも良さそうですね。
権限的にも TRUNCATE 権限は DROP 権限とは別に必要になります。Oracle でも DDL として実装されているそうです。

“DDL であり DROP TABLE できる権限が必要 (DELETE 権限では実行できない)。”

TRUNCATE と DELETE の違い – オラクル・Oracleをマスターするための基本と仕組み
開発者向けのコマンドに思えますね。あんま使わない気がする・・・。