PostgreSQL 从 9.1 升级到 9.4 后性能下降

2023-12-28

将 Postgres 9.1 升级到 9.4 后,我的性能变得非常慢。下面是两个查询的示例,它们的运行速度明显慢得多。

注意:我意识到这些查询可能可以被重写以更有效地工作,但是我主要担心的是升级到较新版本的 Postgres 后,它们的运行速度突然慢了 100 倍!我希望有一个我忽略的地方的配置变量。

在进行升级时,我使用带有 --link 选项的 pg_upgrade 命令。 9.4和9.1之间的配置文件是相同的。它没有在完全相同的硬件上运行,但它们都在 Linode 上运行,并且我现在已经尝试为新服务器使用 3 个不同的 Linode,所以我不认为这是硬件问题。

似乎在这两种情况下,9.4 使用的索引与 9.1 不同?

9.1:

EXPLAIN ANALYZE SELECT "id", "title", "timestamp", "parent", "deleted", "sunk", "closed", "sticky", "lastupdate", "views", "oldid", "editedon", "devpost", "hideblue", "totalvotes", "statustag", "forum_category_id", "account_id" FROM "forum_posts" WHERE "parent" = 882269 ORDER BY "timestamp" DESC LIMIT 1;
                                                                         QUERY PLAN                                                                      
    -----------------------------------------------------------------------------------------------------------------------------------------------------
     Limit  (cost=63.87..63.87 rows=1 width=78) (actual time=0.020..0.020 rows=0 loops=1)
       ->  Sort  (cost=63.87..63.98 rows=45 width=78) (actual time=0.018..0.018 rows=0 loops=1)
             Sort Key: "timestamp"
             Sort Method: quicksort  Memory: 17kB
             ->  Index Scan using index_forum_posts_parent on forum_posts  (cost=0.00..63.65 rows=45 width=78) (actual time=0.013..0.013 rows=0 loops=1)
                   Index Cond: (parent = 882269)
     Total runtime: 0.074 ms
    (7 rows)

9.4:

EXPLAIN ANALYZE SELECT "id", "title", "timestamp", "parent", "deleted", "sunk", "closed", "sticky", "lastupdate", "views", "oldid", "editedon", "devpost", "hideblue", "totalvotes", "statustag", "forum_category_id", "account_id" FROM "forum_posts" WHERE "parent" = 882269 ORDER BY "timestamp" DESC LIMIT 1;
                                                                              QUERY PLAN                                                                               
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.42..63.48 rows=1 width=1078) (actual time=920.484..920.484 rows=0 loops=1)
   ->  Index Scan Backward using forum_posts_timestamp_index on forum_posts  (cost=0.42..182622.07 rows=2896 width=1078) (actual time=920.480..920.480 rows=0 loops=1)
         Filter: (parent = 882269)
         Rows Removed by Filter: 1576382
 Planning time: 0.166 ms
 Execution time: 920.521 ms
(6 rows)

9.1:

EXPLAIN ANALYZE SELECT "user_library_images"."id", "user_library_images"."imgsrc", "user_library_images"."library_image_id", "user_library_images"."type", "user_library_images"."is_user_uploaded", "user_library_images"."credit", "user_library_images"."orig_dimensions", "user_library_images"."account_id" FROM "user_library_images" INNER JOIN "image_tags" ON "user_library_images"."id" = "image_tags"."user_library_image_id" WHERE ("user_library_images"."account_id" = 769718 AND "image_tags"."tag" ILIKE '%stone%') GROUP BY "user_library_images"."id", "user_library_images"."imgsrc", "user_library_images"."library_image_id", "user_library_images"."type", "user_library_images"."is_user_uploaded", "user_library_images"."credit", "user_library_images"."orig_dimensions", "user_library_images"."account_id" ORDER BY "user_library_images"."id";

 Group  (cost=2015.46..2015.49 rows=1 width=247) (actual time=0.629..0.652 rows=6 loops=1)
   ->  Sort  (cost=2015.46..2015.47 rows=1 width=247) (actual time=0.626..0.632 rows=6 loops=1)
         Sort Key: user_library_images.id, user_library_images.imgsrc, user_library_images.library_image_id, user_library_images.type, user_library_images.is_user_uploaded, user_library_images.credit, user_library_images.orig_dimensions, user_library_images.account_id
         Sort Method: quicksort  Memory: 19kB
         ->  Nested Loop  (cost=0.00..2015.45 rows=1 width=247) (actual time=0.283..0.603 rows=6 loops=1)
               ->  Index Scan using index_user_library_images_account on user_library_images  (cost=0.00..445.57 rows=285 width=247) (actual time=0.076..0.273 rows=13 loops=1)
                     Index Cond: (account_id = 769718)
               ->  Index Scan using index_image_tags_user_library_image on image_tags  (cost=0.00..5.50 rows=1 width=4) (actual time=0.020..0.021 rows=0 loops=13)
                     Index Cond: (user_library_image_id = user_library_images.id)
                     Filter: (tag ~~* '%stone%'::text)
 Total runtime: 0.697 ms
