我正在将现有应用程序迁移到 Amazon RDS PostgreSQL。该应用程序具有跨数据库支持,出于兼容性原因,它包含以下 SQL:
CREATE CAST (varchar AS numeric) WITH INOUT AS ASSIGNMENT
Run Code Online (Sandbox Code Playgroud)
在普通 PostgreSQL 上,这需要超级用户。在 Amazon RDS PostgreSQL 上这失败了
错误:必须是类型字符变化或数字类型的所有者
注意:我猜这是否是赋值或隐式转换无关紧要,但为了完整性而包含此信息。
我正在使用ArchLinux和PostgreSQL9.4.4 并在配置文件中启用了日志记录:
$ sudo egrep -v "^[[:blank:]]*($|#|//|/\*| \*|\*/)" /var/lib/postgres/data/postgresql.conf
max_connections = 1024 # (change requires restart)
shared_buffers = 128MB # min 128kB
dynamic_shared_memory_type = posix # the default is the first option
logging_collector = on # Enable capturing of stderr and csvlog
log_directory = '/tmp' # directory where log files are written,
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
log_file_mode = 0644 # creation mode for log files,
log_error_verbosity = verbose # terse, default, or …Run Code Online (Sandbox Code Playgroud) 我正在使用PostgreSQL并且我想向控制台打印一条消息。
如果我用plpythonu我用plpy.notice
如果我用plpgsql我用raise notice
但是当函数是纯函数时如何打印SQL?using 对SELECT 'string'我没有帮助,因为它将字符串打印在一列中,如果消息位于代码中间,则不会显示它。我想要类似raise notice/ plpy.noticefor 的东西SQL。
CREATE OR REPLACE FUNCTION A()
RETURNS VOID AS
$BODY$
how do i print 'hello world' here?
$BODY$
LANGUAGE sql VOLATILE
Run Code Online (Sandbox Code Playgroud)
如果是 plpgsql 我会这样做:
CREATE OR REPLACE FUNCTION A()
RETURNS VOID AS
$BODY$
Raise Notice 'hello world'
$BODY$
LANGUAGE plpgsql VOLATILE
Run Code Online (Sandbox Code Playgroud)
我正在寻找等效的 LANGUAGE SQL
我在亚马逊上有生产和暂存 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)