自动检测“random_page_cost”与“seq_page_cost”

gue*_*tli 10 postgresql ssd

我阅读了这篇关于 SSD 上 PostgreSQL 性能的文章:

https://amplitude.engineering/how-a-single-postgresql-config-change-improved-slow-query-performance-by-50x-85593b8991b0

这两个配置似乎很重要random_page_costvsseq_page_cost

由于两个参数都需要匹配特定的硬件,我想知道是否可以自动检测匹配值?

更新

我脑子里有这些步骤:

  1. 脚本创建一些虚拟表
  2. 脚本向表中插入数据
  3. 脚本执行一些查询
  4. 脚本显示 random_page_cost 和 seq_page_cost 的匹配值
  5. 人工或自动化系统获取这些值并更新配置。这一步不是问题的一部分。

Eva*_*oll 11

由于两个参数都需要匹配特定的硬件,我想知道是否可以自动检测匹配值?

自动设置参数当然是可能的,但没有人提交过补丁来做到这一点。

您需要知道驱动器的顺序和非顺序读取速度。有一吨的方式来获得,但你可能只是以及使用谷歌,因为它可能并不重要的是很多。例如,在谷歌快速搜索三星 SSD 840 Pro (256GB)的顺序和非顺序读取性能时,AnandTech 显示了这一点,其中

  • 随机读取 101.4/mbps
  • 顺序读取 510.7/mbps

这大约是 1:5 的比例,所以

SET random_page_cost = 5;
SET seq_page_cost = 1;
Run Code Online (Sandbox Code Playgroud)

警告,random_page_cost考虑到缓存,

随机访问机械磁盘存储通常比四倍顺序访问昂贵得多。但是,使用较低的默认值 (4.0),因为对磁盘的大多数随机访问(例如索引读取)都假定在缓存中。默认值可以被认为是将随机访问建模为比顺序慢 40 倍,同时期望缓存 90% 的随机读取。

如果您认为 90% 的缓存率对于您的工作负载是不正确的假设,您可以增加random_page_cost以更好地反映随机存储读取的真实成本。相应地,如果您的数据很可能完全在缓存中,例如当数据库小于服务器总内存时,random_page_cost则可以适当减少。相对于顺序的随机读取成本较低的存储,例如固态驱动器,也可以用较低的 值更好地建模random_page_cost

我已经证明我的random_page_cost速度比顺序慢 5 倍。它仍然是一个通配符,random_page_cost已经缓存了多少。唉,这些值并不重要,除非索引扫描和顺序扫描非常接近,以至于您可以合理地意外选择顺序扫描。很少有这种情况。索引将速度提高数千倍的情况并不少见。

例如,我的cpu_index_tuple_cost0.005. AFAIK,这意味着在规划者眼中扫描索引中的 1000 个条目与去一次堆获取一个块是一样的。

  • 仅比较随机与顺序速度以选择 random_page_cost 并直接获取该值可能不是一个好主意,对吗?_随机访问机械磁盘存储通常**比四次**顺序访问昂贵得多。但是,使用较低的默认值 (4.0),因为对磁盘的大多数随机访问(例如索引读取)都假定在缓存中。默认值可以被认为是将随机访问建模为 ** 比顺序慢 40 倍**,同时期望缓存 90% 的随机读取。_(强调我的) (2认同)