1.8K Views
July 16, 24
スライド概要
TiDB ソースコード輪読会 #1 TiDBのクエリ実⾏のしくみ PingCAP Developer Advocate 関⼝匡稔 @bohnen
関⼝匡稔 @bohnen PingCAP株式会社 Developer Advocate
⼤事:TiDBはApache 2.0 ライセンスのオープンソースプロジェクトです! Let’s Hack! ※今⽇の発表資料で表⽰されているSQL、 コマンド等は、ことわりがないかぎりは tiup playgroundでの実⾏&結果です TiDB Cloud & TiDB Serverlessだと動かないものが あるかもしれませんのでご注意ください
TiDBのSQL解析プロセス
TiDBのアーキテクチャ 本日の主役! 分散データベースとしての 機能はほぼTiKV + PDが 担っている。 SQLはTiDBで解釈され、⼀ 連のTiKVの呼び出しに変換 される。これを実⾏計画と 呼んでいる。
TiDBでのSQL実⾏概要(SELECT) Copyright © 2023, PingCAP. All rights reserved.
TiDBの実⾏概要 〜 SQL⽂のパース ユーザーが送信したSQLは、 ● MySQLプロトコルレイヤーを通じて認証され ● SQLを取り出してパースされる パースされたSQLは内部形式(AST)に変換され、ここで最適化が⾏われる。
TiDBの実⾏概要 〜 確認⽅法(1) SQL⽂ごとにそれぞれのステップでかかった時間は、TiDB CloudのDiagnostics や、TiDB DashboardのTopSQL/Slow Query などで確認できる
SQL ⽂の解析とコンパイル: Parse トークンに分割 構⽂⽊(AST)を⽣成 ⽂法的にOK Copyright © 2023, PingCAP. All rights reserved.
TiDBの実⾏概要 〜 SQL⽂のパース(補⾜) Lexer/Parserは https://github.com/pingcap/tidb/tree/master/pkg/parser にある。 このソースは単独でMySQLパーサーとして利⽤することが可能 parser.y と hintparser.y を⾒るとTiDBがサポートしているSQL⽂法がわかって (たまに)便利!
SQL ⽂の解析とコンパイル: Compiler 実⾏コストの最適化 Copyright © 2023, PingCAP. All rights reserved.
TiDBの実⾏概要 〜 最適化(1) 最適化は論理最適化と物理最適化の2フェーズで⾏われる 論理最適化は(同じ動きをするように)ASTを書き換えることで⾏われる。 実際に⾏っている主要な最適化は下記に説明あり。 https://docs.pingcap.com/ja/tidbcloud/sql-logical-optimization
TiDBの実⾏概要 〜 最適化(2) 物理最適化は、論理最適化後のLogicalPlanを元に 実際にTiKVにアクセスする計画を検討するフェーズ https://docs.pingcap.com/ja/tidbcloud/sql-physical-optimization 実際にテーブルからデータを取得する際のアルゴリズムを決定する ● ● インデックスの選択 JOIN,SORT,SCANのアルゴリズムの選択
TiDBの実⾏概要 〜 最適化(3) https://docs.pingcap.com/tidb/stable/cost-model
TiDBの実⾏概要 〜 参考⽂献 どうやっているのか? → この輪読会のテーマ? https://www.docswell.com/s/kumagi/KEN NPE-selinger-optimizer 統計情報どう使うのか勉強になります https://www.youtube.com/watch?v=hGwa 6_VXbZc これ⾒てから executor.Executor interface⾒ ると理解しやすかったです 古いけど “Database System Implementation” もおすすめ
TiDBでの確認⽅法: 実⾏計画(1) EXPLAIN [SQL] EXPLAIN ANALYZE [SQL]
TiDBでの確認⽅法: 実⾏計画(2) EXPLAIN format=”dot” graphviz形式で出⼒できる ※出⼒されるのはdot形式の⽂字列 図にして出⼒するにはgraphvizの インストールが必要です
TiDBの実⾏概要 〜 統計情報(1) 最適化を実施する上で各テーブルの⾏数や⾏⻑、値の分布といった情報が 重要となる。 ● ● JOINの際の駆動表(Build)と内部表(Probe) の選択 コスト計算 これらの情報は⾃動的に収集され、オプティマイザに提供される。 https://docs.pingcap.com/ja/tidb/stable/statistics ※ ⼿動でANALYZE TABLE/ANALYZE TABLE INDEXを実⾏することも可能
TiDBの実⾏概要 〜 統計情報(2) 統計情報は次のSHOW⽂にて確認できる。詳細は下記 https://docs.pingcap.com/tidb/stable/statistics SHOW STATS_META 更新行数、行数の確認 SHOW STATS_HISTOGRAMS ヒストグラム情報(個数、 NULL個数、カラム長) SHOW STATS_BUCKETS ヒストグラムのバケット情報(個数、上限値、下限値) SHOW STATS_TOPN 表のカラムの topN情報(値、個数) SHOW ANALYZE STATUS ANALYZEの実行状況確認 SHOW COLUMN_STATS_USAGE カラム統計情報が利用されているか SHOW STATS_HEALTHY 統計情報が古くなっていないか
TiDBの実⾏概要 〜 確認⽅法 TRACE [SQL] TiDBの実⾏トレースを出⼒する。 https://docs.pingcap.com/tidb/stable/sql-statement-trace
Plan replayer 統計情報も含め、実⾏計画を再現するデバッグ‧ツール https://docs.pingcap.com/ja/tidb/stable/sql-plan-replayer PLAN REPLAYER DUMP EXPLAIN sql-statement; で、ファイル名が表⽰されるので、 curl http://127.0.0.1:10080/plan_replayer/dump/<file>.zip のようにしてダウンロードする。 ※ローカルクラスタ、tiup playgroundで利⽤可能 この情報を後に PLAN REPLAYER LOAD すると、実⾏計画が他の環境で確認できる
Plan replayer デバッグ情報 Plan replayerのzipファイル中に は、debug_traceフォルダがあり、 この中に⼊っているjsonファイルに は、実⾏トレースとそのときに利⽤ した統計情報が含まれている (ように⾒える) ソースコードリーディングに活⽤で きるかも?
THANK YOU.