4D v15

Optimierungen bei SQL Select

Home

 
4D v15
Optimierungen bei SQL Select

Optimierungen bei SQL Select  


 

Eingeführt mit 4D v14 R4

Die Operationen mit SELECT DISTINCT wurden optimiert, die in SQL Anweisungen auf eine einzelne Tabelle bzw. eine einzelne Spalte angewendet werden.

Hierzu ein gängiges Beispiel. Der folgende Code wird in 4D v15 und neuer schneller ausgeführt:

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

Eingeführt mit 4D v14 R5

Die SQL SELECT Anweisungen mit GROUP BY und ORDER BY wurden in verschiedenen Konfigurationen optimiert:

  • SELECT FROM GROUP BY oder SELECT FROM ORDER BY für eine einzelne Tabelle,
  • SELECT FROM GROUP BY oder SELECT FROM ORDER BY für mehrere Tabellen und mit "inner joins".

Die Optimierung gilt nur für einfache Spaltenreferenzen, nicht für Ausdrücke.

So wird in 4D v15 und neuer der folgende Code rascher ausgeführt:

  • Nach Beispielen sortieren

 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)
 
  // Ein einfaches Beispiel von ORDER BY mit hinzugefügtem T1 und T2.
  // $result enthält [2, 3].
 Begin SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 End SQL
 
  // ORDER BY funktioniert auch, wenn mehrere Spalten verwendet werden.
  // Sowohl $result1 und $result2 enthalten [2, 3].
 Begin SQL
      SELECT C1, C2
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1, C2
        INTO :$result1, :$result2
 End SQL
 
  // Nur einfache Spaltenreferenzen werden optimiert. Wird ein Ausdruck
  // wie unten gezeigt (C1 + 1), für die Auswahl verwendet, läuft die Ausführung
  // nicht schneller. $result wird (weiterhin korrekt) [3, 4] enthalten.
 Begin SQL
      SELECT C1 + 1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 End SQL
 
  // Für eine Referenz innerhalb der Auswahl können Sie auch einen Index verwenden.
  // Wie bereits erwähnt, darf die Auswahl für schnelles Ausführen nur einfache Spaltenreferenzen enthalten.
  // $result wird [ 2, 3 ] enthalten.
 Begin SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY 1
        INTO :$result  
 End SQL

  • Nach Beispiel gruppieren

 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)
 
  //Ein einfaches Beispiel GROUP BY mit hinzugefügtem T1 und T2.
  //$result wird [2, 3] enthalten. Bitte beachten: Es gibt keine Garantie, dass Gruppen zurückgegeben werden.
  //in aufsteigender Reihenfolge kann $result [3, 2] sein.
 Begin SQL
    SELECT C1
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result  
 End SQL
 
  // Hier ein einfaches Beispiel einer Aggregatsanfrage.
  // Da C3 immer 1 ist, für jede Gruppe (einmaliger Wert C1),
  // SUM(C3) ist die Anzahl der Wiederholungen.
  // $result1 wird [2, 3] enthalten.
  // $result2 wird auch [2, 3] enthalten.
 Begin SQL
    SELECT C1, SUM(C3)
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result1, :$result2
 End SQL

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Optimierungen

 
GESCHICHTE 

 
ARTIKELVERWENDUNG

4D v15 - Upgrade (Standard Edition) ( 4D v15)