PostgreSQLデータリネージ:ビューとSQLからの列レベルのリネージ

PostgreSQLのデータリネージ これは、PostgreSQLのビュー、CTE、DMLを通してデータがどのように移動するかを示す列レベルのマップです。どのベーステーブルの列が各ビューまたはレポート列にデータを提供し、どの結合、フィルタ、キャスト、集計が途中でデータを変換するかを示します。PostgreSQL独自のカタログは、オブジェクトが互いに依存していることを示しています。 pg_depend ビューがテーブルを参照していることは記録されますが、列がどのように変換されるかについては何も示されていません。真のリネージを構築するには、SQL 自体を解析する必要があり、まさにそれが Gudu SQLFlow 汎用的なANSI文法ではなく、専用のPostgreSQL方言パーサーを使用しています。

30秒で試してみましょう: PostgreSQL クエリまたはビュー定義を貼り付けます 無料のSQLFlow系統可視化ツール さらに、列レベルのインタラクティブな系統図を取得できます。クラウド版には無料プランがあります。

pg_dependが系統に関する質問に答えられない理由

PostgreSQLは、依存関係の記録を綿密に保持します。 pg_dependpg_rewrite 知っておく v_region_収益 参照している間は削除できません v_orders_enriched、 と 情報スキーマ ビューは、ビューがどのテーブルにアクセスするかを公開します。これはオブジェクトレベルの依存関係追跡であり、 ドロップ...カスケード 血統ではなく、安全性が重要だ。

カタログではわからないこと:どの特定の列がフィードしているか 収益、 かどうか 途中で鋳造または集積されたかどうか 状態 結果に表示されずにフィルタリングを行い、ビューが3階層または4階層に重なった場合の完全なパスがどのように見えるかを確認します。「この数値はどこから来たのか?」や「この列を削除すると何が壊れるのか?」といった質問に答えるには、ビュー定義に格納されているSQLテキストから変換ロジックを再構築する必要があります。これは、カタログクエリではなく、解析の問題です。

SQLFlowがPostgreSQLのデータリネージを構築する方法

  1. SQLを取り込む。 クエリの貼り付け、スクリプトファイルのアップロード、JDBC経由でPostgreSQLに接続してDDLを取得して定義を直接表示、またはdbt-on-Postgresプロジェクト用のdbtマニフェストをインポートできます。
  2. PostgreSQL固有の文法で解析します。 SQLFlowは、 汎用SQLパーサー(GSP), a commercial SQL compiler front-end developed since the mid-2000s and validated against roughly 13,600 per-dialect test fixtures. Its PostgreSQL parser handles the dialect’s own constructs — writable CTEs, 挿入...紛争について:: キャスト演算子、継承、パーティショニングDDL、およびそのセマンティックリゾルバーが拡張されます 選択 *CTE、サブクエリ、ビュー定義を通じて列参照を解決し、列の粒度でソースとターゲットの関係を抽出します。
  3. 視覚化してエクスポートします。 出力は、任意の列の上流と下流を追跡できるインタラクティブな図であり、JSON、CSV、PNG形式でエクスポートしたり、REST APIを介してクエリを実行したりできます。

SQLFlow がパーサーを提供する 39 のダイアレクトのうちの 1 つが PostgreSQL です。これには、Postgres ファミリーのエンジンである Greenplum、Amazon Redshift、EDB Postgres も含まれ、それぞれがコア PostgreSQL から系統エンジンにとって重要な点で分岐しているため、独自のパーサーが用意されています。完全な方法論については、 SQLデータリネージツールの概要.

ネストされたビューチェーンをベーステーブルまでたどる

ビュー・オン・ビュー・スタックは、PostgreSQLでロジックが蓄積されるデフォルトの方法であり、手動による系統追跡が不可能になる部分です。2レベルのチェーンを例にとってみましょう。

CREATE VIEW v_orders_enriched AS SELECT o.order_id, o.customer_id, o.amount::numeric(12,2) AS amount, c.region FROM orders o JOIN customers c ON c.customer_id = o.customer_id WHERE o.status = 'shipped'; CREATE VIEW v_region_revenue AS SELECT region, SUM(amount) AS revenue FROM v_orders_enriched GROUP BY region;

