Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SQL-decoupling interface and implementation

SQL-decoupling interface and implementation

2021年12月17日
Oracle Developer Day 2021
データベースへのアクセスに使われ続けるSQLの性質を再確認

SQLはリレーショナル・モデルへのインターフェースとして考案された言語ですが、現在ではそれ以外のドキュメント・モデルやネットワーク・モデルでも使用されるようになりました。それはSQLは他の手続き的言語とは異なる特徴を持っているためです。本セッションではSQLの実行モデルを再確認し、その特徴を活かすアプリケーション開発と、データベース・エンジンの実装にはどのような性質を備えているべきかを解説します。

oracle4engineer

December 20, 2021
Tweet

More Decks by oracle4engineer

Other Decks in Programming

Transcript

  1. 自己紹介 Copyright © 2021, Oracle and/or its affiliates 日本オラクル 日下部

    明 (KUSAKABE Akira) 高可用性技術を中心にOracle Databaseの技術深堀を担当。 著書に「これは使えるOracle新機能活用術 」(翔泳社) Connpass にて “Oracle Database Technology Night”を定期開催しております。 ご興味ある方はぜひ!ご参加ください! https://oracle-code-tokyo-dev.connpass.com/ @akirak00
  2. 入力と出力の対応関係の定義 SQL Copyright © 2021, Oracle and/or its affiliates 出力

    SELECT ename, dname, job, empno, hiredate, loc FROM emp, dept WHERE emp.deptno = dept.deptno ORDER BY ename 何を取り出すかの定義であって、どうやって導出するかのアルゴリズムは記述されていない 入力 論理データ構造
  3. インターフェースとアルゴリズム実装の分離 SQLの結果集合を導出するアルゴリズムは自動生成される Copyright © 2021, Oracle and/or its affiliates 入力

    出力 対応関係の定義 インターフェース SQL実行計画 SQL実行計画探索 アルゴリズム 全体最適化問題 値の分布統計 物理データ構造 ハードウェア・リソース 論理データ構造
  4. 入力 論理データ構造 インターフェースとアルゴリズム実装の分離 SQLの結果集合を導出するアルゴリズムは自動生成される Copyright © 2021, Oracle and/or its

    affiliates 出力 対応関係の定義 インターフェース SQL実行計画 SQL実行計画探索 アルゴリズム 全体最適化問題 値の分布統計 物理データ構造 ハードウェア・リソース アプリケーション開発で 注力すべきところ • 論理データ構造 • クエリー
  5. インターフェースとアルゴリズム実装の分離 データベース・エンジン実装が目指すところ Copyright © 2021, Oracle and/or its affiliates 出力

    対応関係の定義 インターフェース SQL実行計画 SQL実行計画探索 アルゴリズム 全体最適化問題 値の分布統計 物理データ構造 ハードウェア・リソース 論理データ構造の定義と インターフェース(SQL)を変更せずに アルゴリズム実装が改良される 入力 論理データ構造
  6. リレーショナル・モデルの操作からはじまったが、他のモデルでも使用されるようになった SQL - 結果集合の定義 - 宣言型言語 Copyright © 2021, Oracle

    and/or its affiliates 9 データ・モデル • Relational • Text Search • Object Relational • XML • JSON • Spatial • Network • ... ワークロード • オンライン・トランザクション • 分析・集計 • 機械学習 • ...
  7. 性能最適化が異なる オンライン・トランザクション処理 多数のユーザーが少数のデータに同時並行アクセス 分析・集計処理 1つの処理が大量のデータにアクセス 用途が違うとデータへのアクセスの性質が異なる Copyright © 2021, Oracle

    and/or its affiliates 11 • 索引 • 行指向レイアウト • ネステッド・ループ・ジョイン • キャッシュ・メモリー • 並行アクセス制御 • ... • パーティショニング • 列指向レイアウト • ハッシュ・ジョイン • ブルーム・フィルタ • 並列実行 • ...
  8. データ構造を操作する アルゴリズム 物理データ構造 性能最適化が異なる オンライン・トランザクション処理 多数のユーザーが同時並行アクセス 分析・集計処理 1つの処理が大量のデータにアクセス 用途が違うとデータへのアクセスの性質が異なる Copyright

    © 2021, Oracle and/or its affiliates 12 • 索引 • 行指向レイアウト • ネステッド・ループ・ジョイン • キャッシュ・メモリー • 並行アクセス制御 • ... • パーティショニング • 列指向レイアウト • ハッシュ・ジョイン • ブルーム・フィルタ • 並列実行 • ... データへのアクセスの性質が異なる
  9. 少数の行の位置を特定 - オンライン・トランザクション処理 ヒープ表の索引 • すべての索引が行アドレスを指す • プライマリ・キー索引は索引の1つ(対等の関係) • Oracle

    Databaseの標準 クラスタリング索引(索引構成表) • プライマリ・キー索引に残りの列が付属 • 2次索引はプライマリ・キーの値を指す • Oracle Databaseではほぼ使用しない 索引 Copyright © 2021, Oracle and/or its affiliates 14 プライマリ・キー索引 表 値 行アドレス 値 行アドレス 値 行アドレス 他の列の索引 値 行アドレス 値 行アドレス 値 行アドレス プライマリ・キー索引と 一体化した表 2次索引はプライマリ・キーの 値へのポインタ PK値 行データ PK値 行データ PK値 行データ 値 PK値 値 PK値 値 PK値
  10. 多数の行を範囲で特定 - 分析・集計処理 アクセス範囲を限定 • レンジ/リスト・パーティショニング • データ位置を寄せる 並列実行のための均等配分 •

    ハッシュ・パーティショニング • データ位置を均等に分散させる パーティショニング Copyright © 2021, Oracle and/or its affiliates 15 2020/03/01 2020/02/01 2020/01/01 PX PX PX 並列実行プロセス
  11. 表パーティションに閉じた索引 パーティショニングと索引 (1) ローカル・パーティション索引 Copyright © 2021, Oracle and/or its

    affiliates 16 パーティション1 パーティション2 パーティションn SELECT * FROM v1 WHERE partkey1 = val1 表パーティション・キー列 を含むローカル索引 表パーティション・キー列 を含まないローカル索引 SELECT * FROM v1 WHERE secondary_col = val2 表のパーティション・キー列を指定 したときだけ特定のパーティション のみにアクセスを限定 表のパーティション・キー列を指定しな いと全パーティションの探索が必要
  12. 表パーティションをまたがった索引 パーティショニングと索引 (2) グローバル索引 Copyright © 2021, Oracle and/or its

    affiliates 17 パーティション1 パーティション2 パーティションn SELECT * FROM v1 WHERE partkey1 = val1 表パーティション・キー列 を含むローカル索引 表パーティション・キー列 を含まない索引 SELECT * FROM v1 WHERE secondary_col = val2 表のパーティション・キー列を指定 したときだけ特定のパーティション のみにアクセスを限定 表のパーティション・キー列を含まない SQLでも特定の表パーティションにの みアクセス
  13. 大量アクセス系のためのパーティショニングとトランザクション系のための索引のデータ構造の重ね合わせが可能 性質の異なるワークロード向けのデータ構造の重ね合わせ Copyright © 2021, Oracle and/or its affiliates 18

    パーティション1 パーティション2 パーティションn SELECT * FROM t1 WHERE partkey1 BETWEEN val1 and val2 表パーティション・キー列 • パーティション・プルーニング • パーティション・ワイズ結合 表パーティション・キー列 を含まない索引 SELECT * FROM v1 WHERE secondary_col = val2 分析・集計処理系 表のパーティション・キー列は表フル・スキャン時 にパーティション・プルーニングを効かせる列 オンライン・トランザクション処理 表パーティション・キーと関係ない索引設計が可能
  14. データのパーティショニングとクラスタ構成には強い関係がある データの物理構造 • 計算量のオーダーを下げるデータ構造 • パーティショニングしたデータへの索引付け サーバー・クラスタ構成 • 1台の物理サーバーの能力を超える性能 •

    各サーバーが担当するデータ 索引 - パーティショニング - サーバー・クラスタ構成 Copyright © 2021, Oracle and/or its affiliates 19 パーティション1 パーティション2 パーティションn 依存関係
  15. 1台の物理サーバーを超える性能を出す Shared Nothing Architecture • 各DBサーバーは分割されたデータの一部を担当 • 物理データ構造とクラスタ構成が依存 • 分割可能かつ均一なデータ・アクセスを前提とする

    Shared Everything Architecture • 全DBサーバーが全データにアクセス可能 • 物理データ構造とクラスタ構成が独立 • 任意のデータ・アクセスのパターンに対応 データベース・サーバーのクラスタ構成 Copyright © 2021, Oracle and/or its affiliates 20 DBサーバー ストレージ DBサーバー ストレージ
  16. シェアード・ナッシングとシェアード・エブリシングの両方がある Oracle Database Sharding • 各シャードは分割されたデータの一部を担当 • 物理データ構造とクラスタ構成が依存 • シャードに閉じたローカル・パーティション索引のみ

    • 1つのシャード内で処理が完結することを前提とする • オンライン・トランザクション処理向け Oracle Real Application Clusters • 全DBサーバーが全データにアクセス可能 • 物理データ構造とクラスタ構成が独立 • 任意のデータ・アクセスのパターンに対応 • オンライン・トランザクション処理と分析・集計処理両対応 Oracle Databaseのクラスタ構成 Copyright © 2021, Oracle and/or its affiliates 21 DBサーバー ストレージ シャード1 シャード2 シャードn
  17. 1つのシャード内で完結させるのが基本 単一シャード・クエリー • シャーディング・キーでシャードを特定できる • 1つのシャードに接続して実行される • オンライン・トランザクション処理は基本的にこれを想定 マルチ・シャード・クエリー •

    複数シャードにまたがるSQL • シャード・カタログ・データベースに接続して実行される • 集計・分析処理 ShardingでのSQL実行 Copyright © 2021, Oracle and/or its affiliates 22 シャード・カタログ シャード シャード Oracleクライアント Oracleクライアント
  18. 各シャードが持つデータの排他と重複を使い分ける設計が必要 Sharded Table (シャード表) • パーティショニングされた表 • 全シャードが排他的にデータを持つ • 定義はパーティション表とほぼ同じ

    • RANGE • LIST • CONSISTENT HASH • これらの複合(コンポジット・パーティショニング) Duplicated Table (重複表) • パーティショニングできない表 • 全シャードが同じデータを持つ • シャード・カタログが持つデータがレプリケートされる • 高頻度の更新は想定していない 各シャードへのデータのパーティショニング Copyright © 2021, Oracle and/or its affiliates 23 シャード・カタログ シャード シャード 重複 排他
  19. 共有ストレージ・共有メモリー型クラスタ・データベース Oracle Real Application Clusters Copyright © 2021, Oracle and/or

    its affiliates 26 データベース・クライアント ストレージ・ノード • ストレージ・デバイス 全サーバー・ノードは全ストレージにアクセス可能 クライアントはどのサーバーに接続してもよい サーバー・ノード • CPU+メモリー • 全ノードが対等な関係
  20. データ・モデル(スキーマ構造)、トランザクション分離レベルの挙動も同じ シングル・インスタンス構成と同じアクセスが可能 Copyright © 2021, Oracle and/or its affiliates 27

    ストレージ・ノード • ストレージ・デバイス サーバー・ノード • CPU+メモリー • 全ノードが対等な関係 データベース・クライアント クライアントはどのサーバーに接続しても • 同じデータの見え方 • シングル・インスタンス構成と同じトランザクション分離レベル サーバー・ノード間のメモリー 一貫性を全自動で維持
  21. データ・モデル(スキーマ構造)、トランザクション分離レベルの挙動も同じ 全ノードを使用した1つのSQL処理の並列化が可能 Copyright © 2021, Oracle and/or its affiliates 28

    ストレージ・ノード • ストレージ・デバイス サーバー・ノード • CPU+メモリー • 全ノードが対等な関係 データベース・クライアント PX PX PX PX PX PX 並列実行プロセスがデータを 分割して並列処理
  22. Oracle Real Application Clusters ユーザーからは透過的に複数CPUで処理可能 共有メモリー型マルチ・プロセッサ 共有メモリー型マルチ・プロセッサと同じくキャッシュ一貫性を維持 Copyright © 2021,

    Oracle and/or its affiliates 29 ノード1 ノード2 データベース (ストレージ上のファイル群) キャッシュ一貫性 キャッシュ・メモリー キャッシュ・メモリー キャッシュ一貫性 CPU 1 CPU 2 SGA DRAM (メイン・メモリー) SGA (キャッシュ・メモリー) SGA (キャッシュ・メモリー)
  23. Stripe And Mirror Everything (S.A.M.E.) ファイルをエクステントに分割し、 • すべてのストレージ・デバイスに均等に分散する ⇒Stripe •

    複製を異なるストレージ筐体の障害グループ(FAILGROUP)のストレージ・デバイスに配置する ⇒Mirror そしてストレージ・デバイスが増減してもリバランスすることでStripeとMirrorを維持する Automatic Storage Management (ASM)のファイル配置 Copyright © 2021, Oracle and/or its affiliates 30 異なるFAILGLOUPのデバイスにミラーリング すべてのデバイスにストライピング プライマリ・エクステント ASM上のファイル extent extent extent セカンダリ・エクステント(ミラー) ASMエクステント FAILGLOUP 1 FAILGLOUP 2 FAILGLOUP n
  24. アプリケーションからはシングル・インスタンス構成と区別がつかない 高度に抽象化されたアーキテクチャ Copyright © 2021, Oracle and/or its affiliates 31

    ストレージ Real Application Clusters (RAC) • どのノードに接続しても全データにアクセス可能 • トランザクション分離レベルの挙動もシングル・イン スタンス構成と同じ Multitenant Architecture (MTA) • 1つのOracleインスタンスが複数のプラガブル・デー タベースをホスト • プラガブル・データベース間は完全隔離 • Oracleインスタンス内で各PDBにリソース割り当 て Automatic Storage Management (ASM) • 全データを全ストレージ・デバイスに均等配分 • ストレージ筐体障害でも全データ・アクセスを維持 DBサーバー CPU メモリー データベース・クライアント service A Oracle Net Services • Oracleのネットワーク階層 • 「サービス」という抽象概念に接続する
  25. シャード1 シャード2 シャードn ShardingとRACは排他ではない Oracle Database Sharding • 各シャードは分割されたデータの一部を担当 •

    物理データ構造とクラスタ構成が依存 • シャードに閉じたローカル・パーティション索引のみ • 1つのシャード内で処理が完結することを前提とする • オンライン・トランザクション処理向け Oracle Real Application Clusters • 全DBサーバーが全データにアクセス可能 • 物理データ構造とクラスタ構成が独立 • 任意のデータ・アクセスのパターンに対応 • オンライン・トランザクション処理と分析・集計処理両対応 Oracle Databaseのクラスタ構成 Copyright © 2021, Oracle and/or its affiliates 32 DBサーバー ストレージ ※地理分散
  26. 多次元データ構造を1次元に配置 データの物理構造 (2) - ストレージのアクセス量を減らす Copyright © 2021, Oracle and/or

    its affiliates 33 C1 C2 C3 C4 行指向レイアウト 列指向レイアウト 1行を連続配置 1列を連続配置 C1 C2 C3 C4 C1 C2 C3 C4 C1 C2 C3 C4 C1 C2 C3 C4 行指向レイアウトを行指向アクセス 行指向レイアウトを列指向アクセス C1 C1 C1 ・・・ C2 C2 C2 ・・・ C1 C1 C1 ・・・ C2 C2 C2 ・・・ 列指向レイアウトを行指向アクセス 列指向レイアウトを列指向アクセス 表 (多次元の抽象概念)
  27. 行指向レイアウトと列指向レイアウトの両立 ストレージとメモリーのデータの物理レイアウト Copyright © 2021, Oracle and/or its affiliates 34

    メモリー ストレージ 行指向レイアウト 列指向レイアウト 行指向→列指向に変換 • Oracle Database • MySQL HeatWave オンライン・トランザクション処理 分析・集計処理
  28. CPUとメモリー スケール・アップ • 1つのOSのハードウェア・リソースを増設 • 仮想マシンのCPUとメモリー割り当て(シェイプ)を上げる • 多くの場合に仮想マシンの再起動が必要 スケール・アウト •

    物理マシンの増設 • 多くの場合にインスタンス起動/停止が必要 ハードウェア・リソースの抽象化 Copyright © 2021, Oracle and/or its affiliates 36 CPU メモリー 仮想マシン スケール・アップ 仮想マシン コンテナ 仮想マシン コンテナ スケール・アウト
  29. OS 「増やす」と「減らす」の運用は表裏一体 OS環境のスケール・アップ • Intel x86環境は仮想マシンの再起動が必要になる場合 が多い • RISCプロセッサー+Unix環境は動的に増減可能 Oracleインスタンスのスケール・アップ

    • CPUとメモリーの割り当ては動的に増減可能 • CPUとメモリーの動的増減と組み合わせ可能 • あるOS環境のリソースを増やすには別のOS環境のリ ソースを減らせることが必要 Oracle Databaseのスケール・アップ/ダウン Copyright © 2021, Oracle and/or its affiliates 37 CPU メモリー OS1 スケール・アップ CPU メモリー Oracleインスタンス スケール・アップ OS2
  30. CPUとメモリー スケール・アップ • Multitenant Architecture (MTA) • 1つのOracleインスタンスに割り当てたリソース内での各プラ ガブル・データベースへの割り当てを動的に変更可能 スケール・アウト

    • Real Application Clusters (RAC) • CPUとメモリーを割り当てたノードの個数を増やす • 動的にノード数の増減が可能 • データ配分のやり直しが不要 Oracle Databaseのハードウェア・リソースの抽象化 Copyright © 2021, Oracle and/or its affiliates 38 CPU メモリー スケール・アウト スケール・アップ Oracleインスタンス PDB1 PDB2 Oracleインスタンス Oracleインスタンス
  31. すべてのCPUとメモリーの動的リソース変更を組み合わせ可能 Oracle Databaseのハードウェア・リソースの抽象化 Copyright © 2021, Oracle and/or its affiliates

    39 OS OS1 スケール・アップ Oracleインスタンス スケール・アップ OS2 OS環境のリソース割り当て Oracleインスタンスのリソース割り当て スケール・アップ Oracleインスタンス PDB1 PDB2 Oracleインスタンス Oracleインスタンス 1つのOracleインスタンス内の割り当て 複数OracleインスタンスでのRAC構成 スケール・アウト Oracleインスタンス
  32. MTA+RACで通常稼働中にはOracleインスタンスの再起動を極力発生させない スケール・アップ • Multitenant Architecture (MTA) • 1つのOracleインスタンスに割り当てたリソース内での各プラ ガブル・データベースへの割り当てを動的に変更可能 スケール・アウト

    • Real Application Clusters (RAC) • CPUとメモリーを割り当てたノードの個数を増やす • 動的にノード数の増減が可能 • データ配分のやり直しが不要 Oracle Databaseのハードウェア・リソースの抽象化の方向性 Copyright © 2021, Oracle and/or its affiliates 40 スケール・アウト スケール・アップ Oracleインスタンス PDB1 PDB2 Oracleインスタンス PDB1 PDB2
  33. MTA+RACで通常稼働中にはOracleインスタンスの再起動を極力発生させない スケール・アップ • Multitenant Architecture (MTA) • 1つのOracleインスタンスに割り当てたリソース内での各プラ ガブル・データベースへの割り当てを動的に変更可能 スケール・アウト

    • Real Application Clusters (RAC) • CPUとメモリーを割り当てたノードの個数を増やす • 動的にノード数の増減が可能 • データ配分のやり直しが不要 Oracle Databaseのハードウェア・リソースの抽象化の方向性 Copyright © 2021, Oracle and/or its affiliates 41 スケール・アウト スケール・アップ Oracleインスタンス PDB1 PDB2 Oracleインスタンス PDB1 PDB2 ハードウェア・リソースの設計変数が多い • CPU • メモリー • ストレージ • クラスタ・ノード数
  34. Exadataをベースにして高度な抽象化がなされた自律型データベース・サービス Exadata上のプラガブル・データベースが割り当てられる 指定する変数はOCPU数とストレージ容量のみ Oracle Computing Unit (OCPU) • 1 OCPUは1CPU物理コアに相当

    • スケールアップかつスケールアウトを抽象化 • OCPU数に比例したCPU時間 • OCPU数に比例したメモリー容量 • OCPU数に比例したストレージ性能 • 無停止でOCPU数(リソース割り当て)を変更 Oracle Autonomous Database Copyright © 2021, Oracle and/or its affiliates 42
  35. Oracle Computing Unit(OCPU) の1変数にハードウェア・リソースを抽象化 Oracle Autonomous Database Copyright © 2021,

    Oracle and/or its affiliates 43 DBサーバー ストレージ Oracle Computing Unit (OCPU) • 1 OCPUは1CPU物理コアに相当 • スケール・アップかつスケール・アウトを抽象化 • OCPU数に比例したCPU時間 • OCPU数に比例したメモリー容量 • OCPU数に比例したストレージ性能 • 無停止でOCPU数(リソース割り当て)を変更 CPU メモリー Autonomous Databaseインスタンス • 1つのプラガブル・データベースのこと • OCPUに抽象化されたリソース割り当て スケール・アップ スケール・アウト
  36. アプリケーションの意味的な境界(ドメイン)で分割される 分散型アプリケーション Copyright © 2021, Oracle and/or its affiliates 45

    アプリケーション Microservice Microservice Microservice Microservice (マイクロ)サービスの境界 データ・ストアの性質 アプリケーションの意味的な境界
  37. リレーショナル・モデルの操作からはじまったが、他のモデルでも使用されるようになった SQL - 結果集合の定義 - 宣言型言語 (再掲) Copyright © 2021,

    Oracle and/or its affiliates 46 データ・モデル • Relational • Text Search • Object Relational • XML • JSON • Spatial • Network • ... ワークロード • オンライン・トランザクション • 分析・集計 • 機械学習 • ...
  38. サービス分割境界はアプリケーションのドメインによるべき 分散アプリケーションのデータ・ストア Copyright © 2021, Oracle and/or its affiliates 47

    データ・モデル • Relational • Text Search • Object Relational • XML • JSON • Spatial • Network • ... ワークロード • オンライン・トランザクション • 分析・集計 • 機械学習 • ... アプリケーションのドメインが求めるデータ操作
  39. インターフェースとアルゴリズム実装の分離 SQLの結果集合を導出するアルゴリズムは自動生成される(再掲) Copyright © 2021, Oracle and/or its affiliates 入力

    出力 対応関係の定義 インターフェース SQL実行計画 SQL実行計画探索 アルゴリズム 全体最適化問題 値の分布統計 物理データ構造 ハードウェア・リソース 論理データ構造
  40. 入力 論理データ構造 インターフェースとアルゴリズム実装の分離 データベース・エンジン実装の制限事項が アプリケーション設計に逆流しないほうがよい Copyright © 2021, Oracle and/or

    its affiliates 出力 対応関係の定義 インターフェース SQL実行計画 SQL実行計画探索 アルゴリズム 全体最適化問題 値の分布統計 物理データ構造 ハードウェア・リソース データベース・エンジン実装 制限事項 チューニング アプリケーション開発で 注力すべきところ • 論理データ構造 • クエリー
  41. インターフェースとアルゴリズム実装の分離 Oracle Database インターフェース設計が物理データ構造・物理サーバー構成と独立 Copyright © 2021, Oracle and/or its

    affiliates 入力 出力 対応関係の定義 インターフェース 物理データ構造 論理データ構造 パーティション1 パーティション2 パーティションn 物理ハードウェア構成 サーバー ストレージ 索引