在Django中使用Postgres的集群(表碎片整理/打包)

时间:2013-05-16 19:13:15

标签: postgresql django-models

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

id          integer
question_id FOREIGN KEY
answer      bool
date        timestamp

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

(CLUSTER USING是表的“碎片整理”功能。这对于小记录尤其有用,因为它们可能最终都在同一磁盘块中并大大减少了加载时间。碎片整理通常以批处理作业的形式进行低负荷)。

1 个答案:

答案 0 :(得分:1)

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

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

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

显然,您必须选择好您的索引:错误的选择可能会分散您实际访问的数据。对于稀疏数据集,性能优势最佳,如果经常访问大多数内容,则性能优势变得不那么重要。

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