(11 rows)

9.4:

Group  (cost=166708.13..166709.46 rows=59 width=1241) (actual time=9677.052..9677.052 rows=0 loops=1)
   Group Key: user_library_images.id, user_library_images.imgsrc, user_library_images.library_image_id, user_library_images.type, user_library_images.is_user_uploaded, user_library_images.credit, user_library_images.orig_dimensions, user_library_images.account_id
   ->  Sort  (cost=166708.13..166708.28 rows=59 width=1241) (actual time=9677.049..9677.049 rows=0 loops=1)
         Sort Key: user_library_images.id, user_library_images.imgsrc, user_library_images.library_image_id, user_library_images.type, user_library_images.is_user_uploaded, user_library_images.credit, user_library_images.orig_dimensions, user_library_images.account_id
         Sort Method: quicksort  Memory: 17kB
         ->  Hash Join  (cost=10113.22..166706.39 rows=59 width=1241) (actual time=9677.035..9677.035 rows=0 loops=1)
               Hash Cond: (image_tags.user_library_image_id = user_library_images.id)
               ->  Seq Scan on image_tags  (cost=0.00..156488.85 rows=11855 width=4) (actual time=0.301..9592.048 rows=63868 loops=1)
                     Filter: (tag ~~* '%stone%'::text)
                     Rows Removed by Filter: 9370406
               ->  Hash  (cost=10045.97..10045.97 rows=5380 width=1241) (actual time=0.047..0.047 rows=4 loops=1)
                     Buckets: 1024  Batches: 1  Memory Usage: 1kB
                     ->  Bitmap Heap Scan on user_library_images  (cost=288.12..10045.97 rows=5380 width=1241) (actual time=0.027..0.037 rows=4 loops=1)
                           Recheck Cond: (account_id = 769718)
                           Heap Blocks: exact=4
                           ->  Bitmap Index Scan on index_user_library_images_account  (cost=0.00..286.78 rows=5380 width=0) (actual time=0.019..0.019 rows=4 loops=1)
                                 Index Cond: (account_id = 769718)
 Planning time: 0.223 ms
 Execution time: 9677.109 ms
(19 rows)

====

运行分析脚本后(见下面的答案),问题就解决了。作为参考,这是新的 ANALYZE 输出(针对 9.4):

 Group  (cost=2062.82..2062.91 rows=4 width=248) (actual time=8.775..8.801 rows=7 loops=1)
   Group Key: user_library_images.id, user_library_images.imgsrc, user_library_images.library_image_id, user_library_images.type, user_library_images.is_user_uploaded, user_library_images.credit, user_library_images.orig_dimensions, user_library_images.account_id
   ->  Sort  (cost=2062.82..2062.83 rows=4 width=248) (actual time=8.771..8.780 rows=7 loops=1)
         Sort Key: user_library_images.id, user_library_images.imgsrc, user_library_images.library_image_id, user_library_images.type, user_library_images.is_user_uploaded, user_library_images.credit, user_library_images.orig_dimensions, user_library_images.account_id
         Sort Method: quicksort  Memory: 19kB
         ->  Nested Loop  (cost=0.87..2062.78 rows=4 width=248) (actual time=4.156..8.685 rows=7 loops=1)
               ->  Index Scan using index_user_library_images_account on user_library_images  (cost=0.43..469.62 rows=304 width=248) (actual time=0.319..2.528 rows=363 loops=1)
                     Index Cond: (account_id = 769718)
               ->  Index Scan using index_image_tags_user_library_image on image_tags  (cost=0.43..5.23 rows=1 width=4) (actual time=0.014..0.014 rows=0 loops=363)
                     Index Cond: (user_library_image_id = user_library_images.id)
                     Filter: (tag ~~* '%stone%'::text)
                     Rows Removed by Filter: 2
 Planning time: 2.956 ms
 Execution time: 8.907 ms
