4D v15

SQL Select の最適化

ホーム

 
4D v15
SQL Select の最適化

SQL Select の最適化  


 

4D v14 R4 から導入

SQL宣言を通して実行されたSELECT DICTINCTオペレーションは、単一のテーブルと単一のカラムに対して適用されたときに最適化されるようになりました。

以下のコードなどは、大体の場合、4D v15以降の方が速く実行されるようになりました:

 Begin SQL
    SELECT DISTINCT Names FROM Employees INTO :$Emp;
 End SQL

4D v14 R5 から導入

SQL SELECT宣言のGROUP BY と ORDER BY節が異なる設定において最適化されました:
  • SELECT FROM GROUP BY または SELECT FROM ORDER BY が単一のテーブルに適用されたとき
  • SELECT FROM GROUP BY または SELECT FROM ORDER BY がinner joinsを使用して複数のテーブルに適用されたとき

この最適化が関係するのは、単純な列の参照に関してのみです(式には適用されません)。

4D v15以降では、一般的に、以下の場合において実行速度が速くなります:

  • Order by の例

 Begin SQL
    DROP TABLE IF EXISTS T1;
    DROP TABLE IF EXISTS T2;
    CREATE TABLE T1 (C1 INT);
    CREATE TABLE T2 (C2 INT);
    INSERT INTO T1(C1) VALUES (1);
    INSERT INTO T1(C1) VALUES (2);
    INSERT INTO T1(C1) VALUES (3);
    INSERT INTO T2(C2) VALUES (2);
    INSERT INTO T2(C2) VALUES (3);
 End SQL
 
 ARRAY LONGINT($result;0)
 ARRAY LONGINT($result1;0)
 ARRAY LONGINT($result2;0)
 
  // T1 と T2 を組み合わせたシンプルなORDER BYの例
  // $result には [2, 3]が格納されます
 Begin SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 End SQL
 
  // ORDER BY は複数の列が使用されているときにも使用できます。
  // $result1 と $result2 にはどちらも[2, 3]が格納されます。
 Begin SQL
      SELECT C1, C2
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1, C2
        INTO :$result1, :$result2
 End SQL
 
  // 最適化されるのは単純な列の参照のみです。
  // 以下の様に、(C1 + 1) のような式がセレクションに使用されている場合、
  // 実行速度は速くなりません。$result には[3, 4]が格納されます(ただし値は正確です)。
 Begin SQL
      SELECT C1 + 1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 End SQL
 
  // インデックスを使用してセレクションの内部を参照することもできます。
  // 既に述べられている通り、実行速度が速くなるのはセレクションに入っているのが単純な列の参照のみのときです。
  // $result には[ 2, 3 ]が格納されます。
 Begin SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY 1
        INTO :$result  
 End SQL

  • Group by の例

 Begin SQL
    DROP TABLE IF EXISTS T1;
    DROP TABLE IF EXISTS T2;
    CREATE TABLE T1 (C1 INT, C3 INT);
    CREATE TABLE T2 (C2 INT);
    INSERT INTO T1(C1, C3) VALUES (3, 1);
    INSERT INTO T1(C1, C3) VALUES (1, 1);
    INSERT INTO T1(C1, C3) VALUES (2, 1);
    INSERT INTO T1(C1, C3) VALUES (3, 1);
    INSERT INTO T1(C1, C3) VALUES (2, 1);
    INSERT INTO T1(C1, C3) VALUES (3, 1);
    INSERT INTO T2(C2) VALUES (2);
    INSERT INTO T2(C2) VALUES (3);
 End SQL
 
 ARRAY LONGINT($result;0)
 ARRAY LONGINT($result1;0)
 ARRAY LONGINT($result2;0)
 
  //T1 と T2 を組み合わせたシンプルなGROUP BY の例
  //$result には[2, 3]が格納されます。必ずしもグループが昇順で返されるとは限らない、
  //という点に注意して下さい。つまり、$result の中身は[3, 2]の可能性もあるという事です。
 Begin SQL
    SELECT C1
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result  
 End SQL
 
  // 以下は合計をリクエストするシンプルな例です。
  // C3はそれぞれのグループに対して常に1なので(C1の固有値)、
  // SUM(C3) が繰り返しの回数という事になります。
  // $result1 には[2, 3]が格納されます。
  // $result2 にも [2, 3]が格納されます。
 Begin SQL
    SELECT C1, SUM(C3)
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result1, :$result2
 End SQL

 
プロパティ 

プロダクト: 4D
テーマ: 最適化

 
履歴 

 
ARTICLE USAGE

4D v15 - アップグレードリファレンス(標準版) ( 4D v15)