标签: postgresql

PostgreSQL 如何对磁盘上的新记录进行物理排序(在主键上的集群之后)?

需要知道 PostgreSQL 如何在磁盘上订购记录。在这种情况下,我想利用文档中所述索引组合,据我所知,它使用位图来获取匹配的行并根据它们的物理位置返回它们。有问题的表已按其主键聚集在一起。

据我了解,在集群完成后,PostgreSQL 不会自动继续进行集群(尽管它确实记得它是根据某个索引进行集群的)。现在,由于这是主键,我想知道物理存储顺序是否会根据它(如果是真的,我想利用我们的优势来进行特定查询)。

综上所述,PostgreSQL 如何对其新记录进行排序,尤其是在聚类之后?

非常感谢!

postgresql index database-design clustered-index physical-design

9
推荐指数
1
解决办法
2292
查看次数

TOAST 表增长失控 - FULLVAC 无所作为

最近,我将 PostgreSQL 8.2.11 服务器升级到 8.4,以便利用 autovacuum 功能并与 30 左右的其他 PGSQL 服务器保持一致。这是由管理硬件的单独 IT 小组完成的,因此我们在任何其他升级上没有太多选择(暂时不会看到 9+)。服务器存在于一个非常封闭的环境中(隔离网络,有限的root权限),运行在RHEL5.5(i686)上。升级后,数据库以每天 5-6 GB 的速度不断增长。通常情况下,整个数据库大约为 20GB;目前,它是~89GB。我们还有其他几台服务器,它们运行等效的数据库,并通过第 3 方应用程序(我无法访问内部工作原理的应用程序)将记录相互同步。其他数据库应该是~20GB。

运行以下 SQL,很明显特定表存在问题,更具体地说,它的 TOAST 表存在问题。

SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_relation_size(C.oid)) AS "size"
  FROM pg_class C
  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
  WHERE nspname NOT IN ('pg_catalog', 'information_schema')
  ORDER BY pg_relation_size(C.oid) DESC
  LIMIT 20;
Run Code Online (Sandbox Code Playgroud)

其中产生:

              关系 | 尺寸  
-------------------------------------+---------  
  pg_toast.pg_toast_16874 | 89GB  
  somes00.warmstates | 1095 MB  
  ...  
(20 行)

此 TOAST 表用于名为“timeseries”的表,该表保存大量斑点数据记录。SUM(LENGTH(blob)/1024./1024.)时间序列中所有记录的A为该列产生约 16GB。应该有什么理由 …

postgresql postgresql-8.4

9
推荐指数
2
解决办法
2万
查看次数

使用 IN 语句返回的行的顺序

我知道INPostgres 中的语句不能保证返回行的顺序。例如,如果我这样做:

SELECT users.id FROM users WHERE users.id IN (13589, 16674, 13588)
Run Code Online (Sandbox Code Playgroud)

我可能会得到这样的结果:

16674
13588
13589
Run Code Online (Sandbox Code Playgroud)

但是,我希望返回的行尊重IN列表中的顺序,所以我在网上找到的解决方案很少,例如:

SELECT users.id FROM users WHERE users.id IN (13589, 16674, 13588)
ORDER BY POSITION(id::text in '(13589, 16674, 13588)')
Run Code Online (Sandbox Code Playgroud)

或者

SELECT users.id FROM users WHERE users.id IN (13589, 16674, 13588)
ORDER BY id = 13589 desc,
         id = 16674 desc,
         id = 13588 desc;
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来做到这一点,或者更好但更有效?

postgresql order-by

9
推荐指数
1
解决办法
9389
查看次数

将一些表从一个 postgres 数据库复制到另一个

我有以下情况:我有三台机器运行 postgresql 数据库。一台机器保存客户端帐户信息(称为这台机器 C),另外两台机器保存客户端日志信息(称为 L1 和 L2)。拆分的原因是为了在多台机器上分开加载(所以一些客户端将日志信息发送到 L1,一些发送到 L2 ......也许还有一些时间 L3、L4,......)。

检索日志信息时,原则上我希望能够在 Ln 上的日志记录表和 C 上的客户帐户表之间进行 JOIN。实际上我不能这样做(即使我可以,我也希望以避免加载 C)。

我的想法是将 C 上的表复制到 L1、L2 中的每一个上,以便我可以进行连接。就来自 C 的表而言,C 是主表,L1、L2、... 是从表。但是对于 L1、L2 上的其他表,...这些机器是大师。它不完全是主-主复制,也不完全是主从。

是否可以说服 postgres(我正在运行 9.1)复制来执行此操作,或者如果没有其他软件包可以完成这项工作。作为最后的手段,我可​​以编写一些代码来定期同步表(我可以容忍一些延迟),但最好不要这样做!

