gpt4 book ai didi

postgresql - PostgreSql 中的数十亿行 : partition or not to partition?

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

我有什么:

  • 简单的服务器,配备一个具有 8 个逻辑内核的至强处理器、16 GB 内存、2 个 7200rpm 驱动器的 mdadm raid1。
  • PostgreSQL
  • 需要处理大量数据。每天导入多达 3000 万行。
  • 时间 - 复杂的查询最多可以执行一个小时

表的简化模式,会很大:

id| integer | not null default nextval('table_id_seq'::regclass)
url_id | integer | not null
domain_id | integer | not null
position | integer | not null

上述模式的问题在于我没有关于如何对其进行分区的确切答案。所有期间的数据都将被使用(没有查询将有日期过滤器)。

我考虑过在“domain_id”字段上进行分区,但问题是很难预测每个分区会有多少行。

我的主要问题是:

如果我不使用分区修剪并且我不打算删除旧数据,那么分区数据是否有意义?

这样做的优点/缺点是什么?

如果我不进行分区,我的导入速度会如何降低?

另一个与归一化相关的问题:

url应该导出到另一个表吗?

规范化的优点

  • 表将包含平均大小为 20-30 字节的行。
  • “url_id”上的连接应该比“url”字段上的连接快得多

反规范化的优点

  • 可以更快地导入数据,因为我不必在每次插入之前查找“url”表。

有人可以给我任何建议吗?谢谢!

最佳答案

如果您要在大多数查询中使用选择标准以允许规划器在大多数时间跳过对大多数分区的访问,或者如果您想要定期清除分配给某个分区的所有行,则分区是最有用的分区,或两者兼而有之。 (删除表是删除大量行的一种非常快速的方法!)我听说有人达到了一个阈值,分区有助于使索引更浅,从而提高性能;但这实际上又回到了第一点,因为您有效地将索引树的第一层移到了另一个地方——它仍然必须发生。

从表面上看,分区听起来没有什么帮助。

另一方面,规范化可能会比您预期的更好地提高性能;通过使所有这些行变窄,您可以将更多行放入每个页面,从而减少总体磁盘访问。我会做适当的第三范式规范化,并且只会根据它会有所帮助的证据偏离它。如果您在仍有磁盘空间用于数据的第二个副本时发现性能问题,请尝试创建一个非规范化表并查看性能与规范化版本的比较情况。

关于postgresql - PostgreSql 中的数十亿行 : partition or not to partition?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10432565/

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