RadondonDBソースの学習(三)

4048 ワード

1.第4世代言語とは
SQLは典型的な第4世代言語、すなわち4 GLであり、この言語の際立った特徴は、作成者がどのようにするかに注目する必要がなく、システムに私が何がほしいかを教えるだけでよいことである.
4 GLはこのような言語であり、作成者の作成の難しさを大幅に簡略化しているが、実際には、下位層かデータベースの作成者が具体的な実装の詳細を隠してくれている.
例を挙げると、あなたのお母さんはあなたにトマトと卵の炒め物を作るように言ったが、どうすればいいか教えてくれなかった.この時、資料を調べて、野菜を洗うことから炒め物までのすべての過程を見つけて、トマトと卵を炒めて出てきた.
あなたのお母さんにとって、彼女は簡単に命令を出して、結果を得ましたが、彼女も具体的にどのように実現したのか分かりません.具体的な実現の細部はあなたが台所で隠されています.
2.ラドンDBのクエリー・オプティマイザ
キッチンでドアを閉めてやっていることは、データベースがオプティマイザのやっていることをクエリーし、命令を具体的な実行プロセスに分解し、結果をターミナルのお客様に返すことです.
クエリー・オプティマイザの実装を見てみましょう.そのコードはoptimizerパッケージの下にあり、2つのファイルしかありません.
  • optimizer.goこのファイルはインタフェース
  • を宣言した.
  • simple_optimizer.goというファイルは具体的な実装です.

  • まず、インタフェースの実装を見てみましょう.
    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.まとめ
    今日書いたのは本当に楽で、とても巨大なものを勉強し始めたからです.がんばってください.