当前位置: 首页 > 面试题库 >

postgresql / vacuum中大量活动/死元组不起作用

朱保赫
2023-03-14
问题内容

有一个表,其中有200行。但是显示的活动元组的数量不止于此(约60K)。

select count(*) from subscriber_offset_manager;
 count 
-------
   200
(1 row)


 SELECT schemaname,relname,n_live_tup,n_dead_tup FROM pg_stat_user_tables  where relname='subscriber_offset_manager' ORDER BY n_dead_tup
;
 schemaname |          relname          | n_live_tup | n_dead_tup 
------------+---------------------------+------------+------------
 public     | subscriber_offset_manager |      61453 |          5
(1 row)

但是从pg_stat_activity和pg_locks可以看出,我们无法跟踪任何打开的连接。

SELECT query, state,locktype,mode
FROM pg_locks
JOIN pg_stat_activity
  USING (pid)
WHERE relation::regclass = 'subscriber_offset_manager'::regclass
  ;
 query | state | locktype | mode 
-------+-------+----------+------
(0 rows)

我也在这张桌子上尝试了全真空,结果如下:

  • 一直没有删除任何行
  • 有时,所有的活动元组都变成死元组。

这是输出。

vacuum FULL VERBOSE ANALYZE subscriber_offset_manager;
INFO:  vacuuming "public.subscriber_offset_manager"
INFO:  "subscriber_offset_manager": found 0 removable, 67920 nonremovable row versions in 714 pages
DETAIL:  67720 dead row versions cannot be removed yet.
CPU 0.01s/0.06u sec elapsed 0.13 sec.
INFO:  analyzing "public.subscriber_offset_manager"
INFO:  "subscriber_offset_manager": scanned 710 of 710 pages, containing 200 live rows and 67720 dead rows; 200 rows in sample, 200 estimated total rows
VACUUM

 SELECT schemaname,relname,n_live_tup,n_dead_tup FROM pg_stat_user_tables  where relname='subscriber_offset_manager' ORDER BY n_dead_tup
;
 schemaname |          relname          | n_live_tup | n_dead_tup 
------------+---------------------------+------------+------------
 public     | subscriber_offset_manager |        200 |      67749

10秒后

SELECT schemaname,relname,n_live_tup,n_dead_tup FROM pg_stat_user_tables  where relname='subscriber_offset_manager' ORDER BY n_dead_tup
;
 schemaname |          relname          | n_live_tup | n_dead_tup 
------------+---------------------------+------------+------------
 public     | subscriber_offset_manager |      68325 |        132

我们的应用程序如何查询此表。

  • 我们的应用程序通常选择一些行,并根据一些业务计算来更新该行。

选择查询 -根据一些ID选择

选择* from subscription_offset_manager其中shard_id = 1;

更新查询 -为此选定的分片ID更新其他一些列

  • 大约20个线程并行执行此操作,而一个线程仅在一行上工作。

  • 应用程序是用Java编写的,我们正在使用hibernate进行数据库操作。

  • PostgreSQL版本是9.3.24

另一个有趣的观察:
-当我停止我的Java应用程序然后完全吸尘时,它可以正常工作(行数和活动元组变为相等)。因此,如果我们从Java应用程序中连续选择并更新,则会出问题。–

问题/问题

这些活动元组有时会变成死元组,过了一段时间又复活了。

由于上述行为,请从表中进行选择,因为要花费大量时间并增加服务器的负载,因为那里有很多实时/重复数据。


问题答案:

我知道VACUUM无法完成工作的三件事:

  • 长期交易。

  • 未提交的准备好的事务。

  • 过时的复制插槽。

有关详细信息,请参见我的博客文章。



 类似资料:
  • 问题内容: 有一个表,其中有200行。但是显示的活动元组的数量不止于此(约60K)。 但是从pg_stat_activity和pg_locks可以看出,我们无法跟踪任何打开的连接。 我也在这张桌子上尝试了全真空,结果如下: 一直没有删除任何行 有时所有的活动元组变成死元组。 这是输出。 10秒后 我们的应用程序如何查询此表。 我们的应用程序通常选择一些行,并根据一些业务计算来更新该行。 选择查询

  • 有一个表,有200行。但是显示的实时元组数量不止于此(大约 60K)。 但从pg_stat_activity和pg_locks可以看出,我们无法跟踪任何打开的连接。 我也尝试了全真空在这张桌子上,以下是结果: 所有时间都没有删除行 有时所有活元组都变成死元组。 这是输出。 10秒后 我们的应用程序如何查询此表。 > < li> 我们的应用程序通常选择一些行,并根据一些业务计算来更新这些行。 sel

  • 问题内容: 我试图通过这样的活动来隐藏UI中的元素 但是当我将此插件作为另一个EClipse应用程序运行时,该按钮仍然存在。我究竟做错了什么? 问题答案: 的值采用以下格式: 因此,您必须确定哪个插件有助于菜单项。查看Eclipse Papyrus,下载该插件似乎是这样,该模式可能是: (假设isEqualityPattern =“ true”,则所有字符都需要转义正则表达式版本)

  • 在工作中,当通过firebase门户创建动态链接时,我们尝试使用可选的活动跟踪UTM参数。 动态链接工作正常,据我所知,从所有官方文档中可以看出,在创建动态链接时,只需在最后一个可选步骤中添加UTM值,就应该会导致这些值与事件一起发送。 但是,当我们在dynamic_link_app_open事件的事件或转化标签上查看没有看到任何归因值。我们看到该事件正在发送,但我们只是没有获得广告系列归因值,因

  • 我有使用碎片的活动。但如果我想使用OnClickListener,我的应用程序就会崩溃。如果我不使用OnClickListener,那么一切都可以。我该如何解决这个问题呢?这是我的代码。 d/gralloc_goldfish(796):检测到没有GPU仿真的仿真程序。d/AndroidRuntime(923):Threadid=1:线程退出但未捕获异常(组=0x41465700)致命异常:Main