(14 rows)



Limit  (cost=65.81..65.81 rows=1 width=77) (actual time=0.256..0.256 rows=0 loops=1)
   ->  Sort  (cost=65.81..65.92 rows=47 width=77) (actual time=0.252..0.252 rows=0 loops=1)
         Sort Key: "timestamp"
         Sort Method: quicksort  Memory: 17kB
         ->  Index Scan using index_forum_posts_parent on forum_posts  (cost=0.43..65.57 rows=47 width=77) (actual time=0.211..0.211 rows=0 loops=1)
               Index Cond: (parent = 882269)
 Planning time: 2.978 ms
 Execution time: 0.380 ms
(8 rows)

pg_upgrade不会复制(或迁移)数据库的统计信息。

因此,您需要分析表以更新迁移数据库中的统计信息。pg_upgrade将创建一个名为的批处理文件/shell 脚本analyze_new_cluster可以用于此目的。

或者你可以使用vacuum analyze手动实现同样的事情。

可以通过查看执行计划来检测丢失的统计信息。预期行数与实际行数之间的差异太大:

(cost=0.00..286.78 rows=5380 width=0) (actual time=0.019..0.019 rows=4 loops=1)

==> 5380 与 4 行

or

(cost=0.00..156488.85 rows=11855 width=4) (actual time=0.301..9592.048 rows=63868 loops=1)

