PostgreSQL CROSS JOIN 索引提高性能

2024-01-27

这是我的第二部分question https://stackoverflow.com/questions/49938650/table-indexing-on-postgresql-for-performance。 所以我有下表,

CREATE TABLE public.main_transaction
(
  id integer NOT NULL DEFAULT nextval('main_transaction_id_seq'::regclass),
  profile_id integer NOT NULL,
  request_no character varying(18),
  user_id bigint,
  .....
  CONSTRAINT main_transaction_pkey PRIMARY KEY (id),

  CONSTRAINT fk_main_transaction_user_id FOREIGN KEY (user_id)
      REFERENCES public.jhi_user (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
      REFERENCES public.main_profile (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,

  CONSTRAINT main_transaction_profile_id_20_fk_main_profile_id FOREIGN KEY (profile_id)
      REFERENCES public.main_profile (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
)

在表中,我的表中有外键,我正在使用CROSS JOIN通过以下方式链接表格id它导致性能缓慢(返回结果12 secs对于超过 100 万行数据)。 更准确地说,我有一个profile_id列于主要交易(上)表为profile表和在profile我有的表customer_id for customer桌子。所以,我的查询如下,

SELECT * FROM main_transaction t 
CROSS JOIN main_profile p 
CROSS JOIN main_customer c 
WHERE t.profile_id = p.id
AND p.user_id = c.id 
AND ( upper(t.request_no) LIKE upper(concat('%','0-90-6 12 ','%')) 
      OR upper(c.phone) LIKE upper(concat('%','0-90-6 12','%')) 
)

如果您需要的结构profile and customer表,我可以评论。

Explain:

"Merge Join  (cost=27220.51..266464.85 rows=218 width=1692) (actual time=9399.370..9399.370 rows=0 loops=1)"
"  Merge Cond: (t.profile_id = p.id)"
"  Join Filter: ((upper((t.request_no)::text) ~~ upper(concat('%', ' 0-90-6 12 ', '%'))) OR (upper((c.phone)::text) ~~ upper(concat('%', ' 0-90-6 12, '%'))))"
"  Rows Removed by Join Filter: 1089489"
"  Buffers: shared hit=453158 read=413372, temp read=1560 written=1560"
"  ->  Index Scan using main_transaction_profile_id_idx on main_transaction t  (cost=0.43..198177.36 rows=1089489 width=1455) (actual time=0.004..3913.501 rows=1089489 loops=1)"
"        Buffers: shared hit=393656 read=410718"
"  ->  Materialize  (cost=27218.84..27645.70 rows=85372 width=237) (actual time=165.565..239.572 rows=1133650 loops=1)"
"        Buffers: shared hit=59502 read=2654, temp read=1560 written=1560"
"        ->  Sort  (cost=27218.84..27432.27 rows=85372 width=237) (actual time=165.560..188.746 rows=85368 loops=1)"
"              Sort Key: p.id"
"              Sort Method: external sort  Disk: 12480kB"
"              Buffers: shared hit=59502 read=2654, temp read=1560 written=1560"
"              ->  Merge Join  (cost=0.73..10594.24 rows=85372 width=237) (actual time=0.007..96.133 rows=85372 loops=1)"
"                    Merge Cond: (p.user_id = c.id)"
"                    Buffers: shared hit=59502 read=2654"
"                    ->  Index Scan using main_profile_e8701ad4 on main_profile p  (cost=0.29..3350.82 rows=85372 width=40) (actual time=0.003..24.892 rows=85372 loops=1)"
"                          Buffers: shared hit=29016 read=963"
"                    ->  Index Scan using main_customer_pkey on main_customer c  (cost=0.29..5963.16 rows=85506 width=197) (actual time=0.003..34.235 rows=85506 loops=1)"
"                          Buffers: shared hit=30486 read=1691"
"Planning time: 0.850 ms"
"Execution time: 9407.244 ms"

你的主要问题是OR— 只要你有一个OR像这样在你的WHERE clause.

重写查询如下:

SELECT * FROM main_transaction t 
   JOIN main_profile p ON t.profile_id = p.id
   JOIN main_customer c ON p.user_id = c.id 
WHERE upper(t.request_no) LIKE upper(concat('%','0-90-6 12 ','%'))
UNION
SELECT * FROM main_transaction t 
   JOIN main_profile p ON t.profile_id = p.id
   JOIN main_customer c ON p.user_id = c.id 
WHERE upper(c.phone) LIKE upper(concat('%','0-90-6 12','%'));

然后确保您有以下索引(除了ids):

CREATE INDEX ON main_transaction (profile_id);
CREATE INDEX ON main_transaction USING gin (upper(request_no) gin_trgm_ops);
CREATE INDEX ON main_profile (user_id);
CREATE INDEX ON main_customer USING gin (upper(phone) gin_trgm_ops);

这应该会有所作为。

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

PostgreSQL CROSS JOIN 索引提高性能 的相关文章

  • 使用包含空值列的 WHERE 子句的更新语句

    我正在使用另一个表中的数据更新一个表上的列 这WHERE子句基于多个列 并且某些列为空 根据我的想法 这个空值是什么throwing off你的标准UPDATE TABLE SET X Y WHERE A B陈述 See 这个 SQL 小提
  • SqlAlchemy:查询具有数组的长度json字段

    我有一个包含 JSON 类型字段的表 JSON 字段包含一个带有数组的 JSON 对象 如何查询该数组每一行的长度 class Post Base tablename posts id Column Integer primary key
  • 如何从函数返回更新的行

    我对 postgres 很陌生 我想创建一个函数 如存储过程 来更新多行并选择受影响的行 这是我的声明 CREATE or replace FUNCTION set val val character varying 100 5 RETUR
  • Heroku 上的“PG::错误 - 数字字段溢出”

    我构建了一个应用程序来查询 Google Analytics 的过去 7 天的数据 一切都在本地进行 在 Heroku 上 该过程运行顺利 直到它尝试获取今天日期的数据 然后我收到以下错误 2012 10 29T02 32 02 00 00
  • QGIS 和 PostGIS(地图点(美国地图上的纬度和经度以及半径)

    我安装了QGIS和PostGIS 我想在美国地图上以 100 英里为半径显示 200 个点 我已将纬度和经度导入 PostGIS 数据库中 所以我有三个字段 地址 纬度 经度 1 我需要将纬度和经度字段转换为点或几何字段吗 如果是这样怎么办
  • SQL Server 为什么索引不与 OR 一起使用

    我一直在研究索引并试图了解它们是如何工作的以及如何使用它们来提高性能 但我错过了一些东西 我有下表 Person Id Name Email Phone 1 John E1 P1 2 Max E2 P2 我正在尝试找到对列进行索引的最佳方法
  • 使用 $or 运算符时 MongoDB 查询会变慢

    我正在尝试对我的收藏进行此查询Audios var querySlow palabra regex keywords options i or p pais in interested accents languageCodeTatoeba
  • 如何通过迁移向现有索引添加“唯一”约束

    我怎样才能添加unique true对 Rails 数据库中已有索引的约束 我尝试通过以下方式迁移 def change add index editabilities user id list id unique true end 但迁移
  • Golang:使用像 Node.js 中那样的可读流从 PostgreSQL 数据库中选择几百万行

    我有大约 5000 万行的 PostgreSQL 表 我想编写 Go 代码来从该表中选择大约 100 万行 并以有效的方式处理它们 上次我使用了nodejs和这个NPM模块pg 查询流 https www npmjs com package
  • Django Postgres 全文 TrigramSimilarity 多个字段

    我想弄清楚如何使用TrigramSimilarity with unaccent对于多个字段 到目前为止我有 def filter by location self queryset location log info Filtering
  • Rails 5.2.2(活动记录)WITH 语句

    我正在使用 Rails 5 2 2 并且有一个使用 WITH 语句的复杂查询 我需要使用左外连接创建该语句 我该如何做WITH活动记录中的语句 我的 TOTAL PROFILES 由查询对象驱动 并且会发生变化 而其余部分将始终保持不变 所
  • 分区表查询仍然扫描所有分区

    我有一个包含超过十亿条记录的表 为了提高性能 我将其分区为30个分区 最常见的查询有 id 在他们的 where 子句中 所以我决定对表进行分区id column 基本上 分区是这样创建的 CREATE TABLE foo 0 CHECK
  • 无法在 postgres insert 中插入问号

    我正在尝试运行一个简单的 Postgres SQL 插入 insert into Resources values 1 How are you 但插入后的结果是 ID Data 1 How are you 1 我知道 要插入单引号等字符 我
  • Hibernate 使用大量线程

    在我的独立应用程序中 一次性生成超过 1000 个线程 每个线程都有自己的 Hibernate 会话 但在这种情况下 会话计数超过数据库最大连接限制 从而引发错误 我尝试过设置 getCurrentSession 代替 openSessio
  • 我截断了一个表。我如何取回数据?

    在我的 postgresql 数据库中 不幸的是我截断了表mail group 并且该表已从数据库中删除 如何找回该表 请帮助我 等待回复 Thanks 其他有同样情况的人 立即地停止你的数据库pg ctl stop m immediate
  • 如何在 PHP 中实现前向索引?

    我希望在 PHP 中实现一个简单的前向索引器 是的 我确实知道 PHP 并不是完成这项任务的最佳工具 但无论如何我还是想这样做 其背后的理由很简单 我想要一个 并且是 PHP 版本 让我们做一些基本假设 整个互联网包括 大约五千个 HTML
  • 将数据推送到 Heroku 时出错:时区位移超出范围

    我运行以下命令将本地数据库的内容推送到 Heroku heroku db push app my app 在我的家用计算机上 这可以完美地工作 但在我的工作计算机上 我收到此错误 Taps 服务器错误 PGError 错误 时区位移超出范围
  • PostgreSQL:用以前的值填充时间序列查询中的 NULL 值

    我有一个包含时间相关信息的数据库 我想要一个包含每分钟值的列表 像这样 12 00 00 3 12 01 00 4 12 02 00 5 12 03 00 5 12 04 00 5 12 05 00 3 但是 当几分钟内没有数据时 我得到如
  • 如何使 Postgres Copy 忽略大 txt 文件的第一行

    我有一个相当大的 txt 文件 9gb 我想将此 txt 文件加载到 postgres 中 第一行是标题 后面是所有数据 如果我直接 postgres COPY 数据 标头将导致数据类型与我的 postgres 表不匹配的错误 因此我需要以
  • 如何从 PostgreSQL 数据库中删除表*或*视图?

    我在 PostgreSQL 数据库中有一个表或视图的名称 需要在单个 pgSQL 命令中删除 我怎样才能负担得起 我能够选择表单系统表来查找是否有任何具有此类名称但仍保留程序部分的表 SELECT count FROM pg tables

随机推荐

  • Azure DevOps 中“bash exited with code 1”中的 Cypress 测试退出失败

    我已将 Cypress 测试设置为在 Azure DevOps 中运行 我通过 yml 文件中的 CMD 命令运行测试 然后获取测试结果 当测试通过时 一切都按预期工作 并且测试结果显示在摘要中 当测试失败时 CMD 步骤会失败 并显示错误
  • 如何使用 Powershell 下载并安装适用于 Windows 的 git 客户端

    我必须编写自动 powershell 脚本来从 gihtub 克隆存储库 但我需要使用命令行安装 git 您能否让我知道如何使用命令行在窗口上下载并安装 git 而无需执行任何手动工作 提前致谢 希望在不使用巧克力的情况下做同样的事情 以下
  • 为什么 tkinter(或海龟)似乎丢失或损坏?它不应该是标准库的一部分吗?

    当尝试使用 Tkinter 标准库包或其相关功能 使用海龟图形 时 我看到了许多不同的问题 turtle和内置的 IDLE IDE 或者使用将此作为依赖项的第三方库 例如使用 Matplotlib 显示图形窗口 似乎即使没有隐藏标准库模块名
  • 如何在 HashSet 中搜索时使用正则表达式

    我正在编写一个 Java 程序 我需要在其中搜索集合中的特定单词 必须搜索的单词类似于 wo d where 可以用任何其他字母代替 我正在使用正则表达式来匹配此类类型的单词大小写 这就是我到目前为止所拥有的 HashSet
  • 如何加速InnoDB count(*)查询?

    这里有很多类似的问题 但很多答案都说强制使用索引 这对我来说似乎并没有加快任何速度 我想在我的网站上显示一个 实时 计数器 显示表中的行数 有点像一些网站如何 实时 显示注册用户数量或其他统计数据 即使用 ajax 或 websockets
  • 将锚标记设置为看起来像提交按钮

    我有一个表单 其中有一个 提交 按钮和一个 取消 锚点 HTML 是这样的
  • AuthLogic 表单给出了不正确的验证错误 - 为什么?

    我根据 AuthLogic 示例设置了 AuthLogic for Rails http github com binarylogic authlogic example http github com binarylogic authlo
  • 适用于 Windows 和 Cygwin 的 Makefile

    我需要有一个makefile在 Windows 和 Cygwin 下工作 我在 makefile 正确检测操作系统并设置适当的变量时遇到问题 目标是为以下命令设置变量 然后使用变量调用规则中的命令 删除文件 rm在西格温 del在Windo
  • 使用 jQuery/CSS 缩小/增大动画

    如何使用 jQuery 和 或 CSS 完成放大 缩小动画 我能想到的一个例子是this https www zaarly com当您点击Join Now button 我调查了动画 css http daneden me animate
  • 将行值聚合到列中

    我有这样的数据 2013 11 localhost kern 2013 11 localhost kern 2013 11 192 168 0 59 daemon 2013 12 localhost kern 2013 12 localho
  • “base”值只能用于直接调用被重写成员的基本实现

    为什么我不能打电话base实施f here type Base abstract f int gt int gt int default this f x int y int int x y type Derived inherit Bas
  • 执行 Python Azure Functions 时不显示记录 DEBUG 日志

    我创建了一个 Python Azure Functions 应用程序 在此应用程序中 我想检查日志详细信息 例如DEBUG INFO我已经编写了一些用于日志记录的代码 但是在执行我的azure函数应用程序后我无法获取任何日志 我已经编写了用
  • JS 重命名对象键,同时保留其在对象中的位置

    我的 javascript 对象如下所示 const someObj arr1 str1 str2 arr2 str3 str4 在尝试重命名密钥时 例如arr1 我最终删除现有的密钥并用原始值写入一个新密钥 这的顺序obj changes
  • Excel 强制关闭时如何抑制“禁用加载项”对话框

    我的插件是使用 WPFframework 用 c NetOffice ExcelDNA 编写的 有些部分也使用winform 主要用户界面是WPF 当显示模式对话框时 用户强制关闭 Excel 下次当他们启动 Excel 时 Excel 会
  • 你可以使用shinyjs来隐藏/显示整个面板吗?

    我想知道是否可以在整个闪亮的 wellPanel 上使用闪亮的隐藏和显示功能 我有兴趣这样做是为了有条件地显示两个面板之一 据我所知 我不能在条件面板的条件中使用反应值 下面是我的想法的一个例子 但是我不知道如何引用在shinyjs函数中给
  • tls:HTTP 请求没有重新协商错误

    我试图在 Go 中发出一个简单的 HTTP 请求 在直接按照指南进行操作后 我不断收到相同的错误 local error tls no renegotiation 我不太明白这个怎么解释 我知道这在服务器上不是问题 因为当我从 python
  • 无法将 Chrome Live Edit 与 Webpack 源映射结合使用

    我有一个 webpack 4 配置 可以为我的应用程序的 JavaScript 生成源映射 在 Chrome 中调试我的应用程序时 会加载源映射 以便我可以看到我的统一代码 我将在函数中设置断点 并在 源 选项卡中对代码进行编辑 我按 CM
  • 如何获取.net 4.0中正在运行的任务列表

    我正在尝试获取所有当前正在运行的任务的列表 net 4 0 任务 API 是否提供此类功能 或者唯一的选择是明确将任务存储在单独的集合中 我想你需要TaskScheduler GetScheduledTasks http msdn micr
  • 如何使 VBA 脚本自动生成“另存为”窗口

    我正在编写一个 VBA 代码 该代码将通过 SAP 软件的自动化屏幕保存 PDF 文件 我已经到达 SAP 询问我要将 PDF 文件保存在哪里的位置 它会打开一个 Windows 资源管理器 另存为 窗口 此时 VBA代码停止 我需要手动输
  • PostgreSQL CROSS JOIN 索引提高性能

    这是我的第二部分question https stackoverflow com questions 49938650 table indexing on postgresql for performance 所以我有下表 CREATE T