ORDER BY queries
You can improve the performance of queries that contain only ORDER BY
clauses if the columns in a projection's ORDER BY
clause are the same as the columns in the query.
If you define the projection sort order in the CREATE PROJECTION
statement, the Vertica query optimizer does not have to sort projection data before performing certain ORDER BY
queries.
The following table, sortopt
, contains the columns a
, b
, c
, and d
. Projection sortopt_p
specifies to order on columns a
, b
, and c
.
CREATE TABLE sortopt (
a INT NOT NULL,
b INT NOT NULL,
c INT,
d INT
);
CREATE PROJECTION sortopt_p (
a_proj,
b_proj,
c_proj,
d_proj )
AS SELECT * FROM sortopt
ORDER BY a,b,c
UNSEGMENTED ALL NODES;
INSERT INTO sortopt VALUES(5,2,13,84);
INSERT INTO sortopt VALUES(14,22,8,115);
INSERT INTO sortopt VALUES(79,9,401,33);
Based on this sort order, if a SELECT * FROM sortopt
query contains one of the following ORDER BY
clauses, the query does not have to resort the projection:
-
ORDER BY a
-
ORDER BY a, b
-
ORDER BY a, b, c
For example, Vertica does not have to resort the projection in the following query because the sort order includes columns specified in the CREATE PROJECTION..ORDER BY a, b, c
clause, which mirrors the query's ORDER BY a, b, c
clause:
=> SELECT * FROM sortopt ORDER BY a, b, c;
a | b | c | d
----+----+-----+-----
5 | 2 | 13 | 84
14 | 22 | 8 | 115
79 | 9 | 401 | 33
(3 rows)
If you include column d
in the query, Vertica must re-sort the projection data because column d
was not defined in the CREATE PROJECTION..ORDER BY
clause. Therefore, the ORDER BY d
query won't benefit from any sort optimization.
You cannot specify an ASC or DESC clause in the CREATE PROJECTION statement's ORDER BY clause. Vertica always uses an ascending sort order in physical storage, so if your query specifies descending order for any of its columns, the query still causes Vertica to re-sort the projection data. For example, the following query requires Vertica to sort the results:
=> SELECT * FROM sortopt ORDER BY a DESC, b, c;
a | b | c | d
----+----+-----+-----
79 | 9 | 401 | 33
14 | 22 | 8 | 115
5 | 2 | 13 | 84
(3 rows)