这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
视图
视图是封装一个或多个 SELECT 语句的存储查询。视图在执行时动态访问并计算数据库数据。视图是只读的,可以引用表、临时表和其他视图的任意组合。
您可以使用视图实现以下用途:
与投影不同,视图不实体化 — 也就是说,它们不在磁盘上存储数据。因此,存在以下限制:
1 - 创建视图
您可以创建两种类型的视图:
创建视图之后,您无法更改它的定义。您可以将它替换为具有相同名称的视图;或者可以删除它,然后对它重新定义。
权限
要创建视图,非超级用户必须具有以下权限:
有关允许用户访问视图的信息,请参阅查看访问权限。
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)
启用视图访问
您可以查询自己创建的任何视图。要使其他非超级用户能够访问视图,您必须:
下面的示例向 user2
授予视图 schema1.view1
的访问权限。
=> GRANT USAGE ON schema schema1 TO user2;
=> GRANT SELECT ON schema1.view1 TO user2;
重要
如果视图引用外部表,您还必须向外部表的架构授予 USAGE 权限。因此,如果 schema1.view1
引用外部表 schema2.extTable1
,您还必须向 schema2
授予 user2
USAGE 权限:
=> GRANT USAGE on schema schema2 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;
注意
一个例外情况是:当视图包含 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)
此行为会按预期进行。您可以创建包含子查询的视图,而且在这些子查询中,并非每个行都打算用来传递谓词。
4 - 管理视图
获取视图信息
您可以查询系统表
VIEWS
和
VIEW_COLUMNS
以获取有关现有视图的信息 — 例如,视图的定义和组成该视图的列的属性。您还可以查询系统表
VIEW_TABLES
以检查与视图相关的依赖关系 — 例如,确定在您删除某个表之前有多少视图引用了该表。
重命名视图
使用
ALTER VIEW
重命名视图。
删除视图
使用
DROP VIEW
删除视图。它仅会删除指定的视图。Vertica 不支持为视图使用 CASCADE
功能,也不检查依赖关系。删除视图会导致引用该视图的所有视图失败。
禁用和重新启用视图
如果您删除由视图引用的表,Vertica 不会删除该视图。但是,尝试从系统表
VIEW_COLUMNS
使用该视图或访问有关它的信息会返回一个错误,指出被引用的表不存在。如果您还原该表,Vertica 还会重新启用该视图。