Distributed-dbms-relational-algebra-query-optimization

提供:Dev Guides
移動先:案内検索

クエリ最適化のためのリレーショナル代数

クエリが配置されると、最初にスキャンされ、解析され、検証されます。 次に、クエリツリーやクエリグラフなど、クエリの内部表現が作成されます。 次に、データベーステーブルから結果を取得するための代替実行戦略が考案されました。 クエリ処理に最適な実行戦略を選択するプロセスは、クエリ最適化と呼ばれます。

DDBMSのクエリ最適化の問題

DDBMSでは、クエリの最適化は重要なタスクです。 代替戦略の数は、次の要因により指数関数的に増加する可能性があるため、複雑さは高いです-

  • 多数のフラグメントの存在。
  • さまざまなサイトにわたるフラグメントまたはテーブルの分布。
  • 通信リンクの速度。
  • ローカル処理機能の格差。

したがって、分散システムでは、多くの場合、目的はクエリ処理の最適な実行戦略ではなく、適切な実行戦略を見つけることです。 クエリを実行する時間は、次の合計です-

  • クエリをデータベースに伝達する時間。
  • ローカルクエリフラグメントを実行する時間。
  • さまざまなサイトからデータを収集する時間。
  • 結果をアプリケーションに表示する時間。

クエリ処理

クエリ処理は、クエリの配置からクエリの結果の表示までのすべてのアクティビティのセットです。 手順は、次の図に示すとおりです-

クエリ処理

リレーショナル代数

リレーショナル代数は、リレーショナルデータベースモデルの操作の基本セットを定義します。 一連の関係代数演算は、関係代数式を形成します。 この式の結果は、データベースクエリの結果を表します。

基本的な操作は次のとおりです-

  • 投影
  • 選択
  • 連合
  • 交差点
  • マイナス
  • Join

投影

投影操作では、テーブルのフィールドのサブセットが表示されます。 これにより、テーブルの垂直パーティションが作成されます。

リレーショナル代数の構文

\ pi _ \ {} \ {()}

たとえば、次の学生データベースを考えてみましょう-

学生

*Roll_No*

コース

学期

性別

2

アミット・プラサド

BCA

1

Male

4

ヴァルシャ・ティワリ

BCA

1

女性

5

アシフ・アリ

MCA

2

Male

6

ジョー・ウォレス

MCA

1

Male

8

シヴァニ・アイエンガー

BCA

1

女性

すべての学生の名前とコースを表示したい場合は、次の関係代数式を使用します-

\ pi _ \ {Name、Course} \ {(STUDENT)}

選択

選択操作は、特定の条件を満たすテーブルのタプルのサブセットを表示します。 これにより、テーブルの水平パーティションが作成されます。

リレーショナル代数の構文

\ sigma _ \ {} \ {()}

たとえば、学生テーブルで、MCAコースを選択したすべての学生の詳細を表示する場合、次の関係代数式を使用します-

\ sigma _ \ {Course} = \ {\ small "BCA"} ^ \ {(STUDENT)}

投影操作と選択操作の組み合わせ

ほとんどのクエリでは、投影操作と選択操作の組み合わせが必要です。 これらの式を書くには2つの方法があります-

  • 投影および選択操作のシーケンスを使用します。
  • 名前変更操作を使用して中間結果を生成します。

たとえば、BCAコースのすべての女子学生の名前を表示するには-

  • 射影および選択操作のシーケンスを使用した関係代数式

\ pi _ \ {Name}(\ sigma _ \ {Gender = \ small "Female" AND \:Course = \ small "BCA"} \ {(STUDENT)})

  • 名前変更操作を使用して中間結果を生成する関係代数式

FemaleBCAStudent \ leftarrow \ sigma _ \ {性別= \ small "女性" AND \:コース= \ small "BCA"} \ {(STUDENT)}

Result \ leftarrow \ pi _ \ {Name} \ {(FemaleBCAStudent)}

連合

Pが演算の結果で、Qが別の演算の結果である場合、PとQの和集合($ p \ cup Q $)は、PまたはQのいずれか、または重複のない両方のすべてのタプルのセットです。 。

たとえば、学期1またはBCAコースにいるすべての学生を表示するには-

Sem1Student \ leftarrow \ sigma _ \ {Semester = 1} \ {(STUDENT)}

