PostgreSQL:count() 还是保留一个计数器?

2023-12-06

我有两个处于一对多关系的表。假设对于表中的每一行foo, 表中可以有 0 行或多行bar引用该行foo.

客户想知道有多少行bar引用一行foo,对于中的所有行foo.

我可以通过以下查询来完成此操作:

SELECT count(bar_id) FROM bar WHERE bar.foo_id = foo.foo_id;

但是,如果表foo and bar很大吗?说foo有 100 万行,并且bar有 1000 万行。我们还假设 99% 的行foo计数将少于 1,000bar引用它的行。假设客户通常要求大约 100 行foo一次。

我应该使用带有外键索引的朴素 count() 查询,还是保留一个计数器会更好?甚至可以保留一个柜台吗?通过使用触发器以原子增量和减量更新计数器bar,我相信这是可能的,但我可能是错的。


也许与直觉相反,您可能会发现简单的count除非您的工作负载非常偏向于读取,否则该方法速度更快。

这样做的原因是计数器表的作用是序列化更新,因此只有一个事务正在更新给定的foo可以在任何给定时间飞行。这是因为更新计数器的触发器的更新将锁定该计数器foo的条目在计数器表中,并且在事务回滚或提交之前不会释放它。

更糟糕的是,如果您的交易影响不止一个foo另一笔交易也是如此,其中一笔交易很有可能由于死锁而中止。

坚持简单的计数,直到你有充分的理由改变它。

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

PostgreSQL:count() 还是保留一个计数器? 的相关文章

  • 如何使用PostGIS将多边形数据转换为线段

    我在 PostgreSQL PostGIS 中有一个多边形数据表 现在我需要将此多边形数据转换为其相应的线段 谁能告诉我如何使用 PostGIS 查询进行转换 提前致谢 一般来说 将多边形转换为线可能并不简单 因为没有一对一的映射 http
  • Google Cloud SQL - Postgresql 存储不断增长

    我最近开始修补 Google Cloud SQL PostgreSQL 我创建了一个空数据库 在 4 5 天的时间里 其存储使用量已增长到超过 20GB 它一直在上升 但数据库中没有数据 它甚至没有被使用 有谁知道会发生什么以及如何阻止它
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • 如何在使用连接池时强制 SqlConnection 物理关闭?

    我明白 如果我实例化一个 SqlConnection 对象 我实际上是从连接池中获取一个连接 当我调用 Open 时 它将打开连接 如果我对该 SqlConnection 对象调用 Close 或 Dispose 方法 它将返回到连接池 但
  • 如何在 Visual Studio 中更改 Azure 数据库表的列顺序

    我整个下午都在寻找在 MS Visual Studio 2022 中重新排序 Azure 数据库表列的方法 没有运气 在其他应用程序中 可以通过拖动或剪切和粘贴轻松重新排列列 这里无能为力 此时 我什至不确定可以在 VS 中移动列 我只对
  • 如何在不运行 PostgreSQL 服务器的情况下初始化 PostgreSQL 数据库

    在初始化脚本中 我想初始化 PostgreSQL 目录 但在此阶段不需要 也不希望 正在运行的 PostgreSQL 服务器 如果我只是创建集群 作为用户postgres initdb D 但是 我还需要创建 PostgreSQL 角色 创
  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • PHP 通过 SSL 连接到 MS SQL

    我想要实现的目标非常简单 我想通过安全连接从 PHP 脚本连接到外部 MS SQL 数据库 然而 这已被证明是有问题的 到目前为止 经过三个小时的研究 我不知所措 客户端的平台是Ubuntu 这意味着我无法使用SQLSRV 安全连接已经在不
  • wal_keep_segments 为什么是最小值而不是最大值?

    根据docs http www postgresql org docs current static runtime config replication html wal keep segments integer 指定过去日志的最小数量
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • 如何 md5 所有列(无论类型如何)

    我想创建一个 sql 查询 或 plpgsql 它将 md5 所有给定的行 无论类型如何 但是 在下面 如果 1 为空 则哈希为空 UPDATE thetable SET hash md5 accountid accounttype cre
  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • PESSIMISTIC_WRITE 是否锁定整个表?

    只是为了确保我正确理解事情是如何运作的 If I do em lock employee LockModeType PESSIMISTIC WRITE 它会仅阻止该实体吗 employee 或整个表Employees 如果重要的话 我正在谈
  • 如何将表中不存在但原始SQL中存在的实体字段设置为别名?

    假设我们有一个这样的查询 SELECT CUSTOM EXPRESSION as virtualfield FROM users 用户的实体本身具有 虚拟字段 但映射注释没有 因为表没有该字段 假设它作为原始 SQL 执行 我们如何使用上面
  • 月份增量查询

    我想通过添加 1 个月来更新数据库中的月份 但我不知道如何在以下存储过程查询中添加月份 我不擅长 sql 请检查它 ALTER PROCEDURE dbo ChangePassword password varchar 20 epasswo
  • 执行带有 EXCEPTION 的 PostgreSQL 查询会导致两条不同的错误消息

    我有一个 PostgreSQL 查询 其中包含事务和列重复时的异常 BEGIN ALTER TABLE public cars ADD COLUMN top speed text EXCEPTION WHEN duplicate colum
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 即使删除了某些行,使用种子值进行随机排序也会再次返回相同的集合吗?

    我正在编写一个分页 API 通过设置随机种子值来给出随机结果 除非用户想要洗牌结果 否则结果将是相同的 但如果用户想要洗牌 我将重新创建种子值 以便它将返回一组不同的记录 我的问题是 如果我从数据库中删除一条记录 即使种子相同 由于元素长度