==> 11855 与 63868 行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL 从 9.1 升级到 9.4 后性能下降 的相关文章

  • Azure PostgreSQL 时间点还原不起作用

    我们在 Azure 中有一个 Postgre 数据库 但遇到了一个问题 表中的所有行都被删除 我们尝试使用 de azure 门户中的 时间点还原 选项 但创建的数据库与当前运行的数据库具有相同的数据 我们还尝试了其他日期和时间 数据库问题
  • JMeter:tearDown Thread Group的目的是什么

    我想了解JMeter中tearDown Thread Group的实际用法 在什么场景下可以使用tearDown Thread Group 根据提供的帮助JMeter 拆解线程组 http jmeter apache org userman
  • php postgresql pdo 从标准输入复制

    COPY table name field1 field2 field3 FROM STDIN CSV 1 2 q w 3 4 a s 5 6 d 如何通过 PDO 执行此查询 Update 问题是 PDO 驱动程序将此查询作为语句执行 例
  • 在 JavaScript 中嵌套“switch”案例:有速度优势吗?

    这里有新手问题 我有一个包含大量字符串的 开关 像这样按字母顺序拆分是否有速度优势 switch myString substring 0 1 case a switch myString case a string beginning w
  • H2 和 PostgreSQL 兼容模式限制

    我使用 H2 数据库作为内存数据库进行测试 其中 PostgreSQL 在生产中使用 除了两者之间存在一些细微差别之外 此设置工作正常 我现在关心的一个问题是PostgreSQL 中标识符的长度限制为 64 https www postgr
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 在 Pandas 中创建许多新列的最 Pythonic 方法

    我有一个大数据框df 约 100 列和约 700 万行 我需要创建约 50 个新变量 列 它们是当前变量的简单转换 一种方法是与许多人一起 apply声明 我只是使用transform 作为简单转换的占位符 例如max或平方 df new
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 快速 log2(float x) 实现 C++

    我需要在 C 中非常快速地实现 log2 float x 函数 我发现了一个非常有趣的实现 而且速度非常快 include
  • 使用登录名(用户)创建 PostgreSQL 9 角色只是为了执行函数

    我多年来一直在寻找这个 并且尝试了网络上的所有方法但没有成功 我可以在 MSSQL 中做到这一点 但我没有找到在 PostgreSQL 中做到这一点的方法 我想要实现的只是创建一个具有登录名的角色 该角色无法创建 删除或更改数据库 函数 表
  • 如何消除 jQuery Mobile 中的悬停延迟?

    我正在使用 jQuery Mobile 制作一个网站 当我将鼠标悬停在按钮上时 它会更改其类 并扩展其颜色 但感觉需要半秒左右才能完成 有没有办法减少这种延迟 您可以覆盖hoverDelay无需修改 jQuery Mobile js 库 要
  • 为什么 std::atomic 比 volatile bool 慢很多?

    多年来我一直使用 volatile bool 来控制线程执行 并且效果很好 in my class declaration volatile bool stop In the thread function while stop do th
  • sqlalchemy 的 row_to_json 语法

    我想弄清楚如何将 Postgres 9 2 row to json 与 SqlAlchemy 一起使用 但是我无法想出任何有效的语法 details foo row q select Foo where Foo bar id Bar id
  • WPF 应用程序在第一次交互(例如单击按钮)后停止/冻结

    我目前在 WPF 中遇到问题 UI 加载正常 但每当进行第一次用户交互时 例如单击按钮 应用程序似乎会停止 或者例如 如果我有两个显示 MessageBox 的按钮 则第一次单击将等待几秒钟 然后显示MessageBox 但任何后续交互都是
  • 哪种 SQL 模式能够更快地避免插入重复行?

    我知道有两种不重复插入的方法 第一个是使用WHERE NOT EXISTS clause INSERT INTO table name col1 col2 col3 SELECT s s s WHERE NOT EXISTS SELECT
  • 具有 JPA、PostgreSQL 和 NULL 值的 JodaTime

    我试图将 JPA 的 JodaTime DateTime 字段保留到 PostgreSQL 但遇到了指向数据库 NULL 值的空指针的问题 我正在使用 NetBeans 7 beta 2 IDE 持久性实现是 EclipseLink 2 2
  • SQL Not Empty 代替 Not NULL

    我正在使用 postgreSQL 我有一个专栏 NOT NULL 但是 当我想插入带有空字符串的行时 如下所示 它不会给我错误并接受 我如何检查插入值应该是not empty 既不为空也不为空 PS 我的专栏定义为 ads characte
  • 超慢的表格布局性能

    我遇到了糟糕的 TableLayout 性能 我在这里读过一些帖子 谈论同样的事情 Android 动态创建表 性能不佳 https stackoverflow com questions 9813427 android dynamical
  • 设置约束可延迟在 PostgreSQL 事务上不起作用

    情况是这样的 我有两个表 其中一个引用另一个 例如 table2 引用 table1 创建这些表时 我确实将外键约束设置为 DEFERRABLE 将 ON UPDATE 和 ON DELETE 子句设置为 NO ACTION 这是默认值 但
  • 未使用的功能会产生什么后果

    我想知道在代码中使用未使用的函数会产生什么 如果有什么后果 如果您查找并删除所有未使用的函数和变量 性能是否会有明显的改进 或者删除未使用的函数和变量只是一个好习惯 未使用的功能不会损害性能 他们让维护代码的人的工作变得更加困难 现代 ID

