4D v14 R4 から導入
SQL宣言を通して実行されたSELECT DICTINCTオペレーションは、単一のテーブルと単一のカラムに対して適用されたときに最適化されるようになりました。
以下のコードなどは、大体の場合、4D v15以降の方が速く実行されるようになりました:
Begin SQL
SELECT DISTINCT Names FROM Employees INTO :$Emp;
End SQL
4D v14 R5 から導入
SQL SELECT宣言のGROUP BY と ORDER BY節が異なる設定において最適化されました:
- SELECT FROM GROUP BY または SELECT FROM ORDER BY が単一のテーブルに適用されたとき
- SELECT FROM GROUP BY または SELECT FROM ORDER BY がinner joinsを使用して複数のテーブルに適用されたとき
この最適化が関係するのは、単純な列の参照に関してのみです(式には適用されません)。
4D v15以降では、一般的に、以下の場合において実行速度が速くなります:
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)
Begin SQL
SELECT C1
FROM T1, T2
WHERE C1=C2
ORDER BY C1
INTO :$result
End SQL
Begin SQL
SELECT C1, C2
FROM T1, T2
WHERE C1=C2
ORDER BY C1, C2
INTO :$result1, :$result2
End SQL
Begin SQL
SELECT C1 + 1
FROM T1, T2
WHERE C1=C2
ORDER BY C1
INTO :$result
End SQL
Begin SQL
SELECT C1
FROM T1, T2
WHERE C1=C2
ORDER BY 1
INTO :$result
End SQL
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)
Begin SQL
SELECT C1
FROM T1, T2
WHERE C1=C2
GROUP BY C1
INTO :$result
End SQL
Begin SQL
SELECT C1, SUM(C3)
FROM T1, T2
WHERE C1=C2
GROUP BY C1
INTO :$result1, :$result2
End SQL