查看执行

当 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;

例如,以下视图定义包含一个位于 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)

此行为会按预期进行。您可以创建包含子查询的视图,而且在这些子查询中,并非每个行都打算用来传递谓词。