SQLFlowに質問する v_region_revenue.revenue これは、以下のものから来ており、完全な連鎖を解決します。 収益和() 以上 v_orders_enriched.amountこれは 数値(12,2) キャスト 注文数この図は、各ホップ(ベーステーブル、中間ビュー、集約)を、単純な推測ではなく、ドリルダウン可能なパスとして示しています。また、単純な読み方では見落としてしまう点も明らかにしています。 注文状況 出力には決して現れないが、すべての収益数値は WHERE o.status = 'shipped' フィルター。SQLFlow はそれを間接的な系統として記録します (詳細は後述)。

同じ解像度はどの深さでも機能します。ビューが 5 レベルの深さまでスタックされ、その半分が 選択 *SQLFlowは、JDBC経由で取得した実際のテーブル定義に基づいてアスタリスクを展開するため、SQLテキストに列名が明記されていない場合でも、列の正確さが維持されます。

汎用パーサーを壊すPostgreSQLの構造

PostgreSQLを「ほぼANSI SQL」として扱うツールは、最も多くのデータフローを扱うステートメントでまさに失敗します。これらはすべて、SQLFlowのPostgreSQL方言パーサーによって処理されます。

構築する家系にとってなぜ重要なのか
書き込み可能な CTE (挿入/更新/削除... 返します)単一のステートメントで読み取りと書き込みの両方が行われます。CTE の DML 出力が外部クエリに供給されます。リネージは変更されたテーブル、 戻る 列と最終目標を1つのグラフにまとめたものです。
挿入...競合が発生した場合は更新するUpsert は、挿入パスと更新パスの 2 つのパスにデータをルーティングします。 除外 擬似テーブル。どちらもターゲットテーブルへの実際の列フローです。
テーブルの継承と宣言的なパーティショニング親テーブルに対するクエリは、暗黙的にその子テーブルも読み取ります。SQLFlowは継承とパーティショニングのDDLを解析し、リネージがパーティションごとに断片化されるのではなく、親レベルで正しく関連付けられるようにします。
連鎖CTEとネストされたビュー列参照は、以前のCTEを参照するCTEを含むすべての中間層を経て、物理的な基底テーブルまで解決されなければなりません。
:: キャストと式列出力列はすべて、適用された関数とキャストを通じてそのソースにマッピングされるため、 どこ 値は 何が起こったのか.

直接的な系譜と間接的な系譜:見落としがちなフィルター列

SQLFlowは区別します 直系の血統 — 出力に物理的に流れ込む列の値 — 間接的(影響)系統 — 列の使用例 どこ 条項、 参加する 条件、そして グループ分け 結果に着地することなく、結果を形作る鍵。上記の例では、 注文数 は直接の血統です 収益; 注文状況 そして両方とも 顧客ID 結合キーは間接的なものです。

図ではこの区別を切り替え可能で、実際の決定に影響を与えます。ドメインを変更する予定がある場合は、 注文状況直接的な系統のみを示す場合、それに依存するものは何もないことを示し、間接的な系統を示す場合は、暗黙のうちにフィルタリングされたすべての収益レポートを表示します。ほとんどの系統ツールは、このタイプの関係をモデル化していません。

1つのクエリからPostgreSQL環境全体まで

複雑なビューチェーンが1つだけなら、SQLFlow Cloudの無料プランで十分です。貼り付け、分析、ドリルダウンできます。それ以上の場合は:

  • データベース全体のスキャン: JDBC経由で接続するか(またはGrabitメタデータ抽出ツールを使用)、すべてのビューとオブジェクト定義を取得して、永続的なリネージリポジトリを構築します。エンタープライズ環境では、100以上のデータベースと100万以上の列からなる環境をバッチスキャンし、増分再スキャンを実行します。
  • カタログ統合: エクスポートアダプタは、列レベルの系統情報をDataHub、Microsoft Purview、およびOpenMetadataにプッシュするため、SQLFlowは既に実行しているカタログの系統情報エンジンとして機能します。
  • エアギャップ環境: SQLFlow オンプレミス お客様のネットワーク内でDockerまたはKubernetes上で動作し、データベースの種類ごとに月額$500または1回限りの$4,800でご利用いただけます。最大2台のサーバーにインストール可能です。SQLテキストがお客様のインフラストラクチャから外部に送信されることはありません。
  • プライバシーを設計段階から考慮する: SQLFlowは、SQLコードとスキーマメタデータの静的解析のみを実行します。テーブルの行を読み取ることはありません。

