优化PostgreSQL只读表

nar*_*duk 7 postgresql indexing optimization

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

我该怎么做才能优化查询?向所有表的所有列添加索引是一个好主意吗?

Erw*_*ter 14

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

SELECT a,b,c,d
  FROM tbl_a
 WHERE a = $some_value
   AND e < $other_value;
Run Code Online (Sandbox Code Playgroud)

在这里,fc可能也是候选者:

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

创建索引后,测试它们是否真的有用EXPLAIN ANALYZE.还可以比较使用和不使用索引的执行时间.删除和重新创建索引非常简单快捷.还有一些参数,试验EXPLAIN ANALYZE.差异可能是惊人的或不存在的.
由于您的表是只读的,索引维护很便宜.这只是盘空间的问题.

如果您真的想知道自己在做什么,请先阅读文档.

如果你不知道会发生什么样的疑问......

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

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

  3. 按上述步骤继续查看使用中的索引是否真正加快了速度.

  4. 如果查询规划器应该选择使用一个或多个索引但是没有或产生不利影响,那么您的设置可能出现问题,您需要研究性能优化的基础知识:真空,分析,成本参数,内存使用情况等. ..

  • 仅在所有列上添加索引可能有帮助,也可能没有帮助。索引确实有成本,特别是对于写得很深的表。对于只读表则较少。我在上面的答案中添加了一段。 (2认同)