查看执行
当 Vertica 处理包含视图的查询时,它会将此视图视为子查询。Vertica 通过将查询扩展为包含视图定义中的查询来执行查询。例如,Vertica 会扩展使用视图所示的 myview
视图中的查询,以包含该视图封装的查询,如下所示:
=> SELECT * FROM
(SELECT SUM(annual_income), customer_state FROM public.customer_dimension
WHERE customer_key IN
(SELECT customer_key FROM store.store_sales_fact)
GROUP BY customer_state
ORDER BY customer_state ASC)
AS ship where sum > 2000000000;
视图优化
如果您查询一个视图,而您的查询仅包含该视图中已联接的表子集中的列,那么 Vertica 在执行该查询时会将该视图扩展为仅包含这些表。此优化要求满足以下条件之一:
-
联接列为外键和主键。
-
联接在包含唯一值的列中是左外联接或右外联接。
投影排序顺序
处理视图中的查询时,Vertica 仅考虑位于最外侧查询中的 ORDER BY
子句。如果视图定义包含了 ORDER BY
子句,Vertica 会忽视它。因此,要对视图返回的结果进行排序,您必须在最外侧查询中指定 ORDER BY
子句。
=> SELECT * FROM view‑name ORDER BY view‑column;
注意
一个例外情况是:当视图包含LIMIT
子句时,Vertica 会对视图数据排序。在这种情况下,Vertica 必须先对数据排序才能处理 LIMIT
子句。
例如,以下视图定义包含一个位于 FROM
子查询中的 ORDER BY
子句。
=> CREATE VIEW myview AS SELECT SUM(annual_income), customer_state FROM public.customer_dimension
WHERE customer_key IN
(SELECT customer_key FROM store.store_sales_fact)
GROUP BY customer_state
ORDER BY customer_state ASC;
查询视图时,Vertica 不会对数据排序:
=> SELECT * FROM myview WHERE SUM > 2000000000;
SUM | customer_state
-------------+----------------
5225333668 | MI
2832710696 | TN
14215397659 | TX
4907216137 | CO
2793284639 | MA
3769455689 | CT
3310667307 | IN
2723441590 | AZ
2642551509 | UT
3330524215 | FL
2128169759 | NV
29253817091 | CA
4581840709 | IL
2806150503 | PA
(14 rows)
要返回经过排序的结果,外部查询必须包含 ORDER BY
子句:
=> SELECT * FROM myview WHERE SUM > 2000000000 ORDER BY customer_state ASC;
SUM | customer_state
-------------+----------------
2723441590 | AZ
29253817091 | CA
4907216137 | CO
3769455689 | CT
3330524215 | FL
4581840709 | IL
3310667307 | IN
2793284639 | MA
5225333668 | MI
2128169759 | NV
2806150503 | PA
2832710696 | TN
14215397659 | TX
2642551509 | UT
(14 rows)
运行时错误
如果 Vertica 不需要对生成运行时错误的表达式求值也能响应查询,则可能不会显示运行时错误。
例如,以下查询返回了一个错误,因为 TO_DATE
无法将字符串 F
转换为指定的日期格式:
=> SELECT TO_DATE('F','dd mm yyyy') FROM customer_dimension;
ERROR: Invalid input for DD: "F"
现在使用相同的查询创建一个视图:
=> CREATE VIEW temp AS SELECT TO_DATE('F','dd mm yyyy')
FROM customer_dimension;
CREATE VIEW
在许多情况下,此视图会生成相同的错误消息。例如:
=> SELECT * FROM temp;
ERROR: Invalid input for DD: "F"
但是,如果使用 COUNT
函数查询该视图,Vertica 将返回所需的结果。
=> SELECT COUNT(*) FROM temp;
COUNT
-------
100
(1 row)
此行为会按预期进行。您可以创建包含子查询的视图,而且在这些子查询中,并非每个行都打算用来传递谓词。