2009-03-01から1ヶ月間の記事一覧
PostgreSQLでカーソルというと、ドキュメントにあるように次の3つで定義可能らしい。 DECLARE文経由 フロントエンド/バックエンドプロトコルからBindメッセージ経由 サーバプログラミングインタフェース(SPI)経由 カーソルはポータルとも呼ばれる(プログ…
ジェネリクスねた。 Java Generics and Collections: Speed Up the Java Development Process の9.4 Strategy に出てくる話です。 @Test public void test() throws Exception { Aaa<Bbb> hoge = new Bbb(); Bbb bbb = hoge.asSubtype(); Aaa<Ccc> foo = new Ccc(); Cc</ccc></bbb>…
前回のつづき。btbulkdelete()を呼び出す前に、テーブルから削除対象のタプルをスキャンしそのポインタを記憶しておき、後でそれを参照することで削除すべきインデックスのItemを特定していることがわかった。 lazy_scan_heap() VACUUM対象リレーション(イ…
インデックスの削除のときに呼ばれるbtbulkdelete()を見てみる。削除はSQLのDELETE実行時ではなくVACUUMのときに行われる。概要はインタフェースであるambulkdeleteのところをみるとわかる。インデックスアクセスメソッド関数。GDBでbtしたときの呼び出しシ…
Multiple Boundsを日本語にするとなんだろう?多重境界?Java Generics and Collections: Speed Up the Java Development Processの「3.6 Multiple Bounds」の章に次のコードがあります。 public static <S extends Readable & Closeable, T extends Appendable & Closeable> void copy( S src, T trg, int size) throws IOExcep</s>…
下のエントリにつづいてもう1つジェネリクスねた。上限境界と下限境界を持つワイルドカードはおもしろいなぁと思いました。 ? super を使ってパラメータ化された型はObjectしか返せないと思っていたのですが、その型の上限があらかじめ決まっているならその…
前回の続き。_bt_insertonpg() から呼び出される次の3つの関数を中心にインデックス追加時のページ分割の処理を見てみた。 _bt_findsplitloc() : どのタプル以降を新しく作成する右側のページに移動するかを決める pageがright mostのときはFILLFACTORに応じ…
インデックスの追加のときに呼ばれるbtinsert()を見てみる。btinsert()はINSERTやUPDATEやCOPYの処理で呼ばれることがある。概要はインタフェースであるaminsertのところをみるとわかる。インデックスアクセスメソッド関数。呼び出しシーケンス(抜粋)はこん…
インデックスの構築のときに呼ばれるbtbuild()について前回のつづき。_bt_leafbuild()から。 _bt_leafbuild() BTWriteStateを作成する。BTWriteStateはどれだけページを割り当てたかとか何番目のページまで書き込んだかを管理する。 tuplesort_performsort()…
インデックスの構築のときに呼ばれるbtbuild()を見てみる。btbuild()はCREATE INDEXとかインデックスの再構築で呼ばれる。概要はインタフェースであるambuildのところをみるとわかる。インデックスアクセスメソッド関数。今回は、CREATE INDEXしたときを確か…
インデックスアクセスメソッドのインタフェース定義というものがあり、インデックスの実装を抽象化している。「select * from pg_am」とすれば、インデックスの種類ごとのインタフェースを実装した関数の名前がわかる。 B-Treeインデックスの場合、次のもの…
Statement#executeUpdate()やStatement#getUpdateCount()でINSERTやUPDATEやDELETEの更新件数がバックエンドでどうつくられフロントエンドに渡ってくるかみてみた。 バックエンド バックエンドは、フロントエンドからのクエリ実行要求を受け付けるexec_execu…
backend/access/nbtree/READMEを読んでもよくわからなかったので先にコードを追うことにした。bt_first()の前半部分はとりあえずとばして後半部分を眺めていたら最初よりはずいぶん見通しが良くなってきた。 index_getnext() IndexScanDesc.xs_ctup.t_self …