[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
SlideShare a Scribd company logo
https://github.com/kishida/sqlparser
RDBMSの構成
リレーショナルエンジン
今回のデータベース方針
● 勉強用
● 単なる作業はやらない
● リレーショナル処理からはずれることはしない
● リレーショナルエンジンと実行エンジンのみ実装
データベース仕様
● オンメモリ
● シングルスレッド
● 型なし
● JOINはLEFT INNERのみ
● UNIONなし
● サブクエリーなし
Javaでのデータベース
● 言語としてはあんまり向いてない
– ライブラリはあまり使わない
– パターンマッチが欲しい
● ScalaやHaskellのほうがいい
● Erlangもいいかもね
– 並行処理が必要になる
Java SE 8はいい
● ラムダ便利
● Stream使いまくり
– コレクション操作が主
● Optionalのありがたさ
解決策
● パターンマッチは自作
– AST処理で活躍
● lombok
– コンストラクタやtoStringの生成
– http://projectlombok.org/
データベースの寿命は長い
● アプリケーションより寿命が長い
● バージョンの有効期間が短い言語は不向き
● Javaは寿命の長さだけが取り柄
● でも勉強なら好きな言語で
JParsec
● Parserライブラリ
●
外部ツール不要
– JavaCCやANTLRは構文定義が別ファイル
● LL(トップダウン解析)
● Haskelのparsecの移植
●
パーサーコンビネータ
– コンビネータ:引数だけから結果がきまる関数
● 内部DSL
● Java8が便利
●
ただしドキュメントはない
● http://jparsec.codehaus.org/
字句解析
● 文字列からトークン(字句)を抜き出す
– 識別子、文字列、キーワード、コメントなど
● 基本的に正規表現
● 終端記号
● 今回はJParsecで用意されたものを利用
構文解析
● トークン列から構文木をつくる
● トークンの正規表現
● 非終端記号
● パターンに非終端記号を使える
– 終端記号だけ使うなら正規表現
● カッコの入れ子が表現できる
数式解析
● 数式の優先順位決めが面倒
● だいたいLR(ボトムアップ解析)
● 演算子の優先順位を指定すればいい
リレーショナル代数
● SQL≠リレーショナル代数
● 射影:select
● 直積:join
● 選択:where
リレーショナル代数
ストリーム処理
● フィルタ結果を渡していくと非効率
● 一行ずつ処理できるようにする
JOIN処理
● ネストループJOIN
– 結合対象のテーブルで2重ループ
● ソートマージJOIN
● インデックスを使うJOIN
GROUP BY
● グループ化フィールドで並べ替え
● グループ化フィールドとHAVINGで使う項目を追
加で出力
インデックス
● ハッシュインデックス
● ツリーインデックス
● Bツリー
– ブロック単位で扱える
– ロックが効率化しやすい
– データベースに向いてる
最適化
● インデックスの使いどころをさがす
CNF
● Conjunctive Normal Form
● 連言標準形
● andでつないだ形にする
– (id=1 and flag=true) or id=2
– (id=1 or id=2) and (flag=true or id=2)
● id in (1,2) and (flag=true or id=2)
CNF
機械的最適化
● フィルタをなるべく下におろす
インデックスの利用
● いろいろルールを決める
● ルールベース最適化
ルールベース最適化の問題
コストベース最適化
● 統計情報をとる
– 確率的
● 統計情報からコストを計算する
実際は最適化ではない
● 最適なプランは現実的ではない
– 全データでの統計処理がいる
– 時間をかけすぎては意味がない
●
妥当化
– 制限時間時点で最適なもの
トランザクション
● ACID
– ATOMICICY:不可分性
– CONSISTENCY:一貫性
– ISOLATION:独立性
– DURABILITY:永続性
●
ようするに、並行に実行されるひとまとまりの操作
が、順番に実行されたと見えるようにする
MVCC
● トランザクションごとにバージョン番号を振る
データ抽出処理
隔離レベル
今後
● 永続化
● 障害対策
● 外部接続
● 平行化
●
分散化?
永続化
● 処理時にストレージとのやりとりは実装が大変
● 終了時に保存、開始時に読み込み
障害対策
● 更新ログをとる
– WAL(Write Ahead Log)
● 起動時にコミット済みで未保存のデータがあれば
反映させておく
外部接続
● JDBC対応
● TCP/IP接続対応
平行化
● マルチスレッド
– スレッド同期が必要
● ロックが必要
分散化?
● たいへん!

More Related Content

Java8でRDBMS作ったよ