ale*_*lex 3 postgresql index memory postgresql-9.3
我的笔记本电脑上有 6GB 的 RAM,为了进行测试,我在 PostgreSQL 9.3 中创建了一个 5000 万行的表。然后我想在表上创建一个索引。
表和结果索引一起(或表总大小的两倍)可以放入 5GB 的 RAM,我设置maintenance_work_mem为 5GB,仍然CREATE INDEX使用外部排序和大约 1.4GB 的临时文件。为什么呢?
我对它应该能够在 RAM 中进行排序的期望是不合理的吗?
test=# set maintenance_work_mem to '5GB';
SET
test=# create table t1 as (select i::int, random() as f from generate_series(1, 50000000) i);
SELECT 50000000
test=# select pg_size_pretty(pg_relation_size('t1'));
pg_size_pretty
----------------
2111 MB
(1 row)
test=# create index on t1(f, i);
CREATE INDEX
test=# select pg_size_pretty(pg_relation_size('t1_f_i_idx'));
pg_size_pretty
----------------
1504 MB
(1 row)
Run Code Online (Sandbox Code Playgroud)
在服务器日志中:
LOG: temporary file: path "base/pgsql_tmp/pgsql_tmp22623.1", size 1073741824
STATEMENT: create index on t1(f, i);
LOG: temporary file: path "base/pgsql_tmp/pgsql_tmp22623.2", size 327622656
LOG: external sort ended, 171065 disk blocks used: CPU 6.78s/268.73u sec elapsed 313.18 sec
Run Code Online (Sandbox Code Playgroud)
有没有办法CREATE INDEX在实际运行之前计算内存需求?
通过 9.3 版,用于排序的间接数组必须适合单个 1GB 内存分配。这对可以在内存中排序的元组数量造成了人为限制。一旦达到该限制,它就必须切换到磁盘排序,即使还有剩余内存。
此限制已在 9.4 版中删除。
| 归档时间: |
|
| 查看次数: |
1541 次 |
| 最近记录: |