バージョン8.2.3以降では、結果として得られるグラフを平易な英語でクエリすることもできます。「どのビューが 注文数? — 回答のすべての表と列は、表示される前に分析された系統に対して検証されます。

オープンソースのPostgreSQL系統追跡ツールはどうでしょうか?

オープンソースのパーサー SQL Lineagesqlglot 個々のクエリからテーブルレベルと基本的な列レベルの履歴を抽出するのに非常に優れており、少数のクリーンな SELECT ステートメントであれば、それだけで十分かもしれません。 欠点は、本番環境の PostgreSQL で現れます。 選択 * ビューチェーンを介してライブスキーマメタデータ、書き込み可能なCTE、 紛争について アップサートには方言に完全に準拠した文法が必要です。フィルタや結合キーによる間接的な系統は通常モデル化されません。また、系統を抽出することと、それを数千ものオブジェクトにわたって視覚化、保存、差分比較することは同じではありません。評価を行う場合は、最も深いビュースタックと最も複雑なアップサートの両方を実行し、グラフを比較してください。

お使いの環境で複数のエンジンが混在している場合は、同じパーサーファミリーが同じ出力フォーマットでそれらをカバーします。詳細については、関連ページを参照してください。 MySQLデータリネージ, Redshiftデータの系譜、 と Greenplumのデータ系統または データリネージ知識ベース 概念について。

よくある質問

PostgreSQLにはデータリネージ機能が組み込まれていますか?

いいえ。PostgreSQL はオブジェクトレベルの依存関係を追跡します pg_depend — どのビューがどのテーブルを参照しているか — 整合性の目的で、 ドロップ...カスケード列がどのように変換されるかは記録されません。列レベルのデータ系列は、ビュー定義とスクリプト内の SQL を解析することによって取得する必要があり、これは SQLFlow が行う処理です。

SQLFlowは私のテーブルデータにアクセスする必要がありますか?

いいえ。SQLFlowはSQLコードの静的解析を行い、必要に応じてスキーマメタデータ(テーブルと列の定義)を読み込んで参照を解決します。行を読み取ることはありません。オンプレミス版では、SQLテキストもネットワーク内に留まります。

SQLFlowは、書き込み可能なCTEとON CONFLICT upsertを通じてデータの流れを追跡できますか?

はい。PostgreSQL 方言パーサーは 挿入/更新/削除... 返します 声明と 挿入...競合が発生した場合は更新する挿入と更新の両方の列フローをターゲットテーブルにマッピングします。

パーティション化されたテーブルと継承されたテーブルはどのように処理されますか?

SQLFlowはPostgreSQLの継承と宣言型パーティショニングDDLを解析するため、親テーブルに対するクエリのリネージは、パーティションごとのエッジに分割されるのではなく、親レベルで添付されます。

単一のクエリだけでなく、PostgreSQLデータベース全体のデータリネージを取得するにはどうすればよいですか?

SQLFlowをJDBC経由でデータベースに接続するか、Grabitインジェスターを使用してメタデータを抽出します。SQLFlowはすべてのDDLとビュー定義を取得し、それらをまとめて分析し、永続的で増分更新されるデータリネージリポジトリを維持します。100以上のデータベース規模にも対応可能です。

SQLFlowの料金はいくらですか?

SQLFlow Cloudは無料から始められます。プレミアムアカウントは月額$49.99です。SQLFlow On-Premiseは、選択したデータベースタイプごとに月額$500または$4,800の一括払い、さらにデータベースタイプを追加するごとに月額$100または$1,000の一括払いとなります。

PostgreSQLの系譜を今すぐ辿ってみましょう

無料のビジュアライザーにビュー定義を貼り付けて列レベルのグラフを確認するか、PostgreSQL環境全体のスキャンについてご相談ください。