注意:这与关于在表本身中添加冗余信息的这个 SO 问题不同。
以下系列语句中的最后一条语句是否在索引/查询优化方面给我带来了任何好处,还是完全没有用并且是一种反模式?从参照完整性的角度来看,它是无用的,但在索引或查询处理速度方面是否有一些好处,例如,JOIN仅在“子”表和“祖父”表之间?
CREATE TABLE grandfather (i INTEGER);
ALTER TABLE grandfather ADD PRIMARY KEY (i);
CREATE TABLE father (i, j INTEGER);
ALTER TABLE father ADD PRIMARY KEY (i, j);
ALTER TABLE father ADD CONSTRAINT father_2_grandfather FOREIGN KEY (i) REFERENCES grandfather(i);
CREATE TABLE child (i, j, k INTEGER);
ALTER TABLE child ADD PRIMARY KEY (i, j, k);
ALTER TABLE child ADD CONSTRAINT child_2_father FOREIGN KEY (i, j) REFERENCES father(i, j);
-- is the below statement totally …Run Code Online (Sandbox Code Playgroud) 我创建了一个像这样的表:
create table doki_data_item2 (like doki_data_item including defaults);
Run Code Online (Sandbox Code Playgroud)
但是这个新表使用与旧表相同的顺序。
所以两个问题:
我已经使用以下链接配置了一个带有 pgpool2 的 postgres 集群。
复制好像没问题,但是我跑了一些基准测试(pg_bench),性能比单节点低,例如:
pgbench -c 16 -j 16 -T 600 -S bench2 -h "ONE SINGLE POSTGRES NODE" -p 5432 实际处理的事务数:7752147 tps = 12920.095988(包括建立连接)tps = 12921.6(不包括建立连接)48
pgbench -c 16 -j 16 -T 600 -S bench2 -h "PGPOOLNODE" -p 5432 实际处理的事务数:389800 tps = 648.857810(包括建立连接) tps = 648.886713(不包括建立连接)
pgbench -c 16 -j 16 -T 600 -S bench2 -h "MASTERNODE" -p 5432 实际处理的事务数:7093473 tps = 11822.379159(包括建立连接) tps = 11823.337051(不包括建立连接)
每个节点都是默认配置的。所有节点都是相同的虚拟机并在同一网络上。
这是我的 pgpool.conf:
listen_addresses = '*'
port = 5432
socket_dir …Run Code Online (Sandbox Code Playgroud) Postgres从 9.0开始就有了流式复制,从 9.1 开始,可以使用pg_xlog_replay_pause()和pg_xlog_replay_resume()暂停和恢复流式 WAL 记录的应用程序。据我所知,没有内置的方法可以使 WAL 的应用程序故意滞后特定时间段(例如 24 小时)。
我是否错过了实现这一目标的内置方法,如果没有,我应该如何以其他方式实现它?
我有一个 Postgres 数据库,它已经增长到无法将所有内容存储在单个数据库节点上的大小。Customer我的架构中有一个表,其中每一行代表一个(惊喜!)客户。我的数据库中的每个其他表都是这个客户表上的外键,我想沿着客户范围对我的数据库进行分片。例如,我希望id1 - 100 的客户转到数据库节点 A,101 - 200 转到数据库节点 B,依此类推。
我找到了有关表分区的信息,但我发现很少有其他内容可以向我展示如何在 Postgres 中启用数据库分区。
在 Postgres 中分片数据库有哪些选择?如果无法进行分片,我的替代方案是什么?
我有下表:
Table "public.employee_employee"
Column | Type | Modifiers
-----------------+-----------------------+----------------------------------------------------------------
id | integer | not null default nextval('employee_employee_id_seq'::regclass)
name | text | not null
slug | character varying(50) | not null
title | text | not null
base | numeric(10,2) |
gross | numeric(10,2) |
overtime | numeric(10,2) |
benefits | numeric(10,2) |
total | numeric(10,2) |
other | numeric(10,2) |
year | smallint | not null
jurisdiction_id | integer | not null
notes | text |
Indexes:
"employee_employee_pkey" PRIMARY KEY, …Run Code Online (Sandbox Code Playgroud) 很干很干,我只是个菜鸟。有没有办法让给定的角色从另一个角色继承?
我正在阅读 postgresql 管理员手册。某些数据库服务器参数需要重新启动,并且数据库繁忙,您可能需要快速重新启动。有很多事情要做来加速重启:1) 在关闭检查点之前发出一个正常的检查点,2) 将所有脏的 shared_buffers 刷新到磁盘,3) 在关闭之前记录数据库缓存的内容,然后再次预热缓存重启后立即。因此,本书似乎建议:
psql -c "CHECKPOINT"
psql -c "select pg_cache_save('mycache')"
pg_ctl -D datadir -m immediate restart
psql -c "select pg_cache_warm('mycache')"
Run Code Online (Sandbox Code Playgroud)
它还展示了这种方法:
pg_ctl -D datadir restart -m fast
Run Code Online (Sandbox Code Playgroud)
在重新启动经常插入的繁忙数据库时,我应该使用哪一个?以上之一或有更好的方法吗?
我的笔记本电脑有一个小硬盘。我想加载一个大数据集。我已将整个移动/usr/local/var/postgres到外部高清,并将其符号链接回来。现在我收到这个错误,
psql: could not connect to server: Socket operation on non-socket
Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
Run Code Online (Sandbox Code Playgroud)
我现在已经找到了问题所在。更改默认数据目录会导致 Postgres 拒绝连接到服务器。在线手册对“同一目录中的配置文件”有点 [原文如此!] 不具体……
我使用的解决方案(使用 psql)是:
CREATE TABLESPACE tablespacename OWNER username LOCATION '/Path/to/Folder'
Run Code Online (Sandbox Code Playgroud)
然后,
CREATE DATABASE databasename OWNER username TABLESPACE tablespacename
Run Code Online (Sandbox Code Playgroud)
最后
psql databasename < /Path/to/databasedump.sql
Run Code Online (Sandbox Code Playgroud)
请注意此问题的未来访问者;请参阅下面 Craig Ringer 关于如何正确解决此问题的警告。
在新项目的数据库中,我已经开始约定让每个表都有一个最后修改的时间戳列。为了实现这一点,我为每个表编写了一个触发器:
CREATE TRIGGER touch_users
BEFORE UPDATE
ON users
FOR EACH ROW
WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
EXECUTE PROCEDURE touch_modification_time();
CREATE TRIGGER touch_company
BEFORE UPDATE
ON company
FOR EACH ROW
WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
EXECUTE PROCEDURE touch_modification_time();
-- etc for each table
Run Code Online (Sandbox Code Playgroud)
这很快就会变得乏味;特别是因为它们完全相同,除了表名。
有没有办法可以减少每个表所需的样板文件?或者甚至可能通过一个默认作用于每个表的触发器完全消除它?
postgresql ×10
audit ×1
mac-os-x ×1
metadata ×1
partitioning ×1
performance ×1
pgpool ×1
replication ×1
scalability ×1
sharding ×1
trigger ×1
update ×1