PostgreSQL – 物化视图
在 PostgreSQL 中,物化视图是可以物理存储数据的视图。如果需要快速访问数据,通常会选择这些。物化视图缓存复杂查询(需要大量计算和操作)的结果,并进一步支持缓存数据的刷新。物化视图由数据库查询定义,类似于 PostgreSQL 中的视图。
在本文中,我们将详细研究 PostgreSQL 物化视图。
创建物化视图:
以下语句用于在 PostgreSQL 中创建物化视图:
CREATE MATERIALIZED VIEW
现在上面的语句可以用作对数据库的查询,如下所示:
Syntax: CREATE MATERIALIZED VIEW your_view_name
AS
your_query
WITH [NO] DATA;
让我们看看我们在上面的查询中做了什么:
- 首先,我们需要在 CREATE MATERIALIZED VIEW 语句之后指定视图的名称。
- 然后我们在 AS 关键字之后添加我们需要从表中提取的数据的查询。
- 最后,如果要将查询结果加载到物化视图中,请使用 WITH DATA 选项,否则使用 WITH NO DATA 选项。
在本文中,我们将使用示例 DVD 租赁数据库,此处进行了说明,可以通过单击此链接进行下载。
例子:
dvdrental数据库有一个表名为film_category ,其中所有喜剧电影的category_id 都是4。在这个例子中,我们将使用物化视图的概念来过滤数据库中所有喜剧电影的film_id。
CREATE MATERIALIZED VIEW comedy_movie_list
AS
SELECT film_id FROM film_category where category_id=4 WITH DATA
;
该视图包含从 film_category 表中检索到的关于 category_id 为 4 的电影的信息。
现在,如果我们在comedy_movie_list视图中查询数据,如下所示:
SELECT * FROM comedy_movie_list;
输出:
刷新物化视图:
要刷新物化视图,我们使用以下命令:
REFRESH MATERIALIZED VIEW your_view_name;
例子:
这里我们将刷新上面例子中创建的物化视图(comedy_movie_list):
REFRESH MATERIALIZED VIEW comedy_movie_list;
输出:
当您为物化视图刷新数据时,PostgreSQL 会锁定整个表,因此您无法对其查询数据。为避免这种情况,您可以使用 CONCURRENTLY 选项。
REFRESH MATERIALIZED VIEW CONCURRENTLY your_view_name;
请注意,CONCURRENTLY 选项仅在 PostgreSQL 9.4 中可用。
删除物化视图:
要删除物化视图,请使用以下语句:
DROP MATERIALIZED VIEW [ IF EXISTS ] your_view_name;
例子:
在这里,我们将删除在前面的示例中创建的 comedy_movie_list 物化视图:
DROP MATERIALIZED VIEW comedy_movie_list;
输出: