ORDER BY 查询

如果投影的 ORDER BY 子句中的列与查询中的列相同,那么您可以提升仅包含 ORDER BY 子句的查询的性能。

如果在 CREATE PROJECTION 语句中定义投影排序顺序,则 Vertica 查询优化器并不一定要在执行特定的 ORDER BY 查询之前对投影数据进行排序。

下面的 sortopt 表中包含 abcd 列。投影 sortopt_p 指定按 abc 列排序。

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)

另请参阅

CREATE PROJECTION