运行后ANALYZE myview;,我们是否应该在 PostgreSQL 9.6+ 物化视图上运行REFRESH MATERIALIZED VIEW CONCURRENTLY myview;?
或者它没有用(也许索引统计信息已经在刷新时更新了?)
嗨,我们正在 Amazon RDS 中运行一个 PostgreSQL 9.6 数据库,使用 m4.large(2cpu 8gb) 和 1000 的预置 IOPS。用例如下:我们有一个包含数百万个注册表(或多或少 4M)的表和我们创建了一个物化视图,其中包含该表的一个子集 (2M aprox),更改了一些列类型以提高查询效率。我们的 pg_conf 没有改变,是 RDS Postgres 的默认设置。
这是我们的视图定义:
CREATE MATERIALIZED VIEW public.customers_mv as
SELECT
id,
gender,
contact_info,
location,
social,
categories,
(social ->> 'follower_count')::integer AS social_follower_count,
(social ->> 'following_count')::integer AS social_following_count,
(social ->> 'peemv')::float AS social_emv,
(social ->> 'engagement')::float AS social_engagement,
(social ->> 'v')::boolean AS social_validated,
search_vector,
flags,
to_tsvector('english',concat_ws(' ','aal0_'||(customers.location ->> 'aal0'),
'aal1_'||(customers.location ->> 'aal1'),
'aal2_'||(customers.location ->> 'aal2'),
'frequent_location_aal0_'||(customers.location -> 'frequent_location' ->> 'aal0'),
'frequent_location_aal1_'||(customers.location -> 'frequent_location' ->> …Run Code Online (Sandbox Code Playgroud) 我使用备份还原技术和一组传输后操作(如DBCC UPDATEUSAGE或)将数据库从 SQL Server 2008R2 迁移到 SQL Server 2019(均为企业版)UPDATE STATISTICS XXX。
在统计更新时,我收到以下错误:
Msg 402, Level 16, State 1, Procedure ZZZZ, Line 5 [Batch Start Line 0]
The data types datetime and time are incompatible in the add operator.
Msg 4413, Level 16, State 1, Line 1
Could not use view or function 'ZZZZ' because of binding errors.
Run Code Online (Sandbox Code Playgroud)
我知道该消息非常明确(在 2008R2 上语法正确的视图在 2019 年不再适用)。我不明白为什么定义的视图WITH SCHEMABINDING无效会阻止更新基础表上的统计信息。
此外,在使用WHERE子句查询基础表时,我收到相同的错误消息,除非我使用以下提示强制执行 FULLSCAN:
OPTION(TABLE HINT( $mytable, FORCESCAN ))
Run Code Online (Sandbox Code Playgroud)
我知道如果 DDL …
我有两个表:详细信息和这些详细信息的总计。
详细信息(缓慢的解决方案):
select
OrderId = r.OrderId
, TotalQty = SUM(r.Quantity)
, TotalGrossConsid = SUM(r.Price * r.Quantity)
from dbo.Order r
group by r.OrderId
Run Code Online (Sandbox Code Playgroud)
总计(快速解决方案):
select
t.OrderId
, t.TotalQty
, t.TotalGrossConsid
, t.IsValid
from dbo.OrderTotal t
Run Code Online (Sandbox Code Playgroud)
有时总数变得无效(某些作业必须重新计算更改的总数,但会延迟)。如您所知,第二个查询更快,有效总数的数量多于无效总数。因此,我正在寻找一个组合查询,该查询从第二个表 (totals) 返回有效总数,并使用第一个慢查询返回动态重新计算的总数。所以我的目标将实现:所有总数都是有效的,响应时间比完全重新计算要快。
这是我的尝试(混合解决方案):
with fast_static(OrderId, TotalQty, TotalGrossConsid, IsValid)
as
(
select
t.OrderId
, t.TotalQty
, t.TotalGrossConsid
, t.IsValid
from dbo.OrderTotal t
)
, slow_dynamic(OrderId, TotalQty, TotalGrossConsid)
(
select
OrderId = r.OrderId
, TotalQty = SUM(r.Quantity)
, TotalGrossConsid = SUM(r.Price …Run Code Online (Sandbox Code Playgroud) performance sql-server-2008 query aggregate materialized-view
我了解到索引视图保存来自基表的数据,而标准视图不保存数据。这是否意味着索引视图需要内存而标准视图不需要?
索引视图需要与架构对象绑定。我也对架构绑定对象中不允许使用“*”这一点感到困惑。例如:
create view viewname as select * from tablename
Run Code Online (Sandbox Code Playgroud)
上面的说法是行不通的。为什么?
我正在使用 SQL Server 索引视图来提高连接的性能,该连接按小表上的类别过滤(非常)大的表。例如:
CREATE VIEW BigTableSubset WITH SCHEMABINDING
AS
SELECT b.ID, b.SomeValue from BigTable b
INNER JOIN SmallTable s on (b.CategoryFK = s.CategoryPK)
where s.Type = 'Blah'
CREATE UNIQUE CLUSTERED INDEX PK_BigTableSubset ON BigTableSubset
(ID)
INCLUDE (SomeValue)
Run Code Online (Sandbox Code Playgroud)
(BigTable.ID是BigTable上的PK)
查询性能大大增加(因为需要Bigtable中的子集已经存储),但我会确保SQL可以更新索引本身在最优化的方式时,无论是源表进行更新。
所以问题是:我是否需要在视图的聚集索引中包含 SmallTable.CategoryPK 以确保这一点,或者 SQL 是否会作为索引结构的一部分自动执行此操作?或者换句话说,每次“左手”(SmallTable)表更新时,SQL 如何识别索引中的哪些页面需要更新,我是否需要做任何事情来促进这一点?
我在 Postgres 中有一个物化视图,想知道刷新该视图时取出了哪些锁(如果有)。
CREATE TABLE people ( name VARCHAR(30) );
INSERT INTO people VALUES ('Alice'), ('Bob'), ('Cher');
CREATE MATERIALIZED VIEW test AS SELECT * FROM people;
REFRESH MATERIALIZED VIEW test;
Run Code Online (Sandbox Code Playgroud)
具体来说,我试图了解该REFRESH MATERIALIZED VIEW命令是否取出ACCESS EXCLUSIVE锁。
我尝试了一个解释但没有成功:
#> EXPLAIN REFRESH MATERIALIZED VIEW test;
QUERY PLAN
-------------------------------------------
Utility statements have no plan structure
Run Code Online (Sandbox Code Playgroud) 假设我有一个如下所示的索引视图:
ALTER VIEW dbo.MyIndexedView WITH SCHEMABINDING
AS
SELECT ord.SomeColumn, COUNT_BIG(*) AS Count
FROM dbo.Ordered ord
WHERE ord.CreatedWhen > CONVERT(DATETIME, '2014-11-01', 121)
GROUP BY ord.SomeColumn
GO
CREATE UNIQUE CLUSTERED INDEX [CIX_MyIndexedView] ON dbo.MyIndexedView (SomeColumn)
GO
Run Code Online (Sandbox Code Playgroud)
如果我在此视图中更改日期时间值(比如“2014-11-01”),则需要重新生成聚集索引。
有没有办法让现有的视图和索引保持有效,直到新的视图和索引完全构建,然后让它们交换? 相似Online=On
index sql-server materialized-view sql-server-2012 online-operations
假设我有父-> 子表设置。打电话给他们Shipment和Widget。
无论如何要创建一个索引视图,该视图将具有父级 (ShipmentId) 的 PK 和最新子级 (Widget.CreatedWhen) 的创建时间。
这是我正在寻找的查询:
SELECT widg.ShipmentId, MAX(widg.CreatedWhen) NewestWidget
FROM dbo.Widget widg
GROUP BY widg.ShipmentId
Run Code Online (Sandbox Code Playgroud)
显然这个查询不能是一个索引视图,因为它已经MAX在里面了。
但是是否有其他方法通过“索引视图合法”SQL 来获得类似的结果集?
我知道分析物化视图 (MV) 是有意义的,但由于 MV 不可更新,这是否意味着我们不需要清理 MV?
sql-server ×5
postgresql ×4
statistics ×2
aggregate ×1
amazon-rds ×1
datetime ×1
index ×1
performance ×1
query ×1
upgrade ×1
vacuum ×1