标签: materialized-view

Postgres:检查物化视图占用的磁盘空间?

我知道如何检查 Postgres 中索引和表的大小(我使用的是 9.4 版):

SELECT
   relname AS objectname,
   relkind AS objecttype,
   reltuples AS "#entries", pg_size_pretty(relpages::bigint*8*1024) AS size
   FROM pg_class
   WHERE relpages >= 8
   ORDER BY relpages DESC;
Run Code Online (Sandbox Code Playgroud)

但这并没有显示物化视图。如何查看它们占用了多少磁盘空间?

postgresql database-size materialized-view disk-space

16
推荐指数
1
解决办法
8246
查看次数

如果两个进程同时尝试刷新实体化视图会发生什么?

根据文档:

CONCURRENTLY 刷新物化视图而不锁定物化视图上的并发选择。(……)

... 其他内容 ...

即使使用此选项,一次也只能针对任何 一个物化视图运行一个 REFRESH

一个函数可以检查 MATERIALIZED VIEW 的上次刷新时间,如果超过 60 秒,它会刷新它。

但是,如果我尝试同时从两个单独的进程刷新物化视图会发生什么?他们会排队还是会引发错误?

有没有办法检测何时刷新 MATERIALIZED VIEW 从​​而避免触摸它?

目前,我已经在刷新(设置refreshingtrue)之前填充表记录,然后false在过程完成时将其设置为。

EXECUTE 'INSERT INTO refresh_status (last_update, refreshing) 
         VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id;
EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view';
EXECUTE 'UPDATE refresh_status SET refreshing=false WHERE id=$1' USING refresh_id;
Run Code Online (Sandbox Code Playgroud)

然后,每当我调用此过程时,我都会检查最新的last_update及其refreshing值。如果refreshing为 true,则不要尝试刷新物化视图。

EXECUTE 'SELECT 
           extract(epoch FROM now() - (last_update))::integer, 
           refreshing
         FROM refresh_status
         ORDER BY …
Run Code Online (Sandbox Code Playgroud)

postgresql materialized-view plpgsql

15
推荐指数
2
解决办法
8064
查看次数

不使用触发器自动刷新 PostgreSQL 物化视图

我创建了一个以view_table_A外部数据包装表命名的物化视图table_A。我想要的是在每次插入table_A. 我试图用触发器来做到这一点,但没有奏效。

是否可以在不使用触发器的情况下自动刷新物化视图?

postgresql materialized-view postgresql-9.5

13
推荐指数
1
解决办法
2万
查看次数

为什么在 Oracle 11gR2 中我不能删除创建它的同一用户的物化视图?

我与DI_TEST_AL用户一起创建了一个物化视图,让我们将其命名为MY_MVIEW. 它在USER_OBJECTS表中显示为MATERIALIZED VIEW,我尝试删除它,我收到一条成功消息,但该对象仍然存在。事实上,如果我尝试重新创建它,我会收到“对象已经存在”之类的错误。

我看到有一个同名的表属于另一个模式。我认为这不应该导致问题,但我想提一下。

这是 SQL*Plus 输出:

SQL*Plus: Release 11.2.0.1.0 Production on Mon Aug 1 17:01:50 2011

SQL> select object_name, object_type, owner from all_objects where object_name = 'MY_MVIEW';  
OBJECT_NAME OBJECT_TYPE       OWNER
----------- ----------------- ----------
MY_MVIEW    MATERIALIZED VIEW DI_TEST_AL
MY_MVIEW    TABLE             DIDEV11

SQL> DROP MATERIALIZED VIEW MY_MVIEW;
Materialized view dropped.

SQL> select object_name, object_type, owner from all_objects where object_name = 'MY_MVIEW';
OBJECT_NAME OBJECT_TYPE       OWNER
----------- ----------------- ----------
MY_MVIEW    MATERIALIZED VIEW DI_TEST_AL
MY_MVIEW    TABLE …
Run Code Online (Sandbox Code Playgroud)

oracle-11g-r2 materialized-view

12
推荐指数
1
解决办法
2万
查看次数

未使用索引视图 - SQL Server

我有一个带有多个连接的查询,它需要很长时间才能返回一个日期的数据。我已经创建了一个索引视图。在创建视图和索引时,我适当地设置了所有必需的选项。

我想利用索引视图的优势,如果我在其他地方有类似的查询或完全相同的查询,查询优化器会选择索引视图,以便提高性能。我尝试使用用于创建索引的完全相同的查询(带有额外的日期过滤器),但查询计划似乎没有改变。即使我在查询中显式使用视图,视图上的索引仍未使用。我只能让查询优化器使用带有 noexpand 提示的索引。请注意,我使用的是 SQL Server 企业版。

有什么建议?

index sql-server view materialized-view

12
推荐指数
1
解决办法
3873
查看次数

为什么索引视图不允许非唯一聚集索引?

我一直在研究使用索引视图来提高一些最常用的视图的性能。

然而,索引视图不支持非唯一聚集索引,这与数据库结构的其余部分设置的优先级略有不同。

例如,这是我们几个表的简化版本。

-Groups-
Group ID    GroupName

-Users-
UserKey    UserName    FullName     GroupID
Run Code Online (Sandbox Code Playgroud)

索引位于 Groups.GroupID(非集群)和 Users.GroupID(集群)上。聚集键位于用户表中的 GroupID 上,因为最常见的是将检索来自特定组的用户范围。显然每个组会有多个用户,所以这个聚集索引是非唯一的。

这让我有点不确定在索引我的视图(例如这个例子)时如何遵循这个优先级,因为我不能有一个非唯一的聚集索引。

ConsumableID    ConsumableVariantID AllowThresholdOverwrite FullPath    GroupID ManufacturerID  Type    ModelID
101              29                 1                       0.1.2.4.    4       3               3       2
Run Code Online (Sandbox Code Playgroud)

实际上,此视图上唯一始终唯一的值是 ConsumableID 列,因此在放置索引的位置方面我几乎没有选择。

当常规表允许时,为什么视图不允许非唯一聚集索引?

sql-server clustered-index materialized-view

12
推荐指数
1
解决办法
1万
查看次数

是否可以使用其数据备份和恢复物化视图?

我有一些难以计算的物化视图,我希望能够使用实际存储的数据进行备份和恢复,而不是通过重新计算。

在 PostgreSQL 9.4 中可能吗?

(另一种方法是创建实际表,但它们更难“刷新”)

postgresql materialized-view pg-dump

12
推荐指数
1
解决办法
5919
查看次数

PostgreSQL 9.3.13,如何刷新不同用户的物化视图?

[我认为这个问题的根本原因是我不了解权限和特权......]

所以,为了设置舞台,我的设置是一个数据库,称之为MyDb

我有两个用户,spu1u1spu1是超级用户,u1是“普通”用户。MyDb的所有者是spu1。我想我还应该说u1具有从组角色继承的创建数据库和创建角色权限。

我有一个架构sch1,它是一个用户定义的架构。

在这个模式中,我有一个表,称为tbl1,还有一个物化视图,称为mvw1

TBL1的主人是SPU1,该mvw1的主人是U1


问题:

在当前设置中,如上所述,我无法将mvw1刷新为u1spu1。我只是得到以下有趣的错误(我已经广泛搜索了它,但没有找到任何可以完全解决我的设置的错误......)。

ERROR:  permission denied for relation tbl1
********** Error **********

ERROR: permission denied for relation tbl1
SQL state: 42501
Run Code Online (Sandbox Code Playgroud)

我发现

  1. 更改所有者mvw1SPU1,让我刷新为SPU1
  2. 运行下面的命令允许我将mvw1刷新为u1

我试图找出我需要授予普通用户u1缺少的权限(理想情况下所需的最低权限),以便我可以在以他们的身份登录时刷新此视图。

第一个选项虽然很高兴知道,但并不能解决我的问题。第二个选项似乎实际上是在向非超级用户授予超级用户权限,或者授予比我需要的更大的权限。

如果有人可以向我解释这里到底发生了什么(或指出我在解决问题所需的描述中遗漏了哪些信息),并让我知道我的第二个选择是否真的可行或更好的选择? …

postgresql permissions materialized-view errors postgresql-9.3

12
推荐指数
3
解决办法
1万
查看次数

为什么将 DATE 字段转换为非确定性的 VARCHAR 数据类型,有没有办法使其具有确定性?

我正在尝试创建一个索引视图,其中索引位于视图中的一个字段上,该字段是视图中基础表的一堆列的散列。

下面是一个例子:

CREATE VIEW CoolHashedView WITH SCHEMABINDING AS

    SELECT 
        KeyId,
        CONVERT
        (
            VARCHAR(34), 
            HASHBYTES('MD5', TextColumn1 + '||' + TextColumn2 + '||' + CAST(DateColumn1 AS VARCHAR(50)), 
            2
        ) AS HashedData
    FROM dbo.BoringTable;

    CREATE UNIQUE CLUSTERED INDEX IX_CoolHashedView_KeyId_HashedData ON CoolHashedView (KeyId, HashedData);
Run Code Online (Sandbox Code Playgroud)

当我尝试创建上述索引时,它失败并抛出以下错误:

消息 2729,级别 16,状态 1,第 26 行视图“CoolHashedView”中的列“HashedData”不能用于索引或统计信息或作为分区键,因为它是不确定的。

当我从 HASHBYTEs 函数中删除日期字段时,聚集索引然后成功创建。

我的猜测是它与格式化日期或不同时区的不同方式有关?...我变得更暖和了吗?

sql-server clustered-index materialized-view sql-server-2016 non-deterministic

12
推荐指数
1
解决办法
2052
查看次数

ALTER VIEW 从​​视图中删除索引

正如标题行所暗示的那样:在具有索引的 VIEW 上使用 ALTER VIEW 语句将在没有警告的情况下从 VIEW 中删除此(所有?)索引。我希望 ALTER VIEW 语句失败,通知我先删除索引。

SQL SERVER 中是否有更改此行为的设置?还是在 SQL 2012 (SP3) 之后的版本中发生了变化?

index sql-server view materialized-view sql-server-2012

12
推荐指数
2
解决办法
721
查看次数