Postgres 选择 BTREE 而不是 BRIN 索引

2023-11-22

我正在运行 Postgres 9.5 并正在使用 BRIN 索引。我有一个大约有 1.5 亿行的事实表,我正在尝试让 PG 使用 BRIN 索引。我的查询是:

select sum(transaction_amt), 
       sum (total_amt) 
from fact_transaction 
where transaction_date_key between 20170101 and 20170201 

我在 transaction_date_key 列(上面的查询指的是 2017 年 1 月到 2017 年 2 月)上创建了 BTREE 索引和 BRIN 索引(默认pages_per_range值为128)。我本以为 PG 会选择使用 BRIN 索引,但它与 BTREE 索引搭配使用。以下是解释计划:

https://explain.depesz.com/s/uPI

然后我删除了 BTREE 索引,对表进行了真空/分析,然后重新运行查询,结果如下did选择 BRIN 索引,但运行时间要长得多:

https://explain.depesz.com/s/5VXi

事实上,使用 BTREE 索引而不是 BRIN 索引时,我的测试速度更快。我以为这应该是相反的?

我更喜欢使用 BRIN 索引,因为它的尺寸较小,但我似乎无法让 PG 使用它。

注意:我加载了从 2017 年 1 月到 2017 年 6 月的数据(通过 transaction_date_key 定义),因为我读到物理表排序在使用 BRIN 索引时会产生影响。

有谁知道为什么 PG 选择使用 B TREE 索引以及为什么 BRAIN 在我的情况下慢得多?


看起来BRIN索引扫描的选择性不是很强——它返回了3000万行,所有这些都必须重新检查,这就是时间花费的地方。

这可能意味着transaction_date_key与表中行的物理位置没有很好的相关性。

A BRIN 指数发挥作用通过“集中”表块的范围(可以使用存储参数配置多少个pages_per_range,其默认值为 128)。存储每个块范围的索引值的最大值和最小值。

所以表中的很多块范围包含transaction_date_key之间20170101 and 20170201,并且必须扫描所有这些块才能计算查询结果。

我认为有两个选择可以改善这种情况:

  • 降低pages_per_range存储参数。这将使索引更大,但会减少“误报”块的数量。

  • 对表进行聚类transaction_date_key属性。正如您所发现的,这需要(至少暂时)列上有一个 B 树索引。

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

