我正在尝试创建一个函数,如果我更新数据库行的任何列,它将增加我的版本列值 (int)。例如,如果我有一个包含列(id、标题、版本)并且默认版本为 1 的 foo 表,我希望我的 vesrion 在我更新单个 foo 行的标题后增加。我编写了以下函数,但是一旦我测试它就会抛出错误:
create or replace function update_foo_version()
returns trigger as $body$
begin
update foo
set version = version::int + 1
where old.id=new.id;
return new;
end
$body$
language plpgsql;
Run Code Online (Sandbox Code Playgroud)
我对这个功能的触发器:
create trigger update_version
after update on foo
for each row execute procedure update_foo_version();
Run Code Online (Sandbox Code Playgroud) 我创建了一个空UNLOGGED表来更快地复制大量数据(超过 10 亿行)。加载数据大约需要 4 个小时。
现在我想将表设置LOGGED为使其在意外关闭和崩溃时安全。这个过程需要很长时间。事实上,它比加载数据花费的时间更长。这是正常的,还是有办法加快速度?
我crypt()在我的一个函数中使用了哈希用户密码。但是我在第二天启动我的电脑时观察到,同样的事情失败了,因为密码功能在重新启动时变得不可用。它显示消息,如功能gen_salt()/crypt()未知或未定义。我执行了create extension pgcrypto;一次,它开始工作。
如何在生产环境中处理这个?即使 db 重新启动,有没有办法使该模块在 db 中永久可用?
或者我是否必须指示服务器管理器运行此命令以防他们需要重新启动数据库服务器?
或者我可以在函数本身中编写此语句,以便每次使用加密函数之前都会创建扩展?
此外,我们正在使用 db 的读取副本,它不允许执行此“创建扩展”语句,因为只有读取权限。那么如何在这样的只读环境中使用这种加密功能呢?
postgresql pgcrypto read-only-database postgresql-extensions
我不清楚确切地,
SELECT DISTINCT col1, col2, ...
FROM table_name
Run Code Online (Sandbox Code Playgroud)
当对一列调用时,它只返回该列的不同值。当我们将它与多个列一起使用时会发生什么,我们应该这样做吗?
在 AWS 提供 RDS Postgres 的直接 postgres 中,您可以通过将参数组项设置rds.force_ssl为 1来要求 SSL 。
这是根据 RDS postgres 文档:https : //docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts.General.SSL
但是Aurora Postgres没有这个参数项,也没有添加新参数的能力。如何为 Aurora 实例开启 require ssl?
我可以在 Aurora 版本中看到它支持 SSL:
create extension sslinfo;
select ssl_is_used();
select ssl_cipher();
Run Code Online (Sandbox Code Playgroud)
我可以选择通过 ssl 连接:
psql -h my-ssl-test1.cwzhlddlylx.us-east-1.rds.amazonaws.com -p 5432
-U myuser -d mydb sslrootcert=rds-ca-2015-root.pem sslmode=verify-full
Run Code Online (Sandbox Code Playgroud) 首先,我是这个论坛的新手。我希望有人能就我的问题提供帮助或建议。
给定用户 createdAt 日期和当前日期。我想在这些日期之间以 10 个线性时间间隔检索用户的 Friends 记录总和。
因此,如果 createdAt 是 30 天前,那么我想要每隔 3 天间隔的用户好友总数。
用户表
??????????????????????????????????????????????
? id ? name ? createdAt ?
??????????????????????????????????????????????
? 1 ? Timothee ? 2018-03-01 13:02:20.904+00 ?
??????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
朋友桌
???????????????????????????????????????????????????????
? id ? userId ? friendId ? createdAt ?
???????????????????????????????????????????????????????
? 1 ? 1 ? 234 ? 2018-03-20 15:41:51.779+00 ?
???????????????????????????????????????????????????????
? 2 ? 1 ? 254 ? 2018-03-20 16:16:34.698+00 ?
???????????????????????????????????????????????????????
? 3 ? 1 ? 288 ? 2018-03-15 15:17:39.907+00 ?
???????????????????????????????????????????????????????
? …Run Code Online (Sandbox Code Playgroud) 我有一个级别和年份表,大致如下所示:
INSERT INTO demo(first_name, rank, year) AS VALUES
('Peter',2,2017), ('Robert',3,2016), ('Evelyn',2,2017),
('Rand',3,2017), ('Kofi',3,2017), ('Daniel',3,2016), ('Leonard',1,2017),
('Mary',1,2017), ('Frank',1,2017), ('John',3,2017), ('Mary',1,2016),
('Gilbert',3,2016), ('Quince',2,2017), ('David',3,2017), ('Louis',2,2017),
('Felipe',2,2016), ('Alfonso',1,2017), ('Elise',3,2016), ('Jorge',3,2017),
('Mary',3,2016), ('Jasvant',2,2017), ('Paul',3,2017), ('Richard',2,2017),
('Christopher',2,2017), ('Johannes',2,2016), ('Nasser',3,2016), ('Bruce',3,2017),
('John',3,2016), ('Frederic',3,2016);
Run Code Online (Sandbox Code Playgroud)
我可以用一个非常基本的方法捕获每个级别和年份的总数COUNT():
SELECT rank, COUNT(*), year
FROM demo
GROUP BY rank, year
ORDER BY year, rank;
Run Code Online (Sandbox Code Playgroud)
这给了我一个相当整洁的演示数据摘要:
Rank Count Year
1 1 2016
2 2 2016
3 8 2016
1 4 2017
2 7 2017
3 7 2017
Run Code Online (Sandbox Code Playgroud)
我的实际数据要大得多,我希望能够在一个看起来更像这样的汇总表中看到它:
Rank 2016 2017 …Run Code Online (Sandbox Code Playgroud) 我有一个生产 postgres 10 数据库。每小时我都会在物化视图上运行“同时刷新物化视图”以重新计算值;每天只添加几个新行。
所有物化视图(及其索引)的大小都在急剧增加。应该是 102 MB 的视图现在是 1700 MB,并且指数也遭受了类似的通货膨胀。并且刷新时间从17秒增加到10分钟。由于视图及其索引的增长,整个数据库大小在最后一天从 4 GB 增长到 21 GB。我无法进行非并发刷新,因为这些视图不断被读取。
运行刷新会触发大量磁盘 I/O。
我不知道是什么导致了这个问题。我启用并配置了 autovacuum。我有 8GB 的内存,work_mem 设置为 256 MB。
我在 RDS Aurora 上的 PostgreSQL 9.6.3 上看到了一些非常奇怪的行为。
我从某些查询中得到重复的结果:
=> select count(id) from foos where id = 'deadbeef';
count
-------
2
(1 row)
=> select id from foos where id = 'deadbeef';
id
--------------------------
deadbeef
deadbeef
(2 rows)
=> select id, created_at from foos where id = 'deadbeef';
id | created_at
--------------------------+----------------------------
deadbeef | 2018-01-01 10:00:00.000000
(1 row)
Run Code Online (Sandbox Code Playgroud)
(id 值、时间戳和表名已被混淆)
我在这张桌子或任何其他桌子上都没有桌子继承。
这似乎只影响恰好命中foos表上一个索引的查询。
因为这似乎与单个索引隔离,我想运行REINDEX 可能会解决这个问题。
但是,我不知道有多少索引表现出这种行为。
例如,这是通过不同索引对同一记录的类似行为:
=> select bar from foos where bar = 'qux';
bar
----------------------------------------- …Run Code Online (Sandbox Code Playgroud) 我有这种 N:M 关系:
CREATE TABLE auth_user (
id integer NOT NULL PRIMARY KEY,
username character varying(150) NOT NULL UNIQUE
);
CREATE TABLE auth_group (
id integer NOT NULL PRIMARY KEY,
name character varying(80) NOT NULL UNIQUE
);
CREATE TABLE auth_user_groups (
id integer NOT NULL PRIMARY KEY,
user_id integer REFERENCES auth_user(id) NOT NULL,
group_id integer REFERENCES auth_group(id) NOT NULL,
CONSTRAINT user_groups UNIQUE(user_id, group_id)
);
INSERT INTO auth_user VALUES (1, 'user1');
INSERT INTO auth_user VALUES (2, 'user2');
INSERT INTO auth_group VALUES …Run Code Online (Sandbox Code Playgroud) postgresql ×10
aurora ×2
amazon-rds ×1
aws ×1
distinct ×1
index ×1
join ×1
many-to-many ×1
pgcrypto ×1
pivot ×1
ssl ×1
trigger ×1