我是一名前端开发人员/设计师,正在尝试扩展并了解更多有关后端世界的信息。我选择了 Python、Django 和 Postgres 作为我的起点。我的目标是构建一个个人网络应用程序,并将其用作我学习的催化剂。这真的很有趣。
我正处于设计数据模型的阶段。我通常会修补并解决问题,但在这种情况下我很好奇什么是可能的。
我的应用程序的数据模型的一个很好的类比是电子表格。用户可以创建“电子表格”,然后确定“列”,然后确定每列的数据类型。
因此,作为一个纯粹的示例,一个新工作表具有以下列:
Name (text)
Cost (number / currency)
Date (time stamp
Frequency (number)
Notes (text)
Run Code Online (Sandbox Code Playgroud)
然后,可以添加“行”,其中每个条目都有名称/成本/日期/频率/注释的值,以及一些元数据,例如谁创建了该行,在什么时间等。
我不确定完成此示例的最佳模式是什么。下面是我想出的最好的主意。我想知道是否有人愿意评论这是否是最好的方法,或者就不同的方向提供反馈。

我想出了:
drop table if exists idtemp;
create temp table idtemp as
select documentid from taskflag where taskid='coref' and state = 2
order by statechanged asc limit howmany;
create unique index on idtemp(documentid);
-- trim taskflag to the first N docs ordered by coref.
delete from taskflag where documentid not in (select documentid from idtemp) ;
Run Code Online (Sandbox Code Playgroud)
当任务标志中有 120k 条记录而我保留 10k 条记录时,速度非常慢。
任务标志看起来像:
\d taskflag
Table "public.taskflag"
Column | Type | Modifiers
--------------+-----------------------------+-----------
documentid | character varying(64) | not null
taskid | …Run Code Online (Sandbox Code Playgroud) 我可以毫无问题地远程连接到我的数据库,无论是从我们的网络服务器上的 PHP 脚本还是使用 PGAdmin3。
不幸的是,当我尝试在服务器本身上本地运行 pg_dump 备份时,我得到:
pg_dump --username=postgres -W omega | gzip > omega.10.10.13.gz
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)pg_dump: [archiver (db)] connection to database "omega" failed: FATAL: Peer authentication failed for user "postgres"
以前我的数据库根本没有密码,但为了尝试解决这个问题,我实际上给了 postgres 用户一个密码。仍然没有骰子,对等身份验证每次都失败。
这是我的 pg_hba.conf 文件中的设置...请告诉我可以做什么来解决这个问题。真的想在我的数据库上运行一些备份。
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections: …Run Code Online (Sandbox Code Playgroud) 我有一个小型数据库,其中很少有带有"default"排序规则的文本字段。我不想重新创建数据库。一次更改所有有问题的字段的查询是什么?
要更改我可以使用的单个
ALTER TABLE a_table_name ALTER a_column_name TYPE text COLLATE a_collate;
Run Code Online (Sandbox Code Playgroud) 我有一个 PostgreSQL 11 数据库,其中包含多个数据库,其中一些包含经常插入和更新的表。最近写入 WAL 文件的数据量大幅增加(约 400%),尽管我相信插入数据库的数量仅增加了约 20%。
因此,我们不仅使用了更多的磁盘,而且我们的数据库性能现在似乎受到 WAL 所在磁盘的写入器性能的限制。
应用程序更新非常频繁,可能是应用程序中的某些内容(我们控制并能够更改)发生了变化,这导致插入/更新的效率降低,但我不知道我们如何会识别。自从这种行为改变开始以来,可能已经发生了很多变化,自从它第一次被注意到以来,可能已经发生了很多变化。
有没有办法确定哪些数据库/表/查询正在写入 WAL,以及(大约)数量?
对于serialPostgresql < 10 中使用的列,我们按名称管理序列。我们能够通过以下方式重置序列:
SELECT setval('table_id_seq', (SELECT MAX(id) FROM table));
Run Code Online (Sandbox Code Playgroud)
从版本 10 开始,使用标识列,无需使用序列名称。那很好。
ALTER TABLE table ALTER COLUMN id RESTART WITH 1000;
Run Code Online (Sandbox Code Playgroud)
如何在max(id)不知道序列名称的情况下将标识列设置为?
就我从ALTER TABLE 语法中看到的而言,没有办法让子查询来计算序列的开始。
我想写一些类似的东西:
ALTER TABLE table ALTER COLUMN id RESTART WITH (SELECT MAX(id) FROM table);
Run Code Online (Sandbox Code Playgroud) 我需要将列类型从 更改 varchar(100)[]为text[]。该表有 > 100M 行和大量写入负载,因此我想避免获取访问排他锁并重写索引。我看到了这个问题,非阵列varchar来text改变管理这一点,所以我想知道:做同样与阵列列应用?
旧类型要么是二进制强制转换为新类型,要么是新类型上的无约束域)
varchar(100)[]to是这种情况text[]吗?
我正在从 PostgreSQL 表中删除 750k 行中的 130k。
第一次,花了8个小时才完成删除查询。
第二次,我向表中添加了一个索引,并重建了该索引。现在用了3个小时完成删除查询
第三次,我添加了以下行:
alter table contact disable trigger ALL;
delete from contact where ....;
alter table contact enable trigger ALL;
Run Code Online (Sandbox Code Playgroud)
删除行花了不到一秒钟的时间。即使没有与当前和外键表关联的触发器。
即使没有与表关联的触发器,这种快速查询性能的原因可能是什么?数据库级别还有其他类型的触发器吗?
我正在使用AWS Aurora PostgreSQL Serverless自动缩放。看起来好像缩放清除了共享缓冲区,所以当我们想要提高性能时,我们被迫面对 I/O 瓶颈。在我们热身之后,我们看到了巨大的性能提升。但是,如果我们在缩放后背靠背运行,则第二次运行会更快。虽然我没有看到任何关于共享缓冲区是否在缩放时被清除的具体信息,但我几乎肯定它是。
Aurora Serverless 目前正在使用PostgreSQL 10.14,并且支持pg_prewarm扩展。它看起来像最新的文件显示在服务器重新启动后prewarm支持自动prewarm,但这是无服务器并不会出现提自动预暖的一个版本的文档中。
我发现这篇文章在重新启动服务器或从崩溃中恢复时非常适合 PostgreSQL。
pg_prewarm支持first_block和last_block阻止表/索引的编号,但是如何知道要放入哪些值呢?我们提前知道我们的峰值是什么时候,并告诉 RDS 在此之前进行扩展,因此我们有一个可以准备的时间窗口。
我有哪些选择?
我在 PostgreSQL 13 中有这个表:
CREATE TABLE public."domain" (
id int8 NOT NULL GENERATED ALWAYS AS IDENTITY,
domain_name varchar NOT NULL,
-- more columns
expire_date timestamp NULL,
days_before_trigger int4 NOT NULL DEFAULT 14
);
Run Code Online (Sandbox Code Playgroud)
现在我想添加一个生成的列notify_trigger_date,派生自expire_date减days_before_trigger,以记录我的网站 url ssl 证书到期日期。如何自动生成该列?
它看起来像这样:
notify_trigger_date = expire_date - 7 day
Run Code Online (Sandbox Code Playgroud)
我正在尝试像这样实现它:
ALTER TABLE "domain" ADD COLUMN notify_trigger_date timestamp
GENERATED ALWAYS AS ((expire_date::timestamp - '1 day')) STORED;
Run Code Online (Sandbox Code Playgroud)
我不知道如何1 day用天数替换days_before_trigger?此命令运行时出错:
Run Code Online (Sandbox Code Playgroud)SQL Error [22007]: ERROR: invalid input syntax for …
postgresql ×10
ddl ×2
alter-table ×1
aws-aurora ×1
backup ×1
cache ×1
collation ×1
datatypes ×1
foreign-key ×1
identity ×1
interval ×1
sequence ×1
trigger ×1