这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

视图

视图是封装一个或多个 SELECT 语句的存储查询。视图在执行时动态访问并计算数据库数据。视图是只读的,可以引用表、临时表和其他视图的任意组合。

您可以使用视图实现以下用途:

  • 出于支持或安全目的,让用户看不到复杂的 SELECT 语句。例如,您可以创建仅显示用户所需的各表中数据的视图,同时隐藏这些表中的敏感数据。

  • 将可能随时间而改变的表结构的详细信息封装在一致的用户界面后。

与投影不同,视图不实体化 — 也就是说,它们不在磁盘上存储数据。因此,存在以下限制:

  • 当底层表数据发生变更时,Vertica 不需要刷新视图数据。但是,访问和计算数据时,视图也会产生一些开销。

  • 视图不支持插入、删除或更新操作。

1 - 创建视图

您可以创建两种类型的视图:

  • CREATE VIEW 会创建一个可以跨所有会话持续存在的视图,直到显式删除了该视图 DROP VIEW

  • CREATE LOCAL TEMPORARY VIEW 会创建一个仅在当前 Vertica 会话期间可供访问且仅可供其创建者访问的视图。当前会话结束时,视图将会自动删除。

创建视图之后,您无法更改它的定义。您可以将它替换为具有相同名称的视图;或者可以删除它,然后对它重新定义。

权限

要创建视图,非超级用户必须具有以下权限:

有关允许用户访问视图的信息,请参阅查看访问权限

2 - 使用视图

视图可用于任何 SQL 查询或子查询的 FROM 子句中。执行期间,Vertica 会在内部将查询中使用的视图名称替换为视图定义中使用的实际查询。

创建视图示例

以下 CREATE VIEW 语句创建 myview 视图,它会将 store.store_sales_fact 表中所列的各个客户的所有收入相加,并按州对结果进行分组:

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

您可以使用此视图查找所有大于 20 亿美元的合并收入:

=> SELECT * FROM myview where sum > 2000000000 ORDER BY sum DESC;
     SUM     | customer_state
-------------+----------------
 29253817091 | CA
 14215397659 | TX
  5225333668 | MI
  4907216137 | CO
  4581840709 | IL
  3769455689 | CT
  3330524215 | FL
  3310667307 | IN
  2832710696 | TN
  2806150503 | PA
  2793284639 | MA
  2723441590 | AZ
  2642551509 | UT
  2128169759 | NV
(14 rows)

启用视图访问

您可以查询自己创建的任何视图。要使其他非超级用户能够访问视图,您必须:

  • 对视图的基表具有 SELECT...WITH GRANT OPTION 权限

  • 授予用户对视图架构的 USAGE 权限

  • 授予用户对视图本身的 SELECT 权限

下面的示例向 user2 授予视图 schema1.view1 的访问权限。

=> GRANT USAGE ON schema schema1 TO user2;
=> GRANT SELECT ON schema1.view1 TO user2;

有关详细信息,请参阅GRANT(视图)

3 - 查看执行

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

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

4 - 管理视图

获取视图信息

您可以查询系统表 VIEWSVIEW_COLUMNS 以获取有关现有视图的信息 — 例如,视图的定义和组成该视图的列的属性。您还可以查询系统表 VIEW_TABLES 以检查与视图相关的依赖关系 — 例如,确定在您删除某个表之前有多少视图引用了该表。

重命名视图

使用 ALTER VIEW 重命名视图。

删除视图

使用 DROP VIEW 删除视图。它仅会删除指定的视图。Vertica 不支持为视图使用 CASCADE 功能,也不检查依赖关系。删除视图会导致引用该视图的所有视图失败。

禁用和重新启用视图

如果您删除由视图引用的表,Vertica 不会删除该视图。但是,尝试从系统表 VIEW_COLUMNS 使用该视图或访问有关它的信息会返回一个错误,指出被引用的表不存在。如果您还原该表,Vertica 还会重新启用该视图。