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)