是否可以在 PostgreSQL 中增量刷新物化视图,即仅针对新的或已更改的数据?
考虑这个表和物化视图:
CREATE TABLE graph (
xaxis integer NOT NULL,
value integer NOT NULL,
);
CREATE MATERIALIZED VIEW graph_avg AS
SELECT xaxis, AVG(value)
FROM graph
GROUP BY xaxis
Run Code Online (Sandbox Code Playgroud)
定期添加新值graph
或更新现有值。我想graph_avg
每隔几个小时刷新一次视图,仅针对已更新的值。但是在 PostgreSQL 9.3 中,整个表都被刷新了。这是相当耗时的。下一个版本 9.4 允许CONCURRENT
更新但它仍然刷新整个视图。有数以百万计的行,这需要几分钟。
跟踪更新和新值并仅部分刷新视图的好方法是什么?
我想知道如何在 Postgres 中查询物化视图的定义。作为参考,我希望做的与您可以为常规视图做的非常相似:
SELECT * FROM information_schema.views WHERE table_name = 'some_view';
Run Code Online (Sandbox Code Playgroud)
它为您提供以下列:
table_catalog
table_schema
table_name
view_definition
check_option
is_updatable
is_insertable_into
is_trigger_updatable
is_trigger_deletable
is_trigger_insertable_into
Run Code Online (Sandbox Code Playgroud)
这对于物化视图是可能的吗?
从我目前的研究来看,物化视图似乎被故意排除在 information_schema 之外,因为
information_schema 只能显示存在于 SQL 标准中的对象。
( http://www.postgresql.org/message-id/3794.1412980686@sss.pgh.pa.us )
由于它们似乎完全被排除在 information_schema 之外,我不知道如何解决这个问题,但我想做的是双重的:
view_definition
列information_schema.views
)。postgresql materialized-view information-schema postgresql-9.4
我想针对jsonb
Postgres中的类型编写一个查询,给定一组客户 ID 将找到相应的组。
鉴于此示例表:
CREATE TABLE grp(d JSONB NOT NULL);
INSERT INTO grp VALUES
('{"name":"First","arr":["foo"], "customers":[{"id":"1", "name":"one"},{"id":"2", "name":"two"}]}')
, ('{"name":"Second","arr":["foo","bar"], "customers":[{"id":"3", "name":"three"},{"id":"4", "name":"four"}]}')
, ('{"name":"Third","arr":["bar","baz"], "customers":[{"id":"5", "name":"five"},{"id":"6", "name":"seven"}]}');
Run Code Online (Sandbox Code Playgroud)
我发现了类似的问题(针对多个值的 PostgreSql JSONB SELECT)并设法使用此查询在简单数组上实现了我想要的:
SELECT d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar'];
Run Code Online (Sandbox Code Playgroud)
但是,当数组包含 JSON对象时,我无法使其工作:
SELECT d FROM grp WHERE d->'customers' ?| ARRAY['{"id":"1"}', '{"id":"5"}'];
Run Code Online (Sandbox Code Playgroud)
这是我对查询的期望:
grp“第一个”-> 客户“1”
grp "第三" -> 客户 "5"
这是对上一个问题的评论的衍生:
使用 PostgreSQL 9.4,Recheck Cond:
在EXPLAIN
.
就像在EXPLAIN
引用问题的输出中一样:
Run Code Online (Sandbox Code Playgroud)-> Bitmap Heap Scan on table_three (cost=2446.92..19686.74 rows=8159 width=7) Recheck Cond: (("timestamp" > (now() - '30 days'::interval)) AND (client_id > 0)) -> BitmapAnd (cost=2446.92..2446.92 rows=8159 width=0) -> Bitmap Index Scan on table_one_timestamp_idx (cost=0.00..1040.00 rows=79941 width=0) Index Cond: ("timestamp" > (now() - '30 days'::interval)) -> Bitmap Index Scan on fki_table_three_client_id (cost=0.00..1406.05 rows=107978 width=0) Index Cond: (client_id > 0)
或者在EXPLAIN ANALYZE
一个简单的大表(很少work_mem
)的输出中:
EXPLAIN ANALYZE …
Run Code Online (Sandbox Code Playgroud) 在多对多关系上使用 join 时,结果会拆分为多行。我想做的是将连接的右侧转换为数组,因此结果是一行。
包含 3 个表的示例:
CREATE TABLE items (
id serial primary key,
title text
);
CREATE TABLE tags (
id serial primary key,
title text
);
CREATE TABLE items_tags (
item_id int references items(id),
tag_id int references tags(id),
primary key (item_id, tag_id)
);
Run Code Online (Sandbox Code Playgroud)
选择带有标签的项目时,我可以这样做:
SELECT i.id, i.title, i.title
FROM items i
INNER JOIN items_tags it
ON it.item_id = i.id
INNER JOIN tags t
ON t.id = it.tag_id;
Run Code Online (Sandbox Code Playgroud)
结果将显示为:
(1, "item n1", "sport")
(1, "item n1", "soccer")
(2, "item …
Run Code Online (Sandbox Code Playgroud) 例如,当我使用返回记录 ID 的查询时
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Run Code Online (Sandbox Code Playgroud)
产生输出:
1
2
3
Run Code Online (Sandbox Code Playgroud)
这个 ids 会指向相应的插入值吗?
1 -> name1
2 -> name2
3 -> name3
Run Code Online (Sandbox Code Playgroud) 我有这个 SQL:
CREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
INSERT INTO test(data) VALUES
('{"parent":null,"children":[2,3]}'),
('{"parent":1, "children":[4,5]}'),
('{"parent":1, "children":[]}'),
('{"parent":2, "children":[]}'),
('{"parent":2, "children":[]}');
Run Code Online (Sandbox Code Playgroud)
那会给:
id | data
----+--------------------------------------
1 | {"parent": null, "children": [2, 3]}
2 | {"parent": 1, "children": [4, 5]}
3 | {"parent": 1, "children": []}
4 | {"parent": 2, "children": []}
5 | {"parent": 2, "children": []}
Run Code Online (Sandbox Code Playgroud)
当进行正常的一对多时,它会显示如下内容:
SELECT *
FROM test x1
LEFT JOIN test x2
ON x1.id = (x2.data->>'parent')::INT;
id | data | id | …
Run Code Online (Sandbox Code Playgroud) 假设我们有一个包含四列(a,b,c,d)
相同数据类型的表。
是否可以选择列中数据中的所有不同值并将它们作为单个列返回,或者我是否必须创建一个函数来实现这一点?
postgresql performance postgresql-9.4 distinct postgresql-performance
我们的生产环境今天早上在更改表时冻结*了一段时间,实际上是添加了一列。
违规 SQL:ALTER TABLE cliente ADD COLUMN topicos character varying(20)[];
* 登录到我们的系统需要从同一张表中进行选择,因此在更改表期间没有人可以登录。我们实际上不得不终止进程以让系统恢复正常运行。
表结构:
CREATE TABLE cliente
(
rut character varying(30) NOT NULL,
nombre character varying(150) NOT NULL,
razon_social character varying(150) NOT NULL,
direccion character varying(200) NOT NULL,
comuna character varying(100) NOT NULL,
ciudad character varying(100) NOT NULL,
codigo_pais character varying(3) NOT NULL,
activo boolean DEFAULT true,
id serial NOT NULL,
stock boolean DEFAULT false,
vigente boolean DEFAULT true,
clase integer DEFAULT 1,
plan integer DEFAULT 1,
plantilla character varying(15) …
Run Code Online (Sandbox Code Playgroud) 我有一个名为“user”的字段,其中包含一个大致如下所示的 json 数组:
"user"
:
[{ "_id" : "1", "count" : "4" }, { "_id" : "3", "count": "4"}]
Run Code Online (Sandbox Code Playgroud)
现在我想要一个像这样的查询:
select count from tablename where id = "1"
Run Code Online (Sandbox Code Playgroud)
我无法count
从 PostgreSQL 9.4 中的 json 对象数组中获取特定字段。
postgresql ×10
postgresql-9.4 ×10
array ×3
json ×3
aggregate ×1
alter-table ×1
blocking ×1
distinct ×1
index ×1
insert ×1
join ×1
order-by ×1
performance ×1