Postgres 选择 BTREE 而不是 BRIN 索引 的相关文章

  • 在 PostgreSQL 的表中添加缺失的日期

    我有一个表 其中包含 2002 年每一天的数据 但其中缺少一些日期 即 2002 年有 354 条记录 而不是 365 条 对于我的计算 我需要在表中包含空值的缺失数据 ID rainfall date 100 110 2 2002 05
  • 如何在 Postgres 中将表从公共模式移动到其他模式

    Postgres 9 1 数据库包含公共模式中的表 yksus1 ykssu9 pgAdmin 显示了这些定义 如下面的代码所示 如何将这些表移至 Firma1 架构 Firma1 模式中的其他表具有对这些表主键的外键引用 对这些表的外键引
  • 如何按照最初给出的时区存储和显示日期?

    我有一台服务器正在从不同时区的客户端提供数据 数据源包含人物 他们的出生日期和其他事件日期 出于我们的目的 如果我们可以将日期存储为给我们的日期 那就很方便了 例如 如果客户位于加利福尼亚州 并且告诉我们该人的出生日期是 5 月 31 日
  • Postgres 服务器性能在达到一定数量的记录后急剧下降

    我正在使用游标从大型 postgres 表中检索记录 4亿条记录 使用子表对数据进行分区 我的游标定义为 select from parent table order by indexed column 同时使用 JDBC 和 psql 前
  • 将 PostgreSQL 扩展安装到所有模式

    我在 PostgresQL 9 1 1 上尝试扩展unaccent http www postgresql org docs 9 1 static unaccent html适用于所有模式 所以我运行了命令CREATE EXTENSION
  • 如何更改 PostgreSQL 表中列的数据类型?

    在 PostgreSQL 交互式终端中输入以下命令会导致错误 ALTER TABLE tbl name ALTER COLUMN col name varchar 11 更改列的数据类型的正确命令是什么 请参阅此处的文档 http www
  • SQL Server 2005 - 应该多久重建一次索引?

    我最近接手了一个项目 他们有一个 SQL 作业设置 每三个小时运行一次 它会重建 ASP NET 会员数据库表中找到的索引 每天重建索引 8 次 这看起来相当高 我每天都会获得大约 2000 个新用户 总共大约有 200 万注册用户 对于正
  • Laravel 5.3 Schema::create ENUM 字段是 VARCHAR

    我刚刚创建了新的迁移 运行后我看到了我的领域type 不是 ENUM 类型 它有一个改为 VARCHAR 255 类型 Schema create payments function Blueprint table table gt inc
  • -bash:pg_dump:找不到命令

    我正在尝试在本地为我的 Rails 应用程序提取一个生产数据库 我本地的 postgres 版本太低 所以我需要从 9 4 1 更新到 Postgresql 9 6 5 我通过 Homebrew 安装了 Postgres 9 6 6 如下所
  • 如何在gnuplot中连接具有不同索引(一个数据文件)的点

    我有一个文件 a test dat 其中包含两个数据块 我可以通过相应的索引进行选择 first x1 y1 3 1 6 2 9 8 second x2 y2 4 5 8 2 2 7 现在我想用箭头连接两个索引的数据点 设置从 x1 y1
  • 如何使用 Dapper 从 .NET 7 执行 Postgresql 函数,而不列出所有参数的数据类型

    我正在尝试将我的 NET 5 Web API 代码传输到 NET 7 我有一个名为的单例服务DataManager它实现了接口IDataManager 其中一项功能是Execute还有其他 C 函数 称为 Get GerMany 以及 In
  • Docker - 如何在 postgres 容器中运行 psql 命令?

    我想在 postgres 映像中使用 psql 以便对数据库运行一些查询 但不幸的是 当我附加到 postgres 容器时 我收到错误 psql 命令未找到 对我来说 如何在容器中运行 postgresql 查询或命令是一个谜 如何在pos
  • 与 PostgreSQL CTE 的一般并行性

    我正在处理一些大数据 并且在查询中获取并行计划是必要的 我也很喜欢使用 CTE 来表达我的查询 但根据 PostgreSQL 的文档 我不太确定 CTE 是否对并行性造成严重限制 Here https www postgresql org
  • 使用两个日期之间的随机日期时间更新每一行

    我有一个专栏叫date created我希望每一行保存一个随机日期 日期距当前时间为 2 天 我正在运行以下查询 但它会更新具有相同随机日期的所有行 我希望每一行都是随机的并且不相同 update table set date create
  • 查找 PostgreSQL 中所有范围集合的所有交集

    我正在寻找一种有效的方法来查找时间戳范围集之间的所有交集 它需要与 PostgreSQL 9 2 配合使用 假设这些范围代表一个人可以见面的时间 每个人都可以有一个或多个空闲时间范围 我想找到all可以召开会议的时间段 即所有人都有空的时间
  • 更改迁移中的自动​​增量值(PostgreSQL 和 SQLite3)

    我有一个托管在 Heroku 上的项目 想要更改表的自动增量起始值 我在本地使用 SQLite3 Heroku 使用 PostgreSQL 这是我在迁移中所拥有的 class CreateMytable lt ActiveRecord Mi
  • 使用 JSON 参数的 Postgres 批量 INSERT 函数

    这是一个plpgsqlpostgres 的函数9 6 它试图INSERT一行 如果插入没有失败 由于违反键约束 那么它会运行更多命令 CREATE FUNCTION foo int text text RETURNS void AS BEG
  • 如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?

    有没有更短的方法来查找多个匹配项 SELECT from table WHERE column LIKE AAA OR column LIKE BBB OR column LIKE CCC 这个问题适用于 PostgreSQL 9 1 但如
  • 用户登录时的 Postgresql 触发器

    我正在尝试找出一种方法来了解用户何时登录 Postgres 数据库 有没有办法定义用户登录数据库时触发的触发器 或者是否有一个表或系统视图在任何人登录数据库时都会更新 登录钩子 https github com splendiddata l
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4

