gpt4 book ai didi

django - 使用 Django QuerySet 分块处理数据库的最佳方法?

转载 作者:行者123 更新时间:2023-11-29 11:27:26 25 4
gpt4 key购买 nike

我正在对数据库中的所有行运行批处理操作。这涉及选择每个模型并对其进行处理。将其分成 block 并逐 block 执行是有意义的。

我目前正在使用 Paginator,因为它很方便。这意味着我需要对值进行排序,以便它们可以按顺序分页。这确实会生成具有 orderlimit 子句的 SQL 语句,对于每个 block ,我认为 Postgres 可能正在对整个表进行排序(尽管我不能声称有任何知识关于内部)。我所知道的是数据库的 CPU 使用率大约为 50%,我认为这对于执行 selects 来说太高了。

以 RDMBS/CPU 友好的方式遍历整个表的最佳方式是什么?

假设数据库的内容在批处理过程中没有改变。

最佳答案

根据您的描述,您实际上并不关心您处理的行的排序顺序。如果您的表中有主键(我希望如此!),这种粗略的分区方法会快得多:

SELECT * FROM tbl WHERE id BETWEEN 0    AND 1000;
SELECT * FROM tbl WHERE id BETWEEN 1001 AND 2000;
...

这对任何偏移执行相同的操作,并且(几乎)对任何大小的表执行相同的操作。相应地检索主键和分区的最小值和最大值:

SELECT min(id), max(id) from tbl; -- then divide in suitable chunks

相对于:

SELECT * FROM tbl ORDER BY id LIMIT 1000;
SELECT * FROM tbl ORDER BY id LIMIT 1000 OFFSET 1000;
...

这通常较慢,因为所有行都必须排序,并且性能会随着偏移量越大和表越大而进一步降低。

关于django - 使用 Django QuerySet 分块处理数据库的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8706665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com