我刚刚在 Oracle 中创建了一个物化视图,但意识到我使用了错误的脚本,所以我想再次删除 MVIEW。
MVIEW 是用这样的语句创建的:
create materialized view foobar
refresh start with trunc(sysdate) + 1/8 next sysdate + interval '8' hour
as
select ...
from ...;
Run Code Online (Sandbox Code Playgroud)
创作花了一些时间。
现在在意识到这是我运行的错误脚本之后:
drop materialized view foobar;
Run Code Online (Sandbox Code Playgroud)
这也运行了一段时间。我首先认为这可能是由于某些锁定或其他会话阻止了这一点,但不是:当我查询时,v$session我看到我的drop语句实际上触发了 mview 的完全刷新:
用户名 | SID | 序列号 | 节目 | 状态 | SQL_ID | SQL_TEXT ----------+------+---------+-------------- ----+--------+---------------+------------ -------------------------------------------------- --- 我的用户 | 第294话 29131 | oracle@hostname (J002) | 活跃 | 6snjgrzbtynyc | INSERT /*+ BYPASS_RECURSIVE_CHECK */ INTO "MY_USER"."FOOBAR" select .....
事实上,drop materialized …
我有一个 Access 前端用户界面,它使用最新的 ODBC 驱动程序链接到 postgreSQL 数据库中的表。我可以链接到 postgreSQL 表和视图,但无法访问物化视图。
该线程描述了驱动程序的补丁以包含物化视图。有谁知道这个补丁是否包含在最新的驱动程序中?如果没有,我将如何应用它?如果包含,需要选择哪些选项才能从 MS Access 访问物化视图?
我尝试创建索引视图。我终于有了一个(几乎)符合标准的案例。所有内部联接、极少数非确定性函数(已移至外部视图)和自联接仅位于移至外部视图的两个表中。
问题是仅视图就需要 3 秒以上的时间来编译,这对于用例来说太慢了。遵循这样的建议:
索引视图也是提高 INNER JOINS 性能的好方法。当两个或多个表在索引视图中预联接时,查询优化器可以选择检索物化视图数据,而不是执行昂贵的联接操作。
我正在考虑用索引视图解决问题。
然而,一旦创建了这个索引视图(它包含大约 20 个连接),对基础表的每次更新都会变得非常慢。设置统计 IO On 显示它正在重新访问语句上的所有基础表,这些表在重新评估视图时甚至不修改任何数据,例如如下所示的更新:
update a
set y = b.y, z = b.z
from a inner join b on a.x = b.x
where exists (select a.x, a.y, a.z except select b.x, b.y, b.z)
Run Code Online (Sandbox Code Playgroud)
因此,受影响的行数为零,但整个索引视图及其依赖项仍然会执行一系列操作,并且执行时间会显示这一点。
有没有办法让 SQL Server 不使用该视图,除非它确实需要更新记录?也许有我不知道的暗示。
我先说这是来自 Stack Overflow 上一个未回答问题的交叉帖子。
我这样做并不是为了获得对这个问题的更多看法,我希望 DBA 社区分享他们对这是否可能是 SQL Server 中的错误的看法。我认为 SO 社区没有专业知识来决定这一点,所以我在这里重新发布。
假设我有一个 table T,并且我有一个索引视图V:
CREATE TABLE dbo.T (id int PRIMARY KEY, b bit NOT NULL, txt varchar(20));
GO
CREATE VIEW dbo.V
WITH SCHEMABINDING AS
SELECT T.Id, T.txt
FROM dbo.T AS T
WHERE T.b = 1;
GO
CREATE UNIQUE CLUSTERED INDEX idx_V ON dbo.V (Id);
Run Code Online (Sandbox Code Playgroud)
在这个简单的例子中,它基本上只是一个过滤索引,但它也可以有连接等。
我现在想在Twhere 中选择一些行,这里b = 1的过滤视图非常有用,我在标准上所以必须使用NOEXPAND(或者它对于视图匹配来说太复杂了):
SELECT Id, txt
FROM V WITH (NOEXPAND);
Run Code Online (Sandbox Code Playgroud)
这很好用。
现在我想将这些行更新为某个值。该视图符合可更新条件,因此我可以执行以下操作: …
我有一个相当复杂的查询。我写了两个不同的查询来实现我的目标。第一个是使用 WITH,另一个是使用全局临时表。
第一:
WITH A
(
KNO
..
)
, B
(
KNO
...
)
, C
(
KNO
...
)
SELECT * from
A INNER JOIN B
on A.KNO = B.KNO
INNER JOIN C
on B.KNO = C.KNO
Run Code Online (Sandbox Code Playgroud)
第二个:
Truncate Table tempA;
Truncate Table tempB;
Truncate Table tempC;
INSERT INTO tempA SELECT -- Same select which constructs WITH A
INSERT INTO tempB SELECT -- Same select which constructs WITH B
INSERT INTO tempC SELECT -- Same select which constructs …Run Code Online (Sandbox Code Playgroud) 我正在收集具有关联时间戳的空间点数据。我想创建过去 24 小时内这些数据的视图。因为我是通过 ArcGIS 服务器管道这些空间数据,所以存在与在直视图中管道相关的性能问题(该视图可以轻松包含 100-200k+ 点)。长话短说,为了缓解这些性能问题,我创建了数据的物化视图。但是,我希望此数据每 3 - 4 分钟更新一次。
我的问题是,当我将 current_timestamp 添加到查询时:
SELECT *
FROM points
WHERE timestamp > current_timestamp - interval '24' hour
Run Code Online (Sandbox Code Playgroud)
...这不再可以用作快速刷新。有什么办法可以纠正这个问题,还是总是完全刷新?如果显示,在更新物化视图的性能方面我应该注意什么(同样,这个数据集很容易达到 100-200k 点,每秒添加 3-6 个点)。
我有一个大表,其中包含许多用于预计算聚合的物化视图。新数据每天仅插入一次,因此可以将其视为数据仓库类型系统。
显然,当我查询我的主(非聚合)表时,规划器会使用它认为合适的任何索引。这是否扩展到物化视图?如果我查询主表并且查询涉及聚合,它是否识别出我的物化视图已经具有它需要的值?
我正在使用 PostgreSQL 9.6。
我有一个物化视图来支持跨两个表的全文搜索,我将其称为posts和tags。这些表格很少更新和频繁搜索。
我试图找到一个好的策略来运行REFRESH MATERIALIZED VIEW post_search.
理想的解决方案会是这样的触发器:在任何交易修饰的(或之后)的端部posts,tags和/或posts_tags(连接表),刷新物化视图正好一次。
我怎么能做到这一点?
我有一个生产 postgres 10 数据库。每小时我都会在物化视图上运行“同时刷新物化视图”以重新计算值;每天只添加几个新行。
所有物化视图(及其索引)的大小都在急剧增加。应该是 102 MB 的视图现在是 1700 MB,并且指数也遭受了类似的通货膨胀。并且刷新时间从17秒增加到10分钟。由于视图及其索引的增长,整个数据库大小在最后一天从 4 GB 增长到 21 GB。我无法进行非并发刷新,因为这些视图不断被读取。
运行刷新会触发大量磁盘 I/O。
我不知道是什么导致了这个问题。我启用并配置了 autovacuum。我有 8GB 的内存,work_mem 设置为 256 MB。
我们有一个 SQL Server 数据库,它使用索引视图来有效查询一些定期更改的数据(是的,我知道数据更改时维护索引会产生成本,但在我们的情况下这是非常值得的)。
我的理解是,对视图索引的更改必须像对任何其他表/索引的更改一样进行记录/备份。然而,在我看来,这种日志记录是多余的,因为在发生崩溃时 SQL 可以轻松地从视图定义重建视图索引。
有什么办法可以用 SQL Server 来实现这样的事情吗?
index ×3
oracle ×3
postgresql ×3
sql-server ×3
backup ×1
ddl ×1
fast-refresh ×1
ms-access ×1
odbc ×1
performance ×1
t-sql ×1
update ×1