Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » クエリ処理 » クエリの最適化と実行 » セマンティック・クエリ変形

 

不要な内部ジョインと外部ジョインの削除

ジョインの削除によるリライト最適化では、問題がない場合はクエリからテーブルが削除され、クエリのジョイン数が減少します。通常、この最適化はプライマリ・キーから外部キーへのジョインまたはプライマリ・キーからプライマリ・キーへのジョインとして定義された内部ジョインに対して適用されます。ジョインの削除による最適化は、外部ジョインで使用されるテーブルにも適用できますが、最適化が有効となる条件はかなり複雑になります。

この最適化では、UPDATE または DELETE WHERE CURRENT を使用して更新可能なテーブルは、削除が適切である場合でも削除されません。このため、クエリのパフォーマンスに悪影響がある可能性があります。ただし、クエリが読み込み専用である場合は、SELECT 文で FOR READ ONLY を指定することで、ジョインの削除が実行されます。メインのクエリ・ブロック内のテーブルが更新可能であっても、サブクエリに現れるテーブルやネストされた派生テーブルは、派生の関係で更新可能ではありません。

要約すると、このリライト最適化が適用されるジョインには 3 つのメイン・カテゴリがあります。

  • ジョインがプライマリ・キーから外部キーへのジョインで、プライマリ・テーブルからのプライマリ・キーのカラムだけがクエリから参照される場合。この場合は、プライマリ・キー・テーブルが更新可能でないと、削除されます。

  • ジョインが同じテーブルの 2 つのインスタンス間におけるプライマリ・キーからプライマリ・キーへのジョインである場合。この場合は、テーブルが更新可能でないと、一方のテーブルが削除されます。

  • ジョインが外部ジョインで、NULL 入力テーブル式に次の性質がある場合。

    • NULL 入力テーブル式は、外部ジョインの保護された側の各ローについて、多くても 1 つのローを返す。

    • NULL 入力テーブル式で生成される式は、外部ジョイン以降のクエリの残りの部分で必要ない。

たとえば、次のクエリでジョインはプライマリ・キーから外部キーへのジョインであり、プライマリ・キー・テーブル Products は削除できます。

SELECT s.ID, s.LineID, p.ID
FROM SalesOrderItems s KEY JOIN Products p
FOR READ ONLY;

クエリは、次のように書き換えられます。

SELECT s.ID, s.LineID, s.ProductID
FROM SalesOrderItems s
WHERE s.ProductID IS NOT NULL
FOR READ ONLY;

2 番目のクエリは、SalesOrderItems テーブルの中で、Products への NULL 外部キーを持つローが結果に現れないため、セマンティック上は 1 番目のクエリと同じです。

次のクエリでは、NULL 入力テーブル式が保護された側のローに対して複数のローを生成できず、かつ LEFT OUTER JOIN を超えて Products のカラムが使用されない場合に、OUTER JOIN を削除できます。

SELECT s.ID, s.LineID
FROM SalesOrderItems s LEFT OUTER JOIN Products p ON p.ID = s.ProductID
WHERE s.Quantity > 5 
FOR READ ONLY;

クエリは、次のように書き換えられます。

SELECT s.ID, s.LineID
FROM SalesOrderItems s  
WHERE s.Quantity > 5 
FOR READ ONLY;