随机推荐

  • 与同时使用 minmax_element 相比 min_element 和 max_element 是否有任何效率优势?

    std minmax element 返回一个对 其中包含一个到最小元素的迭代器作为第一个元素 一个到最大元素的迭代器作为第二个元素 std min element 返回一个迭代器到范围 first last 中的最小元素 std max
  • 如何向我的 Linq 选择添加唯一的行号?

    我有以下代码 public IEnumerable
  • Django 1.5:访问 models.py 中的自定义用户模型字段

    我正在开发 Django 1 5 项目 我有一个自定义用户模型 我们称之为CustomUser 另一个应用程序 SomeApp 需要引用此自定义用户模型 为了ForeignKey等的目的 Django文档说使用 User settings
  • 连接两个字符数组?

    如果我有两个像这样的字符数组 char one 200 char two 200 然后我想做第三个连接这些的我该怎么做呢 我努力了 char three 400 strcpy three one strcat three two 但这似乎不
  • 使用 MultipartEntity 构造 POST 请求

    我想构造一个多部分请求 具有以下参数 名称 字符串 电子邮件 字符串 和文件上传 文件 我正在使用下面的 Java 代码 在 Android 中工作 httppost getRequestLine 打印 POST http www myur
  • Shell 重定向与显式文件处理代码

    我的母语不是英语 所以请原谅这个问题的尴尬标题 我只是不知道如何更好地表达它 我在 FreeBSD 机器上 我有一个用以下语言编写的小过滤工具C它通过读取数据列表stdin并通过输出处理后的列表stdout 我像这样调用它 find typ
  • 为什么微调器中的 onNothingSelected 没有被调用?

    我有一个 Android Spinner 当用户在显示 Spinner 的选择面板时按 后退键 时 我想监听该事件 我已经实现了 OnItemSelectedListener 但按后退键时未调用 onNothingSelected Adap
  • Django 的 mod_wsgi 错误:从守护进程读取响应标头时超时

    我正在运行 Django 2 0 4 和 mod wsgi 4 5 20 当我尝试将站点部署到我们的开发环境时 出现错误 parature 奇怪的是 该站点部署在根目录下VirtualHost正在正常响应 Tue Apr 10 13 34
  • 如何在字段级别创建元注释?

    我有这个带注释的休眠类 Entity public class SimponsFamily Id TableGenerator name ENTITY ID GENERATOR table ENTITY ID GENERATOR TABLE
  • Python有效地找到多个多项式的局部最大值/最小值

    我正在寻找一种有效的方法来查找多个 gt 100万 但独立的四阶多项式的局部最小值给定 指定范围 边界 我有两个要求 R1 即使对于 100 万个不同的多项式方程也有效 R2 局部最小值精确到 0 01 即 2dp 这是我使用创建的一些代码
  • 按计划手动触发 GitHub 操作

    我想按计划手动触发 GitHub 操作 但出现以下代码并出现错误 name Update data on workflow dispatch schedule cron 0 5 30 我正在寻找如何正确执行此操作的解决方案 并且有两种选择
  • 我将如何实现一种简单的基于堆栈的编程语言

    我有兴趣通过实现基于堆栈的编程语言来扩展我的计算机编程知识 我正在寻求从哪里开始的建议 因为我打算让它具有类似 pushint 1 会将值为 1 的整数推送到堆栈顶部 并通过诸如 之类的标签进行流量控制L01 jump L01 到目前为止
  • 我的回收者视图上的问题

    我正在尝试显示 recyclerview 并从 firebase 检索数据 但在添加保存在 firebase 存储上的图像后遇到问题 滚动后关闭 我有另一个 recyclerview 它使用相同的数据库 但没有问题 你能给我解决这个问题吗
  • eclipse插件开发

    我想开发一个eclipse插件 哪一个是最好的开始方式 本教程 http www vogella de articles EclipsePlugIn article html是一个很好的起点 然后 您可以通过阅读一本最新的 Eclipse
  • 如何将 Shell 脚本中的部分字符串提取到变量中

    我正在尝试在 sh 中执行以下操作 这是我的文件 foo bar Tests run 729 Failures 0 Errors 253 Skipped 0 baz 如何将 4 个数字拉入 4 个不同的变量 我现在已经在 sed 和 awk
  • C# 用户定义的 CSV 映射到 POCO

    我有一个从串行 UDP TCP 源读取输入数据的系统 输入数据只是不同数据类型 例如 DateTime double int string 的 CSV 示例字符串可能是 2012 03 23 12 00 00 1 000 23 inform
  • 是否可以告诉自动映射器在运行时忽略映射?

    我正在使用 Entity Framework 6 和 Automapper 将实体映射到 dtos 我有这个型号 public class PersonDto public int Id get set public string Name
  • MathJax 方程换行

    嘿 如果包含的元素具有固定大小 有谁知道让 MathJax 自动换行方程的好方法 MathJax v2 0 现在包括针对长显示方程的自动 可选 换行 它是由linebreaks的部分HTML CSS您的配置块 请参阅MathJax 文档 h
  • 在 TypeScript 中解构对象时重命名剩余属性变量

    EDIT 我在github上开了一个与此相关的问题 https github com Microsoft TypeScript issues 21265 https github com Microsoft TypeScript issue
  • PostgreSQL 从 9.1 升级到 9.4 后性能下降

    将 Postgres 9 1 升级到 9 4 后 我的性能变得非常慢 下面是两个查询的示例 它们的运行速度明显慢得多 注意 我意识到这些查询可能可以被重写以更有效地工作 但是我主要担心的是升级到较新版本的 Postgres 后 它们的运行速