BCAStudent \ leftarrow \ sigma _ \ {Course = \ small "BCA"} \ {(STUDENT)}

Result \ leftarrow Sem1Student \ cup BCAStudent

交差点

Pが演算の結果で、Qが別の演算の結果である場合、PとQの共通部分($ p \ cap Q $)は、PとQの両方にあるすべてのタプルのセットです。

たとえば、次の2つのスキーマが与えられた-

社員

EmpID Name City Department Salary

プロジェクト

PId City Department Status

プロジェクトが配置され、従業員も居住しているすべての都市の名前を表示するには-

CityEmp \ leftarrow \ pi _ \ {City} \ {(EMPLOYEE)}

CityProject \ leftarrow \ pi _ \ {City} \ {(PROJECT)}

Result \ leftarrow CityEmp \ cap CityProject

マイナス

Pが操作の結果で、Qが別の操作の結果である場合、P-QはQではなくPにあるすべてのタプルのセットです。

たとえば、進行中のプロジェクト(ステータス=進行中のプロジェクト)を持っていないすべての部門を一覧表示するには-

AllDept \ leftarrow \ pi _ \ {Department} \ {(EMPLOYEE)}

ProjectDept \ leftarrow \ pi _ \ {Department}(\ sigma _ \ {Status = \ small "ongoing"} \ {(PROJECT)})

Result \ leftarrow AllDept-ProjectDept

Join

結合操作は、2つの異なるテーブルの関連タプル(クエリの結果)を1つのテーブルに結合します。

たとえば、次のように銀行データベースの顧客と支店の2つのスキーマを考えてください-

顧客

CustID AccNo TypeOfAc BranchID DateOfOpening
  • ブランチ *
BranchID BranchName IFSCcode Address

支店の詳細とともに従業員の詳細をリストするには-

Result \ leftarrow CUSTOMER \ bowtie _ \ {Customer.BranchID = Branch.BranchID} \ {BRANCH}

SQLクエリをリレーショナル代数に変換する

SQLクエリは、最適化の前に同等の関係代数式に変換されます。 クエリは、最初は小さなクエリブロックに分解されます。 これらのブロックは、同等の関係代数式に変換されます。 最適化には、各ブロックの最適化と、クエリ全体の最適化が含まれます。

私たちは次のスキーマを考えてみましょう-

社員

EmpID Name City Department Salary

プロジェクト

PId City Department Status

作品

EmpID PID Hours

例1

平均給与よりも少ない給与を稼ぐすべての従業員の詳細を表示するには、SQLクエリを書きます-

SELECT* FROM EMPLOYEE
WHERE SALARY < ( SELECT AVERAGE(SALARY) FROM EMPLOYEE ) ;

このクエリには、ネストされたサブクエリが1つ含まれています。 したがって、これは2つのブロックに分割できます。

内側のブロックは-

SELECT AVERAGE(SALARY)FROM EMPLOYEE ;

このクエリの結果がAvgSalである場合、外側のブロックは-

SELECT * FROM EMPLOYEE WHERE SALARY < AvgSal;

内部ブロックの関係代数式-

AvgSal \ leftarrow \ Im _ \ {AVERAGE(Salary)} \ {EMPLOYEE}

外ブロックの関係代数式-

\ sigma _ \ {Salary} \ {EMPLOYEE}

例2

従業員「Arun Kumar」のすべてのプロジェクトのプロジェクトIDとステータスを表示するには、SQLクエリを書きます-

SELECT PID, STATUS FROM PROJECT
WHERE PID = ( SELECT FROM WORKS  WHERE EMPID = ( SELECT EMPID FROM EMPLOYEE
            WHERE NAME = 'ARUN KUMAR'));

このクエリには、ネストされた2つのサブクエリが含まれます。 したがって、次のように、3つのブロックに分解することができます-

SELECT EMPID FROM EMPLOYEE WHERE NAME = 'ARUN KUMAR';
SELECT PID FROM WORKS WHERE EMPID = ArunEmpID;
SELECT PID, STATUS FROM PROJECT WHERE PID = ArunPID;

(ここで、ArunEmpIDとArunPIDは内部クエリの結果です)

3つのブロックの関係代数式は-

ArunEmpID \ leftarrow \ pi _ \ {EmpID}(\ sigma _ \ {Name = \ small "Arun Kumar"} \ {(EMPLOYEE)})

