4D v15

Otimizações SQL Select

Página Inicial

 
4D v15
Otimizações SQL Select

Otimizações SQL Select  


 

Originalmente introduzido em 4D v14 R4

A partir de 4D v14 R4, as operações SELECT DISTINCT executadas através de instruções SQL foram otimizadas quando se aplicam a uma só tabela e a uma só coluna.

Tipicamente, em 4D v14 R4 e versões posteriores, o seguinte código será executado mais rápido:

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

Originalmente introduzido em 4D v14 R5

As sentenças SQL SELECT com cláusulas GROUP BY e ORDER BY foram otimizadas em diferentes configurações:

  • SELECT FROM GROUP BY SELECT FROM ORDER BY aplicado a uma só tabela,
  • SELECT FROM GROUP BY ou SELECT FROM ORDER BY aplicado a várias tabelas e o uso de combinações internas.


As otimizações concernem unicamente as referências de colunas simples (não expressões).

Tipicamente, em 4D v14 R5 e versões posteriores, os seguintes casos se executarão mais rápido:

  • Exemplos 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)
 
  // Um exemplo simples ORDER BY com T1 e T2.
  // $result conterá [2, 3].
 Begin SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 End SQL
 
  // ORDER BY também funciona se utilizam várias colunas.
  // $result1 e $result2 irão conter cada um [2, 3].
 Begin SQL
      SELECT C1, C2
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1, C2
        INTO :$result1, :$result2
 End SQL
 
  // Só as referências de colunas simples se otimizam. Se uma expressão
  // como é mostrada a continuação (C1 + 1) se utilizar para a seleção, logo a execução não
  // será mais rápida. $result contém [3, 4].
 Begin SQL
      SELECT C1 + 1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY C1
        INTO :$result  
 End SQL
 
  // Pode utilizar um índice de referência na seleção.
  // Como se estabeleceu antes, a seleção só contém referências de colunas simples para uma execução mais rápida.
  // $result conterá [ 2, 3 ].
 Begin SQL
      SELECT C1
        FROM T1, T2
        WHERE C1=C2
        ORDER BY 1
        INTO :$result  
 End SQL

  • Exemplo 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)
 
  //Exemplo simples de GROUP BY com T1 e T2 juntos.
  //$result conterá [2, 3]. Note que não há garantia de que os grupos se devolvam..
  //em ordem ascendente, ou seja, $result pode ser [3, 2].
 Begin SQL
    SELECT C1
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result  
 End SQL
 
  // Este é um exemplo simples de uma petição agregada.
  // Como C3 sempre é 1, para cada grupo (valor único de C1),
  // SUM(C3) é o número de repetições.
  // $result1 conterá [2, 3].
  // $result2 também conterá [2, 3].
 Begin SQL
    SELECT C1, SUM(C3)
        FROM T1, T2
        WHERE C1=C2
        GROUP BY C1
        INTO :$result1, :$result2
 End SQL

 
PROPRIEDADES 

Produto: 4D
Tema: Optimizations

 
HISTÓRIA 

 
ARTICLE USAGE

4D v15 - Update (edição standard) ( 4D v15)