如何从频繁访问的表中删除多行

2023-11-26

我需要删除一个非常大的表(例如 500 万行)的大部分(例如 90%)。该表的另外 10% 被频繁读取,但不被写入。

From "按 ID 删除数百万行的最佳方法”,我认为我应该删除要删除的 90% 上的所有索引,以加快该过程(除了我用来选择要删除的行的索引)。

From "PostgreSQL 锁定模式“,我看到此操作将获得ROW EXCLUSIVE锁定整个表。但由于我只是reading另外10%,这应该不重要。

那么,在一个命令中删除所有内容是否安全(即DELETE FROM table WHERE delete_flag='t')?我担心如果删除一行失败,会触发enormous回滚,那么它将影响我从表中读取的能力。批量删除会更明智吗?


  1. 索引通常对于 90% 的行的操作是无用的。无论哪种方式,顺序扫描都会更快。 (特殊情况除外。)

  2. 如果需要允许并发读取,则不能在表上使用排他锁。因此,您也不能在同一事务中删除任何索引。

  3. You could删除单独事务中的索引,以将独占锁的持续时间保持在最短水平。在 Postgres 9.2 或更高版本中,您还可以使用同时删除索引,只需要最少的锁。稍后使用CREATE INDEX CONCURRENTLY在后台重建索引 - 并且只采取非常短暂的独占锁定。

如果您有稳定的条件来识别保留的 10%(或更少)行,我建议部分索引仅在这些行上获得最佳效果:

  • 读取查询可以随时快速访问表(使用部分索引)。
  • The big DELETE根本不会修改部分索引,因为没有任何行参与DELETE.
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;

假设delete_flag is boolean。您必须在查询中包含相同的谓词(即使它看起来在逻辑上是多余的)以确保 Postgres 可以使用部分索引。

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

如何从频繁访问的表中删除多行 的相关文章

随机推荐

  • 核心数据 NSPredicate“已删除 == NO”无法按预期工作

    我正在将 UIManagedDocument 与父子上下文一起使用 在我的孩子的背景下 我做了以下事情 Code 1 NSSet results self event memberships filteredSetUsingPredicat
  • Chrome 版本 102.0.5005.61 破坏了我的 CSS/HTML

    我有一个网站已经工作了很长时间 今天我的一位同事告诉我 更新到最新版本的 Chrome 后 该网站在几个地方出现了故障 我使用所使用的 html 和 css 创建了该问题的快速小样本 这个问题似乎与使用列有关 据我所知 box sizing
  • 如何使用 LINQ to SQL 执行 CROSS JOIN?

    如何使用 LINQ to SQL 执行 CROSS JOIN 交叉连接只是两个集合的笛卡尔积 没有明确的连接运算符 var combo from p in people from c in cars select new p Name c
  • 如何在 YAML 文件中使用变量?

    我有 YAML 文件 需要将变量作为输入 outputters type DateFileOutputter name logfile level DEBUG date pattern Y m d trunc false dirname h
  • 如何在空格而不是引号之间进行分割? [复制]

    这个问题在这里已经有答案了 我试图仅在空格上分割字符串 s 但不在 引用 部分之间 我通过以下方式匹配这些引用部分之间的所有文本 1 Regex101 但是 当我尝试将其添加为否定前瞻 仅在这些引号之外的空白处进行分割时 我无法让它工作 s
  • 如何向 aws sso 用户授予 eks 集群权限?

    我通过 IAM 用户部署了 EKS 集群 需要向其他 aws sso 用户授予完整的集群权限 我遵循了这个指示https docs aws amazon com eks latest userguide add user role html
  • 如何将 AudioFilePlayer AudioUnit 连接到 3DMixer?

    我正在尝试将 AudioFilePlayer AudioUnit 连接到 AU3DMixerEmbedded 音频单元 但没有成功 这就是我正在做的 创建一个AUGraph with NewAUGraph 打开图表 初始化图表 添加3个节点
  • iOS 14 SwiftUI 键盘自动抬起视图

    我在视图中使用 TextField 当它成为第一响应者时 它会离开视图 如下面的 GIF 所示 有什么办法可以摆脱这种行为吗 这是我的代码 NavigationView content ZStack MyTabView selectedIn
  • Safari 上的 HTML5 音频标签有延迟

    我正在尝试使用 html 标签来完成一个简单的类似涂鸦的行为 其中点击时会响起 mp3 ogg 声音 它应该可以在 Firefox Safari 和 iPad Safari 下运行 这是非常理想的 我尝试了很多方法 最终得出以下结论 HTM
  • Google Calendar Api,会议室可用吗?

    如何列出特定日期时间的特定日历资源 房间 的可用性 就像如果我想列出会议室的所有今天活动 跨今天预订会议室的所有用户帐户活动 哪个谷歌日历 api 调用可以给我这个 我从 Google 日历资源 api 获取房间详细信息 但无法获取不同帐户
  • 是否需要“do {...} while ( )”循环?

    Bjarne Stroustrup C 创建者 曾经说过 他避免使用 do while 循环 而更喜欢用 while 循环来编写代码 参见下面的引用 自从听到这件事后 我发现这是真的 你怎么看 有没有一个例子 其中 do while 比使用
  • Socket.IO:XHR 轮询断开连接延迟

    我正在使用 socket io 和 node js 我在跟踪哪些用户在线时遇到问题 因为套接字 IO 识别 XHR 轮询客户端已断开连接之前有几秒钟的延迟 如果 XHR 轮询客户端刷新页面 他们的新连接消息似乎先于断开连接消息 当尝试跟踪哪
  • 如何使用open id作为登录系统

    我想尝试在我要创建的网站上使用开放 ID 作为登录系统 我已经查看了这个网站 但我不太确定这一切是如何运作的以及如何使其发挥作用 http remysharp com 2007 12 21 how to integrate openid a
  • 使用 SonarQube 5.2 构建 Breaker 插件

    似乎是构建断路器插件不再与 SonarQube 5 2 兼容 如果声纳门未满足 是否有任何替代方案可以避免 VSO 构建失败 或者是否计划将 Build Breaker 插件更新到 5 2 目前 没有任何插件会在质量门未通过时破坏构建声纳Q
  • 如何获取菜单项的操作视图?

    这是我的代码 home xml
  • 可以选择在 Angular 4 中应用 http 拦截器

    以下 url 解释了如何在 Angular 4 中使用 http 拦截器 https angular io guide http intercepting all requests or responses 但是 我想知道是否有什么方法可以
  • 使用 Microsoft Graph API 创建“作为在线会议的活动”或仅创建在线会议

    任何在特定租户下登录我们系统 IdentityServer 作为身份验证 的用户都应该能够创建在线会议 MS Teams 活动 我们跟随使用 Microsoft Graph 构建 ASP NET Core MVC 应用程序 and 创建并启
  • 使用mockito模拟构造函数

    我想将构造函数模拟为方法 public String generaID GeneraIDParaEntidadCliente aux new GeneraIDParaEntidadCliente nombre registro entida
  • 将 seeds.rb 分成多个部分?

    我想将 seeds rb 文件分成多个部分以便于维护 将所有 A 种子放入 a rb 中 将 B 种子放入 b rb 中 等等 单独的文件位于 db 目录中 包含 seeds rb 每个文件都包含一堆 A create 或 B create
  • 如何从频繁访问的表中删除多行

    我需要删除一个非常大的表 例如 500 万行 的大部分 例如 90 该表的另外 10 被频繁读取 但不被写入 From 按 ID 删除数百万行的最佳方法 我认为我应该删除要删除的 90 上的所有索引 以加快该过程 除了我用来选择要删除的行的