在在这里发布之前,我已经尽可能多地用谷歌搜索和手动阅读。
版本信息:Ubuntu10.x 上的 Postgres8.4
我有一台运行 postgres 服务器的个人笔记本电脑,一个使用 JDBC 的 Java 脚本运行了 1600 分钟(我已经运行了数周前),然后死了说管理员重新启动了服务器。这是我在 pgsql 日志中发现的内容:
Feb 29 07:46:55 krufe-laptop postgres[3578]: [2-1] 2012-02-29 07:46:55 EST LOG: incomplete startup packet
Feb 29 07:46:56 krufe-laptop postgres[1113]: [2-1] 2012-02-29 07:46:56 EST LOG: received fast shutdown request
Feb 29 07:46:56 krufe-laptop postgres[1113]: [3-1] 2012-02-29 07:46:56 EST LOG: aborting any active transactions
Feb 29 07:46:56 krufe-laptop postgres[24095]: [2-1] 2012-02-29 07:46:56 EST FATAL: terminating connection due to administrator command
Feb 29 07:46:56 krufe-laptop postgres[24095]: [2-2] 2012-02-29 07:46:56 …Run Code Online (Sandbox Code Playgroud) 相当简单的问题,可能在某处得到了回答,但我似乎无法为 Google 形成正确的搜索问题......
在查询该表的子集时,特定表中的列数是否会影响查询的性能?
例如,如果表 Foo 有 20 列,但我的查询只选择了其中的 5 列,那么有 20(而不是 10)列会影响查询性能吗?为简单起见,假设 WHERE 子句中的任何内容都包含在这 5 列中。
除了操作系统的磁盘缓存之外,我还担心 Postgres 的缓冲区缓存的使用。我对 Postgres 的物理存储设计一无所知。表存储在多个页面上(默认为每页 8k 大小),但我不太明白元组是如何从那里排列的。PG 是否足够聪明,只能从磁盘中获取包含这 5 列的数据?
我一直在我的一个 PostgreSQL 数据库中使用数组。
我创建了一个包含至少一个元素的几何数组的表:
CREATE TABLE test_arrays (
polygons geometry(Polygon,4326)[],
CONSTRAINT non_empty_polygons_chk
CHECK ((COALESCE(array_length(polygons, 1), 0) <> 0))
);
Run Code Online (Sandbox Code Playgroud)
我添加了几行,并在表中查询每个几何数组中的第一个元素:
SELECT polygons[0] FROM test_arrays;
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,我得到了一个空行列表!
经过一些研究,事实证明PostgreSQL 数组是基于一个的:
数组下标数字写在方括号内。默认情况下,PostgreSQL 使用基于 1 的数组编号约定,即 n 个元素的数组以 array[1] 开头,以 array[n] 结尾。
所以SELECT polygons[0] FROM test_arrays;工作并返回polygon每一行的第一行。
如果 PostgreSQL 使用基于 1 的编号约定,为什么允许查询第 0 个元素,结果是否有任何意义?
我需要从它的祖先计算后代的深度。当一个记录有 时object_id = parent_id = ancestor_id,它被认为是一个根节点(祖先)。我一直在尝试WITH RECURSIVE使用 PostgreSQL 9.4运行查询。
我不控制数据或列。数据和表架构来自外部源。该表正在不断增长。现在每天大约有 3 万条记录。树中的任何节点都可能丢失,并且它们将在某个时候从外部源中拉出。它们通常按created_at DESC顺序拉取,但数据是通过异步后台作业拉取的。
我们最初对这个问题有一个代码解决方案,但现在有 500 万行以上,几乎需要 30 分钟才能完成。
示例表定义和测试数据:
CREATE TABLE objects (
id serial NOT NULL PRIMARY KEY,
customer_id integer NOT NULL,
object_id integer NOT NULL,
parent_id integer,
ancestor_id integer,
generation integer NOT NULL DEFAULT 0
);
INSERT INTO objects(id, customer_id , object_id, parent_id, ancestor_id, generation)
VALUES (2, 1, 2, 1, 1, -1), --no parent yet
(3, 2, …Run Code Online (Sandbox Code Playgroud) 今天早上我参与了升级 AWS RDS 上的 PostgreSQL 数据库。我们想从 9.3.3 版迁移到 9.4.4 版。我们已经在临时数据库上“测试”了升级,但是临时数据库要小得多,并且不使用多可用区。事实证明,这个测试是相当不充分的。
我们的生产数据库使用多可用区。过去我们做过次要版本升级,在这种情况下,RDS会先升级standby,然后将其提升为master。因此,故障转移期间发生的唯一停机时间约为 60 秒。
我们假设主要版本升级也会发生同样的情况,但是我们错了。
关于我们设置的一些细节:
以下是我们执行升级时记录的 RDS 事件:
数据库 CPU 在大约 08:44 和 10:27 之间达到最大值。RDS 拍摄升级前和升级后的快照似乎占用了大部分时间。
该AWS文档不警告这样的反响,尽管从阅读他们很显然,我们在处理一个明显的缺陷是,我们没有创建的副本生产的多AZ建立数据库,并尝试将其升级为试运行
总的来说,这非常令人沮丧,因为 RDS 给我们的关于它正在做什么以及可能需要多长时间的信息非常少。(再次,进行试运行会有所帮助......)
除此之外,我们想从这次事件中吸取教训,所以这里是我们的问题:
我刚刚在 Ubuntu 15.10 上安装了 PostgreSQL 9.4。
createuser -P myusercreatedb -O myuser mydatabasepg_hba.conf并添加local mydatabase myuser md5sudo service postgresql restart用户myuser只是一个 PostgresSQL 用户,在 Ubuntu 上没有用户帐户。
当我尝试使用psql -W mydatabase myuser它连接到数据库时失败并显示psql: FATAL: Peer authentication failed for user "myuser".
PostgreSQL 正在运行……
? postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Thu 2016-03-03 09:53:00 CET; 9min ago
Process: 22219 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main …Run Code Online (Sandbox Code Playgroud) 我使用 postgresql,我需要删除模式中存在的所有表。如何从命令提示符中删除。
如果我有一个包含 3 列的表格——比如 A、B 和 D——并且我不得不引入一个新的——比如 C 来替换 D 的当前位置。我将使用以下方法:
新的顺序是 A、B、C 和 D。
我认为这是一种合法的做法,因为(到目前为止)它没有产生任何问题。
但是,今天我遇到了一个问题,当一个函数在同一张表上执行语句时返回以下错误:
table row type and query-specified row type do not match
以及以下细节:
Query provides a value for a dropped column at ordinal position 13
我尝试重新启动 PostgreSQL,VACUUM FULL按照此处和此处的建议执行并最终删除并重新创建该函数,但这些解决方案不起作用(除了他们尝试解决系统表已被更改的情况之外)。
有幸使用一个非常小的数据库,我导出了它,删除了它,然后重新导入它并解决了我的功能问题。
我意识到这样一个事实,即不应通过修改系统表(弄脏pg_attribute等)来弄乱列的自然顺序,如下所示:
从我的函数抛出的错误来看,我现在意识到用我的方法改变列的顺序也是一个禁忌。任何人都可以说明为什么我所做的也是错误的? …
postgresql metadata database-internals functions postgresql-9.6
考虑一个记录访问的表
create table visits (
person varchar(10),
ts timestamp,
somevalue varchar(10)
)
Run Code Online (Sandbox Code Playgroud)
考虑这个示例数据(时间戳简化为计数器)
ts| person | somevalue
-------------------------
1 | bob |null
2 | bob |null
3 | jim |null
4 | bob | A
5 | bob | null
6 | bob | B
7 | jim | X
8 | jim | Y
9 | jim | null
Run Code Online (Sandbox Code Playgroud)
我试图将这个人的最后一个非空值传递到他未来的所有访问中,直到该值发生变化(即成为下一个非空值)。
预期结果集如下所示:
ts| person | somevalue | carry-forward
-----------------------------------------------
1 | bob |null | null
2 | bob |null | …Run Code Online (Sandbox Code Playgroud) 让我们做几个假设:
我有一个看起来像这样的表:
a | b
---+---
a | -1
a | 17
...
a | 21
c | 17
c | -3
...
c | 22
Run Code Online (Sandbox Code Playgroud)
关于我的套装的事实:
整个表的大小是 ~ 10 10行。
我有 ~ 100k 行,列中有值a,a其他值类似(例如c)。
这意味着在“a”列中有大约 100k 个不同的值。
我的大多数查询都会读取 a 中给定值的全部或大部分值,例如select sum(b) from t where a = 'c'.
该表的编写方式使得连续值在物理上接近(要么按顺序写入,要么我们假设CLUSTER已在该表和列上使用a)。
该表很少更新,我们只关心读取速度。
该表相对较窄(比如每个元组约 25 个字节,+ 23 个字节的开销)。
现在的问题是,我应该使用什么样的索引?我的理解是:
BTree我的问题是 BTree 索引会很大,因为据我所知它会存储重复值(它必须这样做,因为它不能假设表是物理排序的)。如果 BTree 很大,我最终不得不读取索引和索引指向的表部分。(我们可以使用fillfactor = 100来稍微减小索引的大小。)
BRIN …
postgresql performance index clustered-index postgresql-9.6 query-performance
postgresql ×10
performance ×2
amazon-rds ×1
array ×1
cte ×1
functions ×1
index ×1
metadata ×1
pg-hba.conf ×1
recursive ×1
update ×1