提前致谢。

postgresql replication

9
推荐指数
1
解决办法
9008
查看次数

无法列出用户 - “select * from user”只返回一行和一列

我有一个带有用户表的 heroku postgres 附加数据库。但是,当我尝试时select * from user,我得到的只是:

  current_user  
----------------
 rtsjlhdfptlaqd
(1 row)
Run Code Online (Sandbox Code Playgroud)

表名肯定是user. 没有users桌子。我的应用程序中肯定有很多用户,但我似乎无法列出它们。

想法?

postgresql

9
推荐指数
1
解决办法
7273
查看次数

pgAdmin 4:如何在 Windows 中通过 SSH 隧道/接口建立连接

我安装了最新的 pgAdmin 4 (v2.1),但我发现(相关线程),目前,通过 SSH 隧道建立连接的唯一方法是使用另一个外部进程,pgAdmin 论坛中的一个示例说:

我设置了一个隧道,如下所示:

ssh -f dpage(at)hostname(dot)enterprisedb(dot)com -L 5999: hostname.enterprisedb.com:5432 -N
Run Code Online (Sandbox Code Playgroud)

(...) 我在 Mac 上运行,但同样的程序应该可以在 Linux 上运行。在 Windows 上,Putty iirc 中有一个隧道应用程序,但我不知道如何使用它。

我找到了一个简单的PuTTY 教程来使用 SSH Tunnel 建立连接

连接已建立,但看起来,当我尝试通过 pgAdmin 连接时,它失败或被拒绝(使用127.0.0.1:3306127.0.0.1:5432作为隧道的目的地)。为什么?

postgresql windows interface ssh pgadmin-4

9
推荐指数
2
解决办法
4万
查看次数

如何取消嵌套和 GROUP BY JSON 数组的元素?

给定band表格,其中一json列包含一个数组:

id | people
---+-------------
1  | ['John', 'Thomas']
2  | ['John', 'James']
3  | ['James', 'George']
Run Code Online (Sandbox Code Playgroud)

如何列出每个名称所属的乐队数量?
期望的输出:

name   | count
-------+------------
John   | 2
James  | 2
Thomas | 1
George | 1
Run Code Online (Sandbox Code Playgroud)

postgresql group-by array json

9
推荐指数
2
解决办法
2万
查看次数

验证 json[] 数组不为空的最快方法是什么?

我想验证一json[]the_array不为空。对于普通数组,我可以检查:

the_array != '{}'
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于 a json[],如下所示:

select '{}'::json[] != '{}'
ERROR:  could not identify an equality operator for type json
Run Code Online (Sandbox Code Playgroud)

我可以改用以下检查:

array_length(the_array, 1) != null // yes, array_length on an
                                      empty array returns null
Run Code Online (Sandbox Code Playgroud)

我担心这array_length()会遍历整个数组以计算项目数,然后返回该计数。就我而言,我不需要数组的实际大小,我只需要知道它是否为空。

那么,是否array_length()遍历整个数组?如果是这样,是否有更好的方法来检查 json 数组是否为空?

postgresql array json

9
推荐指数
1
解决办法
2万
查看次数

如何清理 Postgres WAL?

清理 WAL postgres 的正确方法是什么?我有一个超过 100 GB 的数据库,它在 pg_wal 中有大约 600 GB。我还设置了 2 个逻辑复制。

主从 - Postgres 10。

Master 和 Slaves 有评论wal_keep_segmentsmax_wal_size

pg_archivecleanup没有使用%r选项,然后我通过在pg_controldata最新检查点的 REDO WAL 文件中搜索并删除了日志来获取存档名称,但随后一个副本因错误而停止

无法从 WAL 流接收数据:致命:请求的 WAL 段 xxx 已被删除

为了解决这个问题,我删除并重新创建了副本。

postgresql postgresql-10

9
推荐指数
1
解决办法
2万
查看次数

值大致相同的列的最佳索引

我们有一个整数列,目前仅包含 0 或 1 个值。此列现在已被开发人员用于在某些情况下存储唯一的 32 位标识符,我们需要能够有效地提取包含这些标识符中的任何一个的行。

鉴于该值在 99% 的情况下是 0 或 1(我还没有数字),如何最好地索引以查询少数情况?我认为共同价值的数量将成为一个问题是否正确?

           Column           |  Type   |     Modifiers
----------------------------+---------+--------------------
 event_value                | integer | not null
Run Code Online (Sandbox Code Playgroud)

此列当前没有索引。而且我不认为需要定期只选择 0 或 1 值。

该表大小合理,目前有 3000 万行并且增长很快。

我很欣赏这不是该专栏的最佳用途,但在短期内不会改变。

postgresql index postgresql-9.6

9
推荐指数
1
解决办法
1162
查看次数