分析函数中 NULL 值的运行时排序
通过认真编写查询或创建设计(或同时开展这两项工作),您可以帮助 Vertica 查询优化器在执行分析函数时跳过对表中的所有列进行排序这项操作,从而提升查询性能。
要最大程度降低 Vertica 在查询执行期间对投影进行排序的需要,请重新定义 employee
表并指定排序字段不允许出现 NULL 值:
=> DROP TABLE employee CASCADE;
=> CREATE TABLE employee
(empno INT,
deptno INT NOT NULL,
sal INT NOT NULL);
CREATE TABLE
=> CREATE PROJECTION employee_p AS
SELECT * FROM employee
ORDER BY deptno, sal;
CREATE PROJECTION
=> INSERT INTO employee VALUES(101,10,50000);
=> INSERT INTO employee VALUES(103,10,43000);
=> INSERT INTO employee VALUES(104,10,45000);
=> INSERT INTO employee VALUES(105,20,97000);
=> INSERT INTO employee VALUES(108,20,33000);
=> INSERT INTO employee VALUES(109,20,51000);
=> COMMIT;
COMMIT
=> SELECT * FROM employee;
empno | deptno | sal
-------+--------+-------
101 | 10 | 50000
103 | 10 | 43000
104 | 10 | 45000
105 | 20 | 97000
108 | 20 | 33000
109 | 20 | 51000
(6 rows)
=> SELECT deptno, sal, empno, RANK() OVER
(PARTITION BY deptno ORDER BY sal)
FROM employee;
deptno | sal | empno | ?column?
--------+-------+-------+----------
10 | 43000 | 103 | 1
10 | 45000 | 104 | 2
10 | 50000 | 101 | 3
20 | 33000 | 108 | 1
20 | 51000 | 109 | 2
20 | 97000 | 105 | 3
(6 rows)
提示
在执行分析计算的查询中,如果不在意 NULL 的位置,或者您知道列中不包含 NULL 值,请NULLS AUTO
在查询中.
指定 Vertica 会尝试选择有助于实现最快性能的位置。否则,请指定 NULLS FIRST
或 NULLS LAST
。