小编Joe*_*Joe的帖子

测量 PostgreSQL 表行的大小

我有一个 PostgreSQL 表。select *很慢,但又select id好又快。我认为可能是行的大小非常大并且需要一段时间来运输,或者可能是其他一些因素。

我需要所有字段(或几乎所有字段),因此仅选择一个子集不是一个快速解决方案。选择我想要的字段仍然很慢。

这是我的表架构减去名称:

integer                  | not null default nextval('core_page_id_seq'::regclass)
character varying(255)   | not null
character varying(64)    | not null
text                     | default '{}'::text
character varying(255)   | 
integer                  | not null default 0
text                     | default '{}'::text
text                     | 
timestamp with time zone | 
integer                  | 
timestamp with time zone | 
integer                  | 
Run Code Online (Sandbox Code Playgroud)

文本字段的大小可以是任意大小。但是,在最坏的情况下,不会超过几千字节。

问题

  1. 有什么关于这叫“疯狂低效”的吗?
  2. 有没有办法在 Postgres 命令行中测量页面大小来帮助我调试?

postgresql performance size disk-space postgresql-performance

119
推荐指数
5
解决办法
10万
查看次数

我可以获得 Postgres 全文索引的并集吗?

我在一张桌子上有一个全文索引。是否可以检索索引(gistgin)中使用的术语集?如果可能的话用重量?

澄清:

如果我有下表:

create table "test" (id integer, thing tsvector);
Run Code Online (Sandbox Code Playgroud)

然后我在它上面做一个 GIST 索引:

create index thing_index on test using gist (thing);
Run Code Online (Sandbox Code Playgroud)

然后是一些数据:

insert into test (id, thing)
values (1, 'one'),(2, 'two'), (3, 'three'), (4, 'one'), (5, 'two');
Run Code Online (Sandbox Code Playgroud)

该索引thing_index将包含以下映射:

'one' => {1, 4}
'two' => {2, 5}
'three' => {3}
Run Code Online (Sandbox Code Playgroud)

我想从索引中获得以下响应:

'one',
'two',
'three'
Run Code Online (Sandbox Code Playgroud)

甚至可能有排名:

'one' => 2
'two' => 2
'three' => 1
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过扫描和构建我自己的索引来自己做这件事,但如果可能的话,我想从 Postgres 中获取它。

postgresql full-text-search

7
推荐指数
1
解决办法
281
查看次数

这是 DELETE ... WHERE EXISTS 查询计划 O(n*2) 还是 O(n^2) ?

我正在尝试执行一项常见任务,从表中删除重复项,目的是添加唯一约束。

CREATE TABLE IF NOT EXISTS item_identifier (
    pk       BIGSERIAL PRIMARY KEY,
    prefix   INTEGER NOT NULL,
    suffix   VARCHAR(1024) NOT NULL
);
CREATE INDEX temp_prefix_suffix_idx ON item_identifier (prefix, suffix);
Run Code Online (Sandbox Code Playgroud)

我想使用常见查询删除重复项,该查询可以在本网站的许多答案中找到。我认为重复率大约为 1%,因此没有太多需要删除的内容。

提供索引纯粹是为了帮助重复数据删除,稍后将被删除。不过,如您所见,PostgreSQL 甚至没有使用它!

有 2,759,559,168 行。索引temp_prefix_suffix_idx本身约为 100 GB。花CREATE INDEX了 12 个小时所以我不指望DELETE会很快。但根据 10% 的样本集,我推断需要 20 小时,而实际上已经花了 40 小时。对于我的示例方法来说,它可能仍在误差范围内,但我担心由于它不使用索引,这将花费指数时间。

EXPLAINSeq Scan on item_identifier aSeq Scan on item_identifier b

EXPLAIN DELETE FROM item_identifier a
  WHERE EXISTS
    (SELECT FROM item_identifier b
       WHERE a.prefix …
Run Code Online (Sandbox Code Playgroud)

postgresql exists query-performance postgresql-performance

5
推荐指数
1
解决办法
425
查看次数