随机推荐

  • 与“iPad 2”失去连接

    我已经停止了所有模拟器进程 但仍然出现以下错误 恢复与 iPad 2 的连接并再次运行 APPNAME 或者如果 APPNAME 仍在运行 您可以通过选择 调试 gt 附加到进程 gt APPNAME 来附加到它 在 Xcode 6 中出现
  • 将位序列传递给文件 python

    作为较大项目的一部分 我想在文件中保存一系列位 以使文件尽可能小 我不是在谈论压缩 我想按原样保存序列 但使用最少的字符 最初的想法是使用 ASCII 编码将 8 位的迷你序列转换为字符并保存这些字符 但由于一些未知的奇怪字符问题 读取文件
  • 如何创建文本通道

    最近我一直在制作一个不和谐的机器人 我想在玩家输入命令后创建一个频道 gt report Tag Reason 以下是我尝试过的两种方法 其中一种来自之前的 StackOverflow 问题 但对我不起作用 function makeCha
  • MVC2.0中捕获HTML到字符串

    我是 MVC2 0 的新手 我使用下面的代码捕获 HTML 并将其作为字符串返回 但这在 MVC1 0 和 NET 3 5 框架中工作得很好 最近我将代码升级到 NET 4 0和MVC 2 0 现在这不再起作用并且上下文返回 null 当我
  • 没有“Access-Control-Allow-Origin”:读取 CSV、D3 [重复]

    这个问题在这里已经有答案了 我正在尝试从源读取 csvhttps stats oecd org Index aspx DataSetCode WILD LIFE 令 x 为上面的 url 但是 当我在本地主机上运行此脚本时 我收到以下消息
  • 调试 Android RuntimeException - 在我的代码执行之前

    我对 Java 并不陌生 但对 Android 平台却很陌生 我发现平台的缺点之一是对运行时崩溃的有意义的反馈 在应用断点的用户代码中很好 但我在第一次运行时发生崩溃 导致我的项目无法启动 并且我看不到追踪它的方法 任何人都可以阐明吗 Da
  • 应用程序特定信息:应用程序未能及时启动(iOS)?

    这是我的一份崩溃报告的顶部 Apple 是否规定了应用程序启动超时限制 如果是这样 有什么常见的解决方法吗 Elapsed total CPU time seconds 13 700 user 8 580 system 5 120 67 C
  • 在android中对字符串数组列表进行排序[重复]

    这个问题在这里已经有答案了 我有一个名为的字符串数组列表names 如何按字母顺序对数组列表进行排序 ArrayList
  • 如何添加对 .NET MySQL 连接器的引用?

    这是什么意思 接下来添加对 MySql Data 的引用 实际上我已经下载了mysql连接器 net 请按照以下说明操作 首先 您需要安装mysql连接器 net 它位于 http dev mysql com downloads conne
  • 如何从 .net 中的框架外的 Webbrowser 控件检索 HTML (c#)

    我知道我可以通过以下方式获取 Webbrowser 控件的 HTML 源代码 HtmlDocument htmldoc webBrowser1 Document 但这只提供了 父页面 的html代码 如果网页使用框架 则不会返回包括框架在内
  • 我如何告诉 Moq 返回任务?

    我有一个接口声明 Task DoSomethingAsync 我使用 Moq 框架进行测试 TestMethod public async Task MyAsyncTest Mock
  • 如何使用 JAVASCRIPT 播放和暂停嵌入的 Spotify?

    有人可以解释一下如何播放和暂停这个 Spotify 嵌入对象吗 我试图找到该玩家的 ID 但找不到 URL https open spotify com embed podcast show 5iKz9gAsyuQ1xLG6MFLtQg 这
  • 在 AVX2 中重现 _mm256_sllv_epi16 和 _mm256_sllv_epi8

    我很惊讶地看到 mm256 sllv epi16 8 m256i v1 m256i v2 and mm256 srlv epi16 8 m256i v1 m256i v2 不在英特尔内联指南我没有找到任何解决方案来仅使用 AVX2 重新创建
  • 无法在 Ubuntu 上安装 Elastic Beanstalk CLI

    我正在尝试使用以下命令在新的 Ubuntu 14 04 在适用于 Windows 的 Linux 子系统上 上安装 Elastic Beanstalk CLI awsebcli sudo pip install awsebcli 但启动eb
  • 如何从文本文件列表中的单词中删除行?

    file1 gt word list txt gt 超过 1 000 000 行 file2 gt list txt gt 超过 1 000 000 行 我有一个包含单词列表的文件 我想从一个大文本文件中删除此文件中所有单词的所有出现 Ex
  • SQLSTATE[HY093] :插入 mysql 数据库期间的 pdo 语句

    这是我实现插入数据库的php代码
  • Android XML 对象序列化

    我想在 Android 中将对象序列化为 XML 有建议的库吗 PS 已经尝试过 XStream 但它无法在 Android 上正确序列化枚举 问题在这里 Android 中枚举的序列化问题 你有没有尝试过简单的http simple so
  • 为什么 SQL Server 2012 中的变量表回滚不起作用?

    我创建了一个变量表 在我的存储过程中 有很多事务 现在 每当发生错误时 我想回滚特定事务 该事务包含一些从变量表中插入 更新或删除记录的语句 这只是我的实际问题的一个例子 declare tab table val int insert i
  • 进度条属性改变事件不触发

    我正在使用 JProgressBar 显示从 DataBase 加载的数据的进度 我正在使用 SwingWorker 类来加载后台线程中的数据Tutorial 我的应用程序的 ProgressBar 的属性更改事件没有触发 请指导我我做错了
  • PostgreSQL:count() 还是保留一个计数器?

    我有两个处于一对多关系的表 假设对于表中的每一行foo 表中可以有 0 行或多行bar引用该行foo 客户想知道有多少行bar引用一行foo 对于中的所有行foo 我可以通过以下查询来完成此操作 SELECT count bar id FR