4D v15

Optimizaciones del Select SQL

Inicio

 
4D v15
Optimizaciones del Select SQL

Optimizaciones del Select SQL  


 

Introducido en 4D v14 R4

Las operaciones SELECT DISTINCT ejecutadas a través de instrucciones SQL se han optimizado cuando se aplican a una sola tabla y a una sola columna.

Típicamente, en 4D v15 y versiones posteriores, el siguiente código se ejecutará más rápido:

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

Introducido en 4D v14 R5

Las instrucciones SQL SELECT con cláusulas GROUP BY y ORDER BY han sido optimizadas en diferentes configuraciones:

  • SELECT FROM GROUP BY o SELECT FROM ORDER BY aplicado a una sola tabla,
  • SELECT FROM GROUP BY o SELECT FROM ORDER BY aplicado a varias tablas y el uso de combinaciones internas.


Las optimizaciones conciernen únicamente a las referencias de columnas simples (no expresiones).

Típicamente, en 4D v15 y versiones posteriores, los siguientes casos se ejecutarán más rápido:

  • Ejemplos 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 ejemplo simple ORDER BY con T1 y T2.
  // $result contendrá [2, 3].
 Begin SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 End SQL
 
  // ORDER BY también funciona si se utilizan varias columnas.
  // $result1 y $result2 contendrán cada uno [2, 3].
 Begin SQL
      SELECT C1, C2
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1, C2
        INTO :$result1, :$result2
 End SQL
 
  // Sólo las referencias de columnas simples se optimizan. Si una expresión
  // como se muestra a continuación (C1 + 1) si se utiliza para la selección, luego la ejecución no
  // será más rápida. $result contiene [3, 4].
 Begin SQL
      SELECT C1 + 1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 End SQL
 
  // Puede utilizar un índice de referencia en la selección.
  // Como se estableció antes, la selección sólo contiene referencias de columnas simples para una ejecución más rápida.
  // $result contendrá [ 2, 3 ].
 Begin SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY 1
        INTO :$result  
 End SQL

  • Ejemplo 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)
 
  //Ejemplo simple de GROUP BY con T1 y T2 juntos.
  //$result contendrá [2, 3]. Note que no hay garantía de que los grupos se devuelvan..
  //en orden ascendente, es decir, $result puede ser [3, 2].
 Begin SQL
    SELECT C1
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result  
 End SQL
 
  // Este es un ejemplo simple de una petición agregada.
  // Como C3 siempre es 1, para cada grupo (valor único de C1),
  // SUM(C3) es el número de repeticiones.
  // $result1 contendrá [2, 3].
  // $result2 también contendrá [2, 3].
 Begin SQL
    SELECT C1, SUM(C3)
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result1, :$result2
 End SQL

 
PROPIEDADES 

Producto: 4D
Tema: Optimizations

 
HISTORIA 

 
ARTICLE USAGE

4D v15 - Actualización (standard edition) ( 4D v15)