4D v15

Optimisations du Select SQL

Accueil

 
4D v15
Optimisations du Select SQL

Optimisations du Select SQL  


 

Introduit dans 4D v14 R4

Les opérations SELECT DISTINCT effectuées via des instructions SQL ont été optimisées lorsqu'elles sont appliquées à une seule table et une seule colonne. 

Typiquement, dans 4D v15 et suivantes, ce code sera exécuté plus rapidement :

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

Les instructions SQL SELECT combinées aux clauses GROUP BY et ORDER BY ont été optimisées dans différentes configurations :

  • SELECT FROM GROUP BY ou SELECT FROM ORDER BY appliqué à une seule table,
  • SELECT FROM GROUP BY ou SELECT FROM ORDER BY appliqué à plusieurs tables et utilisant des jointures internes (inner joins).

Les optimisations concernent uniquement les références de colonnes simples (pas les expressions).

Typiquement, dans 4D v15 et suivantes, les cas décrits ci-dessous seront exécutés plus rapidement :

  • Exemples 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)
 
  // Un exemple simple ORDER BY avec jointure T1 et T2
  // $result contiendra [2, 3].
 Begin SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 End SQL
 
  // ORDER BY fonctionne aussi lorsque plusieurs colonnes sont utilisées.
  // $result1 et $result2 contiendront chacun [2, 3].
 Begin SQL
      SELECT C1, C2
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1, C2
        INTO :$result1, :$result2
 End SQL
 
  // Seules les références de colonnes simples sont optimisées. Si une expression
  // comme ci-dessous (C1 + 1) est utilisée pour la sélection, l'exécution ne sera pas
  // plus rapide. $result contiendra également [3, 4].
 Begin SQL
      SELECT C1 + 1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 End SQL
 
  // Vous pouvez utiliser un indice de référence dans la sélection. Comme évoqué précédemment,
  // la sélection doit uniquement contenir des références de colonnes simples pour une exécution plus rapide.
  // $result contiendra [ 2, 3 ].
 Begin SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY 1
        INTO :$result  
 End SQL

  • Exemple 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)
 
  //Exemple simple de GROUP BY avec jointure T1 et T2.
  //$result contiendra [2, 3]. A noter que rien ne garantit que les groupes seront retournés
  //en ordre croissant, c'est-à-dire $result peut être [3, 2].
 Begin SQL
    SELECT C1
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result  
 End SQL
 
  // Exemple simple de requête agrégée.
  // Comme C3 vaut toujours 1, pour chaque groupe (valeur unique de C1),
  // SUM(C3) est le nombre de répétitions.
  // $result1 contiendra [2, 3].
  // $result2 contiendra aussi [2, 3].
 Begin SQL
    SELECT C1, SUM(C3)
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result1, :$result2
 End SQL

 
PROPRIÉTÉS 

Produit : 4D
Thème : Optimisations

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

4D v15 - Mise à jour (édition standard) ( 4D v15)