0

假设我正在构建一个堆栈交换克隆,每次我检查一个问题时,我也会加载每个答案。该表可能如下所示:

id          integer
question_id FOREIGN KEY
answer      bool
date        timestamp

我如何告诉 django 告诉 postgres 将所有答案放在一起以便快速访问?Postgres 具有基本功能CLUSTER USING

(CLUSTER USING 是表的“碎片整理”功能。这对于小记录特别适用,因为它们可能都最终在同一个磁盘块中并大大减少了加载时间。碎片整理通常在低负载时作为批处理作业完成)。

4

1 回答 1

2

据我所知,你不能。但是您可以将其视为数据库管理任务,并从 psql 命令行执行:

# CLUSTER table USING index_name;
# ANALYZE VERBOSE table;
# CLUSTER VERBOSE;

这将被记住。每次运行 CLUSTER VERBOSE 时,它都会锁定所有表并对数据进行排序。你所有的答案(在上面的例子中)都将被收集到磁盘上。即使对于固态存储,这也是有意义的,因为最终的数据库读取将覆盖更少的扇区,这意味着检索组的 I/O 操作更少。

显然你必须很好地选择你的索引:错误的选择会分散你实际访问的数据。性能优势对于稀疏数据集来说是最好的,如果大多数东西都被频繁访问,那么相关性就变得不那么重要了。

CLUSTER 功能的更好名称可能是“DEFRAG”,因为这是一种类似于对文件系统进行碎片整理的操作。

于 2013-05-16T19:13:14.953 回答