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 :

 Debut SQL
    SELECT DISTINCT Names FROM Employees INTO :$Emp;
 Fin 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

 Debut 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);
 Fin SQL
 
 TABLEAU ENTIER LONG($result;0)
 TABLEAU ENTIER LONG($result1;0)
 TABLEAU ENTIER LONG($result2;0)
 
  // Un exemple simple ORDER BY avec jointure T1 et T2
  // $result contiendra [2, 3].
 Debut SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 Fin SQL
 
  // ORDER BY fonctionne aussi lorsque plusieurs colonnes sont utilisées.
  // $result1 et $result2 contiendront chacun [2, 3].
 Debut SQL
      SELECT C1, C2
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1, C2
        INTO :$result1, :$result2
 Fin 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].
 Debut SQL
      SELECT C1 + 1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 Fin 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 ].
 Debut SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY 1
        INTO :$result  
 Fin SQL

  • Exemple Group by

 Debut 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);
 Fin SQL
 
 TABLEAU ENTIER LONG($result;0)
 TABLEAU ENTIER LONG($result1;0)
 TABLEAU ENTIER LONG($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].
 Debut SQL
    SELECT C1
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result  
 Fin 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].
 Debut SQL
    SELECT C1, SUM(C3)
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result1, :$result2
 Fin SQL

 
PROPRIÉTÉS 

Produit : 4D
Thème : Optimisations
Nom intl. : SQL Select optimizations

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

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