【问题标题】:Optimize PostgreSQL read-only tables优化 PostgreSQL 只读表
【发布时间】:2011-11-18 00:59:36
【问题描述】:

我在 Postgres 数据库中有许多只读表。可以使用任何列组合查询所有这些表。

我可以做些什么来优化查询?为所有表的所有列添加索引是个好主意吗?

【问题讨论】:

  • 我会尝试确定大部分时间花在哪里(在哪些查询上),并首先针对这些进行优化。
  • 查询是动态生成的,我唯一知道的是它们是通过带有 orderby 子句(和限制/偏移)的一个或多个列过滤来选择的。没有连接。

标签: postgresql optimization indexing


【解决方案1】:

用于过滤加入(或者,在较小程度上,排序)的列对索引感兴趣。刚刚选择的列几乎没有相关性! 对于以下查询,只有 ae 上的索引可能有用:

SELECT a,b,c,d
FROM   tbl_a
WHERE  a = $some_value
AND    e < $other_value;

这里,f 可能还有 c 也是候选者:

SELECT a,b,c,d
FROM   tbl_a
JOIN   tbl_b USING (f)
WHERE  a = $some_value
AND    e < $other_value
ORDER  BY c;

创建索引后,测试它们是否真的对EXPLAIN ANALYZE 有用。还比较有和没有索引的执行时间。删除和重新创建索引既快速又简单。 experimentEXPLAIN ANALYZE 也有参数。差异可能是惊人的或根本不存在。
由于您的表是只读的,因此索引维护很便宜。这只是磁盘空间的问题。

如果你真的想知道你在做什么,start by reading the docs

如果您不知道会发生什么查询...

  1. 尝试记录足够多的查询以查找典型用例。使用参数log_statement = all 记录查询。或者只使用log_min_duration_statement 记录慢速查询。

  2. 创建可能有用的indexes,并在一段时间后检查统计信息以查看实际使用的内容。 PostgreSQL 为monitoring statistics 提供了完整的基础设施。研究统计数据(和许多其他任务)的一种便捷方法是pgAdmin,您可以在其中选择表/函数/索引并在对象浏览器(主窗口)的“统计”选项卡上获取所有数据。

  3. 按照上述步骤操作,看看使用中的索引是否真的可以加快速度。

  4. 如果查询规划器应该选择使用您的一个或多个索引但没有或产生不利影响,那么您的设置可能有问题,您需要研究the basics of performance optimization: vacuum, analyze, cost parameters, memory usage, ...

【讨论】:

  • 查询是动态生成的,我唯一知道的是它们是通过带有 orderby 子句(和限制/偏移)的一个或多个列过滤的选择。没有连接。在这种情况下,您是否认为在所有列上添加索引是一种好习惯?
  • 只是在所有列上添加索引可能有帮助,也可能没有帮助。索引确实有成本,尤其是对于大量写入的表。只读表的情况较少。我在上面的答案中添加了一段。
  • 不幸的是,我无法找到典型的用例,因为一旦项目完成,我将无法访问服务器。我想尽我所能在开发阶段对其进行优化。无论如何,很多有用的提示。谢谢。
  • 为什么只有 a 和 e 上的索引可能有用?
  • @KyelJmD:第一个例子确实如此,解释用粗体字母给出:ae 用于过滤结果。 (WHERE a = $some_value AND e &lt; $other_value.
【解决方案2】:

如果您按更多列进行过滤,索引可能会有所帮助,但不会太多。此外,索引可能对小表没有帮助。

首先搜索“postgresql 调优”——你会发现有用的信息。

如果数据库可以放入内存 - 购买足够的 RAM。 如果数据库无法装入内存 - SSD 会有所帮助。 如果这还不够并且数据库是只读的 - 运行 2、3 或更多服务器。或分区数据库(在最好的情况下适合每个服务器的内存)。

即使生成了查询,我认为它们也不会是随机的。监控数据库中的慢查询并仅改进它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 2021-09-05
    相关资源
    最近更新 更多