我有一个 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)
文本字段的大小可以是任意大小。但是,在最坏的情况下,不会超过几千字节。
postgresql performance size disk-space postgresql-performance
我在一张桌子上有一个全文索引。是否可以检索索引(gist或gin)中使用的术语集?如果可能的话用重量?
澄清:
如果我有下表:
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 中获取它。
我正在尝试执行一项常见任务,从表中删除重复项,目的是添加唯一约束。
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 小时。对于我的示例方法来说,它可能仍在误差范围内,但我担心由于它不使用索引,这将花费指数时间。
这EXPLAIN有Seq Scan on item_identifier a和Seq 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)