我在亚马逊上有生产和暂存 RDS 实例,暂存数据是生产的直接副本,因此两个实例都有重复的数据。
做一个EXPLAIN ANALYZE SELECT * from my_table WHERE my_col=true;结果是:
Seq Scan on my_table (cost=0.00..142,775.73 rows=1 width=1,436) (actual time=18,170.294..18,170.294 rows=0 loops=1) Filter: my_col Rows Removed by Filter: 360275
Run Code Online (Sandbox Code Playgroud)
在生产中,它是:
Seq Scan on my_table (cost=0.00..62,145.88 rows=1 width=1,450) (actual time=282.487..282.487 rows=0 loops=1) Filter: my_col Rows Removed by Filter: 366442
Run Code Online (Sandbox Code Playgroud)
跑步时 select pg_total_relation_size('my_table'::regclass);
我发现舞台的大小几乎是制作的两倍。从我读过的内容来看,我看到 postgresql 的 MVCC 对此负责,因为它保留了多个版本的行。我手动运行VACUUM FULL,然后看到 staging 的大小已经减少了 2/3。现在运行相同的解释分析显示:
Seq Scan on my_table (cost=0.00..56094.75 rows=1 width=1436) (actual time=1987.340..1987.340 rows=0 loops=1) Filter: my_col Rows Removed by …Run Code Online (Sandbox Code Playgroud) 我有一个生成交易并执行它们的软件。我想根据执行的查询占查询总数的简单比例异步检查事务进度。我能够读取stdout和stderr生成的psql,所以我想一个解决方案可以打印到stdout一些自定义消息,如“进度:3/8”(或另一个自定义文本字符串)。
我曾考虑过执行“日志查询”,该查询将有关查询进度的信息存储在适当的表中,但该表在事务完成之前不可用,这使我无法检查事务进度。
目前我尝试了以下操作(假设在交易中有 3 个查询来做一些事情):
BEGIN;
CREATE OR REPLACE FUNCTION progress(curr int, total int) RETURNS float AS $$
BEGIN
RAISE NOTICE '___PROGRESS___%', curr/total::float;
RETURN curr/total::float;
END;
-- First query
SELECT ... FROM ...;
-- Log the progress
SELECT * FROM progress(1,3);
-- Second query
SELECT ... FROM ...;
-- Log progress
SELECT * FROM progress(2,3);
-- Third query
SELECT ... FROM ...;
-- Log progress
SELECT * FROM progress(3,3);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
我使用以下语法从 bash …
我有一个低流量(10-20 rpm)的网站。应用服务器与数据库运行在同一个机器上,通过本地主机连接到数据库
几个月来,一切都运行良好。
大约 5 天前 Postgres 开始随机返回这个错误,每 100 个请求大约 1 个错误:
服务器意外关闭连接
这可能意味着服务器在处理请求之前或处理请求时异常终止。
没有对应用程序、数据库或系统设置进行重大修改。
如果我正确理解错误消息,则表示数据库进程已被杀死?
我试图了解什么会导致此错误:
服务器上的内存使用情况似乎没问题 (70%),我有足够的可用磁盘空间。
当我通过 psql 或 ruby PG 客户端手动连接到 Postgres 时,我可以执行选择和更新查询。
我已经看过这个问题: PostgreSQL 错误:服务器意外关闭了连接
我试图重新索引表。我还执行了一个运行良好的 pgdump(我没有恢复数据)
环境 :
应用程序连接到数据库:
我有一个person必须插入任意数据的表。由于我使用的是 Postgres 9.4,因此jsonb似乎是正确的选择。
示例数据:
id: 1, name: "Joe Doe", preferences: { color: "red" , toy: "car"}
id: 2, name: "Jane Doe", preferences: { color: "blue", food: "hamburguer" }
Run Code Online (Sandbox Code Playgroud)
问题是我需要通过变量值来查询它,例如:
所有在偏好上有“汉堡包”的人,部分查询也必须是可能的,所以搜索“burg”必须给我带来记录2。
使用json函数,我可以搜索值,只要我知道key,对吗?或者有一种快速搜索值的方法?
我想做的是创建一个 tsvector 列并转储 json 以使用全文搜索来执行部分查询。
TL;DR:当“EXPLAIN (BUFFERS)”显示“索引扫描”时,它不会显示需要从索引中读取的页数。它只是省略了那个数字,还是它实际上不读取页面(我误解了索引的工作原理)?
我们有一个大的只读表,看起来像这样:
database=> \d my_table
Table "my_table"
Column | Type | Modifiers
-----------------------+------------------+-----------
id | integer |
date | date |
country_id | smallint |
...other columns...
Indexes:
"my_table_id_date_idx" btree (id, date)
Run Code Online (Sandbox Code Playgroud)
并且对该表的典型查询具有这样的 EXPLAIN...
database=> EXPLAIN (BUFFERS, ANALYZE) SELECT id, date, country_id FROM my_table WHERE id = 50 AND date BETWEEN '2015-04-01' AND '2015-04-07';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on my_table (cost=448.40..70400.85 rows=18810 width=10) (actual time=9.011..1447.817 rows=10224 loops=1)
Recheck Cond: ((id = 50) AND (date >= '2015-04-01'::date) AND …Run Code Online (Sandbox Code Playgroud) 我正在使用 Postgres 9.4,以及最近分析过的数据库。这些是我的表:
Materialized view "public.vw_chemical_summary_by_ccg"
Column | Type | Modifiers
-----------------+----------------------+-----------
processing_date | date |
pct_id | character varying(3) |
chemical_id | character varying(9) |
items | bigint |
cost | double precision |
Indexes:
"vw_idx_chem_by_ccg_chem_id" btree (chemical_id)
"vw_idx_chem_by_ccg_chem_id_vc" btree (chemical_id varchar_pattern_ops)
"vw_idx_chem_by_ccg_joint_id" btree (pct_id, chemical_id)
Table "public.frontend_pct"
Column | Type | Modifiers
-------------------+-------------------------+-----------
code | character varying(3) | not null
name | character varying(200) |
org_type | character varying(9) | not null
Indexes:
"frontend_pct_pkey" PRIMARY KEY, btree (code) …Run Code Online (Sandbox Code Playgroud) 使用 Postgres:
SELECT users."name" AS "name"
, array_to_json(array_agg(sites)) as sites
FROM remodel.users AS users
JOIN remodel.user_sites AS user_sites
ON users.id=user_sites.user
JOIN remodel.sites AS sites
ON sites.id=user_sites.site
GROUP BY "users".id
;
Run Code Online (Sandbox Code Playgroud)
目前生产
SELECT users."name" AS "name"
, array_to_json(array_agg(sites)) as sites
FROM remodel.users AS users
JOIN remodel.user_sites AS user_sites
ON users.id=user_sites.user
JOIN remodel.sites AS sites
ON sites.id=user_sites.site
GROUP BY "users".id
;
Run Code Online (Sandbox Code Playgroud)
但是我不想在 JSON 输出中有“id”字段。
将站点选择更改为
array_to_json(array_agg(row(sites."name", sites.created))) as sites
Run Code Online (Sandbox Code Playgroud)
导致字段失去名称
"Toby";"[{"id":1,"name":"Village","created":"2015-08-10T15:22:36.622298"},
{"id":2,"name":"Manor","created":"2015-08-10T15:22:43.614551"}]"
"Amy";"[{"id":3,"name":"Park","created":"2015-08-10T15:22:48.810872"}]"
"Anne";"[{"id":2,"name":"Manor","created":"2015-08-10T15:22:43.614551"},
{"id":1,"name":"Village","created":"2015-08-10T15:22:36.622298"},
{"id":3,"name":"Park","created":"2015-08-10T15:22:48.810872"}]"
Run Code Online (Sandbox Code Playgroud)
并尝试(这将是一个可怕的)子选择
, array_to_json(array_agg((SELECT "name", created FROM …Run Code Online (Sandbox Code Playgroud) 我在 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) 我目前正在向目前仅支持 MySQL 的部署工具添加 Postgres 支持。该工具动态提供和配置数据库等。
在 MySQL 中,我们可以使用 SQL 将用户限制为一组特定的 IP 地址,作为授权命令的一部分,如下所示:
GRANT ALL PRIVILEGES ON my_database_name.* TO 'my_user_name'@'192.168.101.%' IDENTIFIED BY 'my_secret_password'
GRANT ALL PRIVILEGES ON my_database_name.* TO 'my_user_name'@'internal.example.com' IDENTIFIED BY 'my_secret_password'
Run Code Online (Sandbox Code Playgroud)
在 Postgres 中,似乎设置类似安排的唯一方法是首先无限制地创建用户:
CREATE USER "my_user_name" WITH PASSWORD 'my_secret_password'
Run Code Online (Sandbox Code Playgroud)
我已经整理出如何以编程方式将此角色限制到特定数据库,但似乎通过主机限制 Postgres 用户的唯一方法是在 pg_hba.conf 文件中创建条目。
这是有问题的,因为没有文件系统访问权限的代理以编程方式创建了许多用户/主机。
看起来我们围绕这个的唯一三个选择是:
这似乎不太理想,让我怀疑我是否忽略了一个明显的解决方案。是否可以仅使用 SQL 命令通过 IP 地址限制 Postgres 角色?
我使用 PostgreSQL 中的以下两个表来保存我读过的书籍的数据库:
CREATE TABLE authors (
id SERIAL PRIMARY KEY,
name text
);
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title text,
author_id integer REFERENCES authors(id) ON UPDATE CASCADE ON DELETE CASCADE,
UNIQUE(title, author_id)
);
Run Code Online (Sandbox Code Playgroud)
现在,在浏览我的作者列表时,我发现了以下两个条目:
id | name
----------
1 | Mark Twain
2 | Samuel Clemens
Run Code Online (Sandbox Code Playgroud)
我想要做的是删除“马克吐温”条目,并有效地更新所有引用“马克吐温”的书籍以引用“塞缪尔克莱门斯”。我知道我可以手动执行此操作,但我想要一个有效的解决方案,无论哪些表正在引用authors(id)
我想过这样做(在交易中):
id为 2,让我们UPDATE CASCADE负责更改引用。但这会遇到一些问题,主要是:
DELETE CASCADE让我担心的第二个步骤还有一个更微妙的问题,可以用我(精心策划的)books表格的一部分来说明:
id | title | …Run Code Online (Sandbox Code Playgroud) postgresql ×10
aggregate ×1
explain ×1
foreign-key ×1
index ×1
json ×1
log ×1
mysql ×1
permissions ×1
row ×1