ORDER BY 查询
如果投影的 ORDER BY
子句中的列与查询中的列相同,那么您可以提升仅包含 ORDER BY
子句的查询的性能。
如果在 CREATE PROJECTION
语句中定义投影排序顺序,则 Vertica 查询优化器并不一定要在执行特定的 ORDER BY
查询之前对投影数据进行排序。
下面的 sortopt
表中包含 a
、b
、c
和 d
列。投影 sortopt_p
指定按 a
、b
和 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);
根据这一排序顺序,如果 SELECT * FROM sortopt
查询中包含以下 ORDER BY
子句之一,则该查询不必对投影重新排序:
-
ORDER BY a
-
ORDER BY a, b
-
ORDER BY a, b, c
例如,在以下查询中,Vertica 不必对投影重新排序,因为其排序顺序包含了 CREATE PROJECTION..ORDER BY a, b, c
子句中指定的列,该子句镜像了该查询的 ORDER BY a, b, c
子句:
=> 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)
如果在查询中包含 d
列,则 Vertica 必须对投影重新排序,因为列 d
并未在 CREATE PROJECTION..ORDER BY
子句中定义。因此,该 ORDER BY d
查询不会受益于任何排序优化。
您不能在 CREATE PROJECTION 语句的 ORDER BY 子句中指定 ASC 或 DESC 子句。Vertica 总是在物理存储中使用升序排序顺序,因此如果您的查询对其任何列指定了降序顺序,该查询仍然会导致 Vertica 对投影数据重新排序。例如,以下查询需要 Vertica 对结果进行排序:
=> 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)