随机推荐

  • Git Stash 和 Worktree 问题

    我很难让 Git 与我现有的用户定义工作树合作outside包含我的 git 目录的文件夹 基本上设置是这样的 我有两个目录 一个名为 git worktree 其中包含我想要跟踪的文件 另一个名为 git dir 其中包含存储库的 git
  • Android 中的假电话

    HI all 我想在android中开发一个假电话应用程序 单击按钮后 我必须在给定时间段内收到假电话 有什么办法可以做到这一点吗 有任何线索或示例代码 请让我知道 提前致谢 安卓是开源的 用它 In the git 存储库上的手机应用程序
  • Flutter - 在没有 Firebase 身份验证的情况下将 Firebase 通知推送给特定用户

    我正在使用 Firebase 来推送通知 并且我不在我的应用程序上使用 Firebase 身份验证 我有自己的系统 我没有找到这个问题的答案 是否可以在没有 Firebase 身份验证 因此没有 UID 的情况下使用 Firebase 将通
  • 每个 DocumentStore 的 WaitForNonStaleResults

    有没有办法告诉RavenDb对某些DocumentStore或DocumentSession的所有查询使用WaitForNonStaleResults模式 您可以使用DefaultQueryingConsistency Consistenc
  • 如何使用python和Opencv读取视频文件

    我正在使用 python 2 7 和 opencv2 4 读取 avi 文件 我使用的是 windows 10 我的示例代码是 import numpy as np import cv2 cap cv2 VideoCapture video
  • 将 ObjectMapper 声明为 bean 有什么好处?

    假设我只想要一个简单的实例ObjectMapper目的 将其声明为 bean 有什么好处吗 Bean public ObjectMapper objectMapper return new ObjectMapper 为什么不直接制作一个新的
  • 扫描仪与 BufferedReader

    据我所知 在Java中从文件中读取基于字符的数据的两种最常见的方法是使用Scanner or BufferedReader 我也知道BufferedReader通过使用缓冲区来有效地读取文件 以避免物理磁盘操作 我的问题是 Does Sca
  • 阻止 OS X 使用 Python 进入睡眠状态?

    有没有办法防止运行 OS X 的计算机在 Python 脚本中进入睡眠状态 您可以使用内置的咖啡因酸盐命令 subprocess Popen caffeinate 这就是我的使用方式 import sys import subprocess
  • 如何提高 IIS / ASP.Net 的启动性能

    我正在使用一个特别慢的虚拟网络主机 名称保留 其中磁盘性能可能非常糟糕 因此 第一次访问我的 ASP Net 网站可能需要 1 分钟以上的时间才能加载 初始加载后 一切都在 RAM 中 一切正常 我想知道是否有人知道如何指示 IIS 预加载
  • Epplus SetPosition图片问题

    我在用Epplus库在 Asp Net C 中生成 Excel 2010 及更高版本兼容的文件 我使用的是目前最新的版本 3 1 2 在添加任何图片之前 我首先设置行高 ExcelPackage pck new ExcelPackage v
  • IdHttp 只需获取响应代码

    我正在使用 idhttp Indy 进行一些网站检查 我想要它做的就是在发送请求后检查服务器的响应代码 我不想实际上必须从服务器接收 HTML 输出 因为我只监视 200 OK 代码 任何其他代码意味着存在某种形式的问题 我查阅了 idht
  • iPad 方向更改问题

    我的 iPhone 应用程序在 iPad 上运行时显示一些关于支持方向更改的奇怪行为 该应用程序以视图控制器 为了论证起见 将其称为视图 A 和导航控制器启动 并且 shouldAutorotateToInterfaceOrientatio
  • 如何获取 WPF 窗口的静态引用?

    我尝试了很多方法来在程序中获取窗口的静态引用 我需要在运行时从不同的类访问其所有成员 因此需要静态引用 我想要的是类似的东西Program Window1 where Core是静态的并且MyWindow是其静态成员之一 在 WinForm
  • 如何在应用程序启动时运行回调?

    我知道 Android 的 Activity 模型与我通常认为的 应用程序 有点不同 当我的应用程序 启动 时 我想做一些事情 在这种情况下 检查服务器上的一些通知并显示它们 如果可用 实现这一目标的好方法是什么 我可能不想在活动的 OnC
  • FX 19 中组合框焦点问题

    升级到最新的 JavaFX 版本 19 后 我遇到了一些奇怪的问题 如果我将最后一个选项设置为 ComboBox 中的值 那么在第一次打开时 如果我选择任何选项 下拉列表将不会隐藏 之后 下拉菜单将像往常一样工作 奇怪的是 只有当我将最后一
  • 为什么javascript getMonth 从 0 开始计数,getDate 从 1 开始计数?

    这个问题纯粹是为了满足我的好奇心 在 JavaScript Date 对象中 当您调用getMonth 它返回月份 但从 0 开始计数 0 January 1 February 但当你打电话时getDate 它从 1 开始计数 1 1 2
  • 类中的 pthread 函数

    假设我有一堂课 例如 class c void print void cout lt lt Hello 然后我有一个 c 向量 vector
  • 如何在 C#/Windows 窗体中翻转/旋转标签?

    如何在 C 中翻转 旋转标签Windows 窗体 我将背景图像设置为我的标签 在每个时间间隔 它都会向右侧移动三个像素 当它到达表格结束位置时 我需要将标签翻转并转回 我尝试了以下方法 但没有得到解决方案 private void time
  • 设置字段以在更新时自动插入时间戳?

    我有一张桌子 上面有DEC字段命名product price我想添加一个名为price updated date 有没有办法设置表自动插入当前时间戳product price字段已更新 如果没有 是否有办法将其设置为在条目更新时插入当前时间
  • Postgres 选择 BTREE 而不是 BRIN 索引

    我正在运行 Postgres 9 5 并正在使用 BRIN 索引 我有一个大约有 1 5 亿行的事实表 我正在尝试让 PG 使用 BRIN 索引 我的查询是 select sum transaction amt sum total amt