ArunPID \ leftarrow \ pi _ \ {PID}(\ sigma _ \ {EmpID = \ small "ArunEmpID"} \ {(WORKS)})

Result \ leftarrow \ pi _ \ {PID、Status}(\ sigma _ \ {PID = \ small "ArunPID"} \ {(PROJECT)})

関係代数演算子の計算

関係代数演算子の計算はさまざまな方法で実行でき、それぞれの選択肢は*アクセスパス*と呼ばれます。

計算の代替は、3つの主な要因に依存します-

  • 演算子の種類
  • 使用可能なメモリ
  • ディスク構造

関係代数演算の実行を実行する時間は、次の合計です-

  • タプルを処理する時間。
  • テーブルのタプルをディスクからメモリにフェッチする時間。

タプルを処理する時間は、特に分散システムでは、ストレージからタプルをフェッチする時間よりも非常に短いため、ディスクアクセスは、関係式のコストを計算するためのメトリックとして非常によく考えられます。

選択の計算

選択操作の計算は、選択条件の複雑さとテーブルの属性のインデックスの可用性に依存します。

以下は、インデックスに応じて計算の選択肢です-

  • インデックスなし-テーブルがソートされておらず、インデックスがない場合、選択プロセスにはテーブルのすべてのディスクブロックのスキャンが含まれます。 各ブロックがメモリに取り込まれ、ブロック内の各タプルが選択条件を満たしているかどうかが調べられます。 条件が満たされると、出力として表示されます。 各タプルがメモリに取り込まれ、各タプルが処理されるため、これは最もコストのかかるアプローチです。
  • * B +ツリーインデックス*-ほとんどのデータベースシステムは、B +ツリーインデックスに基づいて構築されています。 選択条件がこのB +ツリーインデックスのキーであるフィールドに基づいている場合、このインデックスは結果の取得に使用されます。 ただし、複雑な条件を持つ選択ステートメントの処理には、より多くのディスクブロックアクセスが含まれる場合があり、場合によってはテーブルの完全なスキャンが行われます。
  • ハッシュインデックス-ハッシュインデックスが使用され、そのキーフィールドが選択条件で使用される場合、ハッシュインデックスを使用してタプルを取得するのは簡単なプロセスになります。 ハッシュインデックスは、ハッシュ関数を使用して、ハッシュ値に対応するキー値が保存されているバケットのアドレスを検索します。 インデックスでキー値を見つけるために、ハッシュ関数が実行され、バケットアドレスが見つかります。 バケット内のキー値が検索されます。 一致が見つかると、実際のタプルがディスクブロックからメモリにフェッチされます。

結合の計算

2つのテーブル(PとQなど)を結合する場合、Pの各タプルをQの各タプルと比較して、結合条件が満たされているかどうかをテストする必要があります。 条件が満たされると、対応するタプルが連結され、重複フィールドが削除され、結果の関係に追加されます。 したがって、これは最も費用のかかる操作です。

結合を計算するための一般的なアプローチは次のとおりです-

入れ子ループアプローチ

これは、従来の結合アプローチです。 それは、次の擬似コード(タプルtuple_pとtuple_qと結合属性aを持つ表PとQ)を通して説明できます-

For each tuple_p in P
For each tuple_q in Q
If tuple_p.a = tuple_q.a Then
   Concatenate tuple_p and tuple_q and append to Result
End If
Next tuple_q
Next tuple-p

ソートマージアプローチ

このアプローチでは、2つのテーブルが結合属性に基づいて個別にソートされ、ソートされたテーブルがマージされます。 レコードの数が非常に多く、メモリに収容できないため、外部ソート手法が採用されています。 個々のテーブルがソートされると、ソートされた各テーブルが1ページずつメモリに取り込まれ、結合属性に基づいてマージされ、結合されたタプルが書き出されます。

ハッシュ結合アプローチ

このアプローチは、パーティション化フェーズと調査フェーズの2つのフェーズで構成されます。 パーティション化フェーズでは、テーブルPおよびQは2セットの互いに素なパーティションに分割されます。 一般的なハッシュ関数が決定されます。 このハッシュ関数は、タプルをパーティションに割り当てるために使用されます。 調査フェーズでは、Pのパーティション内のタプルがQの対応するパーティションのタプルと比較されます。 それらが一致する場合、それらは書き出されます。