RadondonDBソースの学習(三)
4048 ワード
1.第4世代言語とは
SQLは典型的な第4世代言語、すなわち4 GLであり、この言語の際立った特徴は、作成者がどのようにするかに注目する必要がなく、システムに私が何がほしいかを教えるだけでよいことである.
4 GLはこのような言語であり、作成者の作成の難しさを大幅に簡略化しているが、実際には、下位層かデータベースの作成者が具体的な実装の詳細を隠してくれている.
例を挙げると、あなたのお母さんはあなたにトマトと卵の炒め物を作るように言ったが、どうすればいいか教えてくれなかった.この時、資料を調べて、野菜を洗うことから炒め物までのすべての過程を見つけて、トマトと卵を炒めて出てきた.
あなたのお母さんにとって、彼女は簡単に命令を出して、結果を得ましたが、彼女も具体的にどのように実現したのか分かりません.具体的な実現の細部はあなたが台所で隠されています.
2.ラドンDBのクエリー・オプティマイザ
キッチンでドアを閉めてやっていることは、データベースがオプティマイザのやっていることをクエリーし、命令を具体的な実行プロセスに分解し、結果をターミナルのお客様に返すことです.
クエリー・オプティマイザの実装を見てみましょう.そのコードはoptimizerパッケージの下にあり、2つのファイルしかありません. optimizer.goこのファイルはインタフェース を宣言した. simple_optimizer.goというファイルは具体的な実装です.
まず、インタフェースの実装を見てみましょう.
このインタフェースから見ると、クエリー・オプティマイザが主に行うことは、クエリー・プラン・ツリーを構築することです.次に、具体的な実装プロセスを見てみましょう.まず、構造体が表示されます.
一般的に、SQLを実行すると、次のような操作が発生します.
Optimizerが新規作成され、計画ツリーが新規作成されます.実際には、実装されたコードです.
ここのnodeに注意してください.これはsqlparserです.Statement、主に遊んでいるのはこれです.
では、クエリー・プラン・ツリーを新規作成できます.
コードも長くなく、全部貼られていますが、実は簡単で、nodeのタイプを判断し、異なるタイプによって異なるplanを確定することです.
今日はガイドだけなので、大まかに見てみましょう.まず、ブランチの計画がどのように作成されているかを見てみましょう.
ここはただ一つの構造体を返すだけで、面白くなくて、レベルのあるところはBuildの中にありますが、コードが長いので、今日は広げて話しません.
懸念を残す.
3.まとめ
今日書いたのは本当に楽で、とても巨大なものを勉強し始めたからです.がんばってください.
SQLは典型的な第4世代言語、すなわち4 GLであり、この言語の際立った特徴は、作成者がどのようにするかに注目する必要がなく、システムに私が何がほしいかを教えるだけでよいことである.
4 GLはこのような言語であり、作成者の作成の難しさを大幅に簡略化しているが、実際には、下位層かデータベースの作成者が具体的な実装の詳細を隠してくれている.
例を挙げると、あなたのお母さんはあなたにトマトと卵の炒め物を作るように言ったが、どうすればいいか教えてくれなかった.この時、資料を調べて、野菜を洗うことから炒め物までのすべての過程を見つけて、トマトと卵を炒めて出てきた.
あなたのお母さんにとって、彼女は簡単に命令を出して、結果を得ましたが、彼女も具体的にどのように実現したのか分かりません.具体的な実現の細部はあなたが台所で隠されています.
2.ラドンDBのクエリー・オプティマイザ
キッチンでドアを閉めてやっていることは、データベースがオプティマイザのやっていることをクエリーし、命令を具体的な実行プロセスに分解し、結果をターミナルのお客様に返すことです.
クエリー・オプティマイザの実装を見てみましょう.そのコードはoptimizerパッケージの下にあり、2つのファイルしかありません.
まず、インタフェースの実装を見てみましょう.
package optimizer
import (
"planner"
)
// Optimizer interface.
type Optimizer interface {
BuildPlanTree() (*planner.PlanTree, error)
}
このインタフェースから見ると、クエリー・オプティマイザが主に行うことは、クエリー・プラン・ツリーを構築することです.次に、具体的な実装プロセスを見てみましょう.まず、構造体が表示されます.
// SimpleOptimizer is a simple optimizer who dispatches the plans
type SimpleOptimizer struct {
log *xlog.Log
database string
query string
node sqlparser.Statement
router *router.Router
}
一般的に、SQLを実行すると、次のような操作が発生します.
optimizer.NewSimpleOptimizer(log, database, query, node, router).BuildPlanTree()
Optimizerが新規作成され、計画ツリーが新規作成されます.実際には、実装されたコードです.
// NewSimpleOptimizer creates the new simple optimizer.
func NewSimpleOptimizer(log *xlog.Log, database string, query string, node sqlparser.Statement, router *router.Router) *SimpleOptimizer {
return &SimpleOptimizer{
log: log,
database: database,
query: query,
node: node,
router: router,
}
}
ここのnodeに注意してください.これはsqlparserです.Statement、主に遊んでいるのはこれです.
では、クエリー・プラン・ツリーを新規作成できます.
// BuildPlanTree used to build plan trees for the query.
func (so *SimpleOptimizer) BuildPlanTree() (*planner.PlanTree, error) {
log := so.log
database := so.database
query := so.query
node := so.node
router := so.router
plans := planner.NewPlanTree()
switch node.(type) {
case *sqlparser.DDL:
node := planner.NewDDLPlan(log, database, query, node.(*sqlparser.DDL), router)
plans.Add(node)
case *sqlparser.Insert:
node := planner.NewInsertPlan(log, database, query, node.(*sqlparser.Insert), router)
plans.Add(node)
case *sqlparser.Delete:
node := planner.NewDeletePlan(log, database, query, node.(*sqlparser.Delete), router)
plans.Add(node)
case *sqlparser.Update:
node := planner.NewUpdatePlan(log, database, query, node.(*sqlparser.Update), router)
plans.Add(node)
case *sqlparser.Select:
nod := node.(*sqlparser.Select)
selectNode := planner.NewSelectPlan(log, database, query, nod, router)
plans.Add(selectNode)
case *sqlparser.Checksum:
node := planner.NewOthersPlan(log, database, query, node, router)
plans.Add(node)
default:
return nil, errors.Errorf("optimizer.unsupported.query.type[%+v]", node)
}
// Build plantree.
if err := plans.Build(); err != nil {
return nil, err
}
return plans, nil
}
コードも長くなく、全部貼られていますが、実は簡単で、nodeのタイプを判断し、異なるタイプによって異なるplanを確定することです.
今日はガイドだけなので、大まかに見てみましょう.まず、ブランチの計画がどのように作成されているかを見てみましょう.
// NewInsertPlan used to create InsertPlan
func NewInsertPlan(log *xlog.Log, database string, query string, node *sqlparser.Insert, router *router.Router) *InsertPlan {
return &InsertPlan{
log: log,
node: node,
router: router,
database: database,
RawQuery: query,
Typ: PlanTypeInsert,
Querys: make([]xcontext.QueryTuple, 0, 16),
}
}
ここはただ一つの構造体を返すだけで、面白くなくて、レベルのあるところはBuildの中にありますが、コードが長いので、今日は広げて話しません.
懸念を残す.
3.まとめ
今日書いたのは本当に楽で、とても巨大なものを勉強し始めたからです.がんばってください.