需要知道 PostgreSQL 如何在磁盘上订购记录。在这种情况下,我想利用文档中所述的索引组合,据我所知,它使用位图来获取匹配的行并根据它们的物理位置返回它们。有问题的表已按其主键聚集在一起。
据我了解,在集群完成后,PostgreSQL 不会自动继续进行集群(尽管它确实记得它是根据某个索引进行集群的)。现在,由于这是主键,我想知道物理存储顺序是否会根据它(如果是真的,我想利用我们的优势来进行特定查询)。
综上所述,PostgreSQL 如何对其新记录进行排序,尤其是在聚类之后?
非常感谢!
postgresql index database-design clustered-index physical-design
最近,我将 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。应该有什么理由 …
我知道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 数据库。一台机器保存客户端帐户信息(称为这台机器 C),另外两台机器保存客户端日志信息(称为 L1 和 L2)。拆分的原因是为了在多台机器上分开加载(所以一些客户端将日志信息发送到 L1,一些发送到 L2 ......也许还有一些时间 L3、L4,......)。
检索日志信息时,原则上我希望能够在 Ln 上的日志记录表和 C 上的客户帐户表之间进行 JOIN。实际上我不能这样做(即使我可以,我也希望以避免加载 C)。
我的想法是将 C 上的表复制到 L1、L2 中的每一个上,以便我可以进行连接。就来自 C 的表而言,C 是主表,L1、L2、... 是从表。但是对于 L1、L2 上的其他表,...这些机器是大师。它不完全是主-主复制,也不完全是主从。
是否可以说服 postgres(我正在运行 9.1)复制来执行此操作,或者如果没有其他软件包可以完成这项工作。作为最后的手段,我可以编写一些代码来定期同步表(我可以容忍一些延迟),但最好不要这样做!
提前致谢。
我有一个带有用户表的 heroku postgres 附加数据库。但是,当我尝试时select * from user,我得到的只是:
current_user
----------------
rtsjlhdfptlaqd
(1 row)
Run Code Online (Sandbox Code Playgroud)
表名肯定是user. 没有users桌子。我的应用程序中肯定有很多用户,但我似乎无法列出它们。
想法?
我安装了最新的 pgAdmin 4 (v2.1),但我发现(相关线程),目前,通过 SSH 隧道建立连接的唯一方法是使用另一个外部进程,pgAdmin 论坛中的一个示例说:
我设置了一个隧道,如下所示:
Run Code Online (Sandbox Code Playgroud)ssh -f dpage(at)hostname(dot)enterprisedb(dot)com -L 5999: hostname.enterprisedb.com:5432 -N(...) 我在 Mac 上运行,但同样的程序应该可以在 Linux 上运行。在 Windows 上,Putty iirc 中有一个隧道应用程序,但我不知道如何使用它。
我找到了一个简单的PuTTY 教程来使用 SSH Tunnel 建立连接。
连接已建立,但看起来,当我尝试通过 pgAdmin 连接时,它失败或被拒绝(使用127.0.0.1:3306或127.0.0.1:5432作为隧道的目的地)。为什么?
给定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) 我想验证一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 数组是否为空?
清理 WAL postgres 的正确方法是什么?我有一个超过 100 GB 的数据库,它在 pg_wal 中有大约 600 GB。我还设置了 2 个逻辑复制。
主从 - Postgres 10。
Master 和 Slaves 有评论wal_keep_segments和max_wal_size。
pg_archivecleanup没有使用%r选项,然后我通过在pg_controldata最新检查点的 REDO WAL 文件中搜索并删除了日志来获取存档名称,但随后一个副本因错误而停止
无法从 WAL 流接收数据:致命:请求的 WAL 段 xxx 已被删除
为了解决这个问题,我删除并重新创建了副本。
我们有一个整数列,目前仅包含 0 或 1 个值。此列现在已被开发人员用于在某些情况下存储唯一的 32 位标识符,我们需要能够有效地提取包含这些标识符中的任何一个的行。
鉴于该值在 99% 的情况下是 0 或 1(我还没有数字),如何最好地索引以查询少数情况?我认为共同价值的数量将成为一个问题是否正确?
Column | Type | Modifiers
----------------------------+---------+--------------------
event_value | integer | not null
Run Code Online (Sandbox Code Playgroud)
此列当前没有索引。而且我不认为需要定期只选择 0 或 1 值。
该表大小合理,目前有 3000 万行并且增长很快。
我很欣赏这不是该专栏的最佳用途,但在短期内不会改变。