我知道如何检查 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)
但这并没有显示物化视图。如何查看它们占用了多少磁盘空间?
根据文档:
CONCURRENTLY 刷新物化视图而不锁定物化视图上的并发选择。(……)
... 其他内容 ...
即使使用此选项,一次也只能针对任何 一个物化视图运行一个 REFRESH。
我有一个函数可以检查 MATERIALIZED VIEW 的上次刷新时间,如果超过 60 秒,它会刷新它。
但是,如果我尝试同时从两个单独的进程刷新物化视图会发生什么?他们会排队还是会引发错误?
有没有办法检测何时刷新 MATERIALIZED VIEW 从而避免触摸它?
目前,我已经在刷新(设置refreshing为true)之前填充表记录,然后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) 我创建了一个以view_table_A外部数据包装表命名的物化视图table_A。我想要的是在每次插入table_A. 我试图用触发器来做到这一点,但没有奏效。
是否可以在不使用触发器的情况下自动刷新物化视图?
我与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) 我有一个带有多个连接的查询,它需要很长时间才能返回一个日期的数据。我已经创建了一个索引视图。在创建视图和索引时,我适当地设置了所有必需的选项。
我想利用索引视图的优势,如果我在其他地方有类似的查询或完全相同的查询,查询优化器会选择索引视图,以便提高性能。我尝试使用用于创建索引的完全相同的查询(带有额外的日期过滤器),但查询计划似乎没有改变。即使我在查询中显式使用视图,视图上的索引仍未使用。我只能让查询优化器使用带有 noexpand 提示的索引。请注意,我使用的是 SQL Server 企业版。
有什么建议?
我一直在研究使用索引视图来提高一些最常用的视图的性能。
然而,索引视图不支持非唯一聚集索引,这与数据库结构的其余部分设置的优先级略有不同。
例如,这是我们几个表的简化版本。
-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 列,因此在放置索引的位置方面我几乎没有选择。
当常规表允许时,为什么视图不允许非唯一聚集索引?
我有一些难以计算的物化视图,我希望能够使用实际存储的数据进行备份和恢复,而不是通过重新计算。
在 PostgreSQL 9.4 中可能吗?
(另一种方法是创建实际表,但它们更难“刷新”)
[我认为这个问题的根本原因是我不了解权限和特权......]
所以,为了设置舞台,我的设置是一个数据库,称之为MyDb。
我有两个用户,spu1和u1,spu1是超级用户,u1是“普通”用户。MyDb的所有者是spu1。我想我还应该说u1具有从组角色继承的创建数据库和创建角色权限。
我有一个架构sch1,它是一个用户定义的架构。
在这个模式中,我有一个表,称为tbl1,还有一个物化视图,称为mvw1。
该TBL1的主人是SPU1,该mvw1的主人是U1。
在当前设置中,如上所述,我无法将mvw1刷新为u1或spu1。我只是得到以下有趣的错误(我已经广泛搜索了它,但没有找到任何可以完全解决我的设置的错误......)。
ERROR: permission denied for relation tbl1
********** Error **********
ERROR: permission denied for relation tbl1
SQL state: 42501
Run Code Online (Sandbox Code Playgroud)
我发现
我试图找出我需要授予普通用户u1缺少的权限(理想情况下所需的最低权限),以便我可以在以他们的身份登录时刷新此视图。
第一个选项虽然很高兴知道,但并不能解决我的问题。第二个选项似乎实际上是在向非超级用户授予超级用户权限,或者授予比我需要的更大的权限。
如果有人可以向我解释这里到底发生了什么(或指出我在解决问题所需的描述中遗漏了哪些信息),并让我知道我的第二个选择是否真的可行或更好的选择? …
postgresql permissions materialized-view errors postgresql-9.3
我正在尝试创建一个索引视图,其中索引位于视图中的一个字段上,该字段是视图中基础表的一堆列的散列。
下面是一个例子:
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
正如标题行所暗示的那样:在具有索引的 VIEW 上使用 ALTER VIEW 语句将在没有警告的情况下从 VIEW 中删除此(所有?)索引。我希望 ALTER VIEW 语句失败,通知我先删除索引。
SQL SERVER 中是否有更改此行为的设置?还是在 SQL 2012 (SP3) 之后的版本中发生了变化?
postgresql ×5
sql-server ×4
index ×2
view ×2
disk-space ×1
errors ×1
permissions ×1
pg-dump ×1
plpgsql ×1