首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

count(*)对于某些具有pg_trm/GIN索引的正则表达式,在PostgreSQL中给出错误的结果

在PostgreSQL中,count(*) 对于某些具有 pg_trgm 或 GIN 索引的正则表达式查询可能会给出错误的结果,这通常是由于索引的使用方式和查询优化器的决策导致的。以下是一些基础概念和相关信息:

基础概念

  1. pg_trgm 扩展
    • pg_trgm 是一个 PostgreSQL 扩展,用于支持文本相似性搜索和正则表达式匹配。
    • 它通过创建 GIN 索引来加速这些操作。
  • GIN 索引
    • GIN(Generalized Inverted Index)是一种索引类型,适用于复杂的数据类型和操作,如数组、全文搜索等。
    • GIN 索引可以加速包含操作(如 @>)和正则表达式匹配。

问题原因

当使用 count(*) 进行正则表达式查询时,PostgreSQL 的查询优化器可能会选择不使用 GIN 索引,而是进行全表扫描。这可能是由于以下原因:

  1. 统计信息不足
    • 查询优化器依赖于统计信息来决定是否使用索引。如果统计信息不准确或不足,优化器可能会选择全表扫描。
  • 查询复杂性
    • 正则表达式查询可能非常复杂,导致优化器认为全表扫描比索引扫描更有效。
  • 索引选择性
    • 如果 GIN 索引的选择性不高(即很多行匹配查询条件),优化器可能会选择全表扫描。

解决方案

  1. 更新统计信息
    • 使用 ANALYZE 命令更新表的统计信息,帮助优化器做出更好的决策。
    • 使用 ANALYZE 命令更新表的统计信息,帮助优化器做出更好的决策。
  • 强制使用索引
    • 使用 SET enable_seqscan TO off; 强制查询优化器不进行全表扫描。
    • 使用 SET enable_seqscan TO off; 强制查询优化器不进行全表扫描。
  • 使用 EXPLAIN 分析查询计划
    • 使用 EXPLAIN 命令查看查询计划,了解优化器是如何处理查询的。
    • 使用 EXPLAIN 命令查看查询计划,了解优化器是如何处理查询的。
  • 优化正则表达式
    • 确保正则表达式尽可能具体,以提高索引的选择性。

示例代码

假设我们有一个表 users,其中有一个列 email,我们希望使用正则表达式来计数匹配的行:

代码语言:txt
复制
-- 创建表和 pg_trgm 扩展
CREATE EXTENSION pg_trgm;
CREATE TABLE users (id SERIAL PRIMARY KEY, email TEXT);

-- 插入一些示例数据
INSERT INTO users (email) VALUES ('user1@example.com'), ('user2@example.com'), ('user3@example.org');

-- 更新统计信息
ANALYZE users;

-- 查询并强制使用索引
SET enable_seqscan TO off;
SELECT count(*) FROM users WHERE email ~ 'example\.com';

通过这些步骤,可以提高 count(*) 查询在使用正则表达式时的准确性和性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Postgresql】索引类型(btree、hash、GIST、GIN)

本节简单介绍Postgresql的索引类型,虽然大部分业务常见常见可以用btree搞定,但是某些情况下其他特殊的索引可以有事半功倍的效果。...对于支持距离排序的 SP-GiST 运算符类,在官方文档的 PostgreSQL: Documentation: 14: 66.2....Built-in Operator Classes中列出了相应的运算符。 SP-GiST索引对那些具有自然聚类元素,同时也不是等量平衡树的数据最有用,例如,GIS、多媒体、电话路由、IP路由等。...PostgreSQL 的标准发布中包含用于一维数组的 GIN 操作符类,它支持下面的操作: <@ @> = && GIN使用技巧 注意GIN索引的插入是非常慢的,一般建议维护GIN索引是和图数据库一样先删除后重新建立...GIN用于使用等值匹配比较合适,对于复杂的场景查询结果比较难控制,个人认为适用于轻量级的替代ES这样的中间件进行简单搜索的场景可以适用。

4.5K40

PostgreSQL JSONB 使用入门

而jsonb数据被存储在一种分解好的二进制格式中,因为需要做附加的转换,它在输入时要稍慢一些。但是 jsonb在处理时要快很多,因为不需要重新解析。...-- content 中有avatar key 的数据条数 count(*) 查询不是一个好的测试语句,就算是有索引,也只能起到过滤的作用,如果结果集比较大,查询速度还是会很慢 explain analyze...接下来测试一下使用索引时的查询速度。 索引 GIN 索引介绍 JSONB 最常用的是GIN 索引,GIN 索引可以被用来有效地搜索在大量jsonb文档(数据)中出现 的键或者键值对。...在表中的每一个属性,在建立索引时,都可能会被解析为多个键值,所以同一个元组的tid可能会出现在多个key的posting list中。...using gin ((content->'tags')); 多索引支持 PostgreSQL 拥有开放的索引接口,使得PG支持非常丰富的索引方法,例如btree , hash , gin , gist

8.1K20
  • MOP 系列|MOP 三种主流数据库索引简介

    Oracle 索引类型 B 树索引 索引组织表 •索引组织表(IOT)在一个B树索引结构中存储表行的全部内容。使用索引组织表,能缩短 具有精确匹配和主键范围搜索的查询时间。...对于平衡有大量顺序插入的索引的 IO 是非常有用的。 例如,如果索引键为 20,并且该键以十六进制形式存储的两个字节在标准 b 树索引中为 C1,15,则反向键索引将字节存储为15,C1。...对于表列中的每个值,索引存储索引表中对应行的行号。相比之下,标准位图索引是在单个表上创建的。 位图连接索引是通过提前执行限制来减少必须连接的数据量的有效方法。...对于位图连接索引何时有用的示例,假设用户经常查询具有特定工作类型的员工数量。...在本地分区索引中,索引在与其表相同的列上进行分区,具有相同的分区数量和相同的分区边界。

    15010

    PostgreSQL 13.0-13.15 功能更新和bug fixed列表

    PG13 有15个版本,我们从PG13.1 开始 PostgreSQL 13 版本对于PG是一个重要的版本,在PG11中对于分区表的未改进的情况下,PG12对于分区表有了重大的改进,但基于稳定性功能上来说我们需要一个更平稳的平台...等待并发准备事务的问题 PG13.2 避免在尝试重新扫描同时具有哈希和排序分组集的聚合计划节点时崩溃 PG13.2 修复在哈希聚合节点将某些元组溢出到磁盘时可能导致查询结果不正确的问题 PG13.2 当通过扩展查询协议执行执行事务回滚的...= off,则会在“恢复在...事务之前停止”日志消息中打印一个不正确的时间戳 PG13.10 改进一些缓冲文件读取失败的错误报告,正确报告短读取,给出期望读取的字节数和实际读取的字节数,而不是报告一个无关的错误代码.../hstore_plpython中,避免在要转换的Python值不是映射时崩溃 PG13.11 在contrib/pg_trgm中修复不可满足正则表达式的错误行为,像$foo这样的正则表达式是合法但不可满足的...PG13.14 让 pg_file_settings 视图检查具有后端或超级用户后端上下文的设置中未应用值的有效性 PG13.14 修复清理 GIN 索引内部页面的不完整分割时的锁定不足问题 PG13.14

    14010

    PostgreSQL-模糊查询

    函数已改进,请使用新版本函数,参看PostgreSQL 黑科技-递规二分法切分汉字 1 模糊查询时,大多数情况下首先想到的是like ‘%关键字%’或基于gin索引的正则表达式,gin至少需要三个字符才会使用索引...,对于汉语来说十分不方便; 2 在海量数据的情况下,基于like和gin索引的正则表达式均不理想时,一般采用分词后进行查询. 3 分词存在两个弊端 3.1 词库的维护是比较繁重的工作.当词库中没有的关键词会导致查询结果不正确...,不过在当前相比较下来以空间换取时间的方法是值得的. 4.1 首先清除文本中的标点符号 drop function if exists clear_punctuation(text); create or...通过主表可以很容易的重建,不过机率非常小 --test_cond中的数据通过触发器更新,不需要操作这个表 create unlogged table test_cond( objectid bigserial...join test_cond as s on f.objectid=s.objectid where s.keys @@ (select str_to_tsquery('侒亩')); 新版本函数,请参看PostgreSQL

    2.5K20

    聊聊PostgreSQL中的几种索引类型

    索引是增强数据库性能的利器,在检索某些特定行的时候效率会有很大提升,postgresql中索引类型丰富,每种索引有着不同的应用场景,下面简单介绍一下。...在PostgreSQL当前支持的索引类型中,只有B-tree可以产生排序的输出,当ORDER BY与LIMIT n组合:显式排序将必须处理所有数据以识别前n行,但如果存在与ORDER BY匹配的索引,则可以直接检索前...PostgreSQL可以为表达式的结果创建索引,但是该索引维护代价太大,因为每当插入或者更新时,表达式都需要重新计算。...PostgreSQL支持对表中部分数据建立索引,使用部分索引的一个主要原因是避免索引常见值。...PostgreSQL支持仅索引扫描,当要查询的目标列都在索引中时,直接使用索引中的键值进行返回,不需要回表操作。 技术永无止境,加油吧。 Catch.jpg

    5.3K20

    PostgreSQL SQL 开发规范 试行

    PostgreSQL 不少的单位已经开始部署了,对于外包的开发,甲方也需要有相关的规范给出,虽然比MYSQL 的要求要少了不少,但该注意的还是要注意。...事务中需要有捕捉错误的代码,在存储过程出错后,进行及时反馈错误信息。函数不能与具体业务表有关,只能进行简单计算。...12 Postgresql 在使用中对于JOIN 的表的数量控制在3个及3个以内,如必须增加JOIN的表的数量,需要和DB 组商议,表设计中需要注意关联表之间的设计关系,关联字段类型的数据类型必须一致...中没有差别 14 Postgresql 对于单库的数据表的数量控制在300个表内 15 Postgresql 在事务中,将读事务放在前方,写事务放在后方 具体可以与DB 组商议。...20 Postgresql 在千万行级别的表中少使用count(*) 来进行相关的数据处理,必须有条件或走索引扫描计算。

    2.1K20

    「Postgresql架构」使用PostgreSQL中的JSONB数据类型加快操作

    最后一个问题背后的原因是,对于任何给定的列,PostgreSQL保存描述性统计信息,例如不同和最常见值的数量,NULL条目的分数,以及 - 对于有序类型 - 数据分布的直方图。...为避免这种情况,您可以考虑存储稍后可能在常规字段上汇总的数据。 有关此问题的进一步评论,您可以阅读Heap的博客文章何时在PostgreSQL架构中避免使用JSONB。...其中一个增强功能是GIN(广义倒置索引)索引以及随附的新品牌运营商。...jsonb相对于json数据类型的显着改进是能够索引JSON数据。 我们的玩具示例只有5个条目,但如果它们是数千或数百万个条目,我们可以通过构建索引来减少一半以上的搜索时间。...最后,请注意我已经涵盖了指数及其运算符的一些典型用法;有关更多详细信息和示例,请查看官方PostgreSQL文档中的jsonb索引以及JSON函数和运算符。

    6.1K20

    从零开始学PostgreSQL (十一):并发控制

    目前,对于UPDATE语句而言,考虑的列是那些具有可用于外键的唯一索引的列,不包括部分索引和表达式索引,但这在未来可能会改变。...在某些使用咨询锁的方法中,特别是在涉及显式排序和LIMIT子句的查询中,必须小心控制因SQL表达式求值顺序而获取的锁。...例如,在银行应用程序中,可能希望检查一个表中的所有贷方总额等于另一表中的借方总额,当两个表都在积极更新时,简单比较两个连续命令的结果在读已提交模式下不可靠。...插入一个GIN索引值通常会在每一行产生多个索引键插入,这意味着对单个值的插入可能涉及大量工作。 目前,B-树索引因其高性能和丰富的功能,最适合并发应用程序中对标量数据的索引。...而对于非标量数据,建议使用GiST、SP-GiST或GIN索引。B-树索引在处理并发性方面表现最优,而Hash索引和GIN索引各有其特定的应用场景和潜在的性能考量。

    19310

    PostgreSQL 索引类型详解

    索引和ORDER BY 目前 PostgreSQL 支持的索引类型中,只有 B 树能够产生排序的输出结果 — 其他索引类型返回的匹配行的顺序是未指定的,依赖于具体实现。...显然,具有非默认排序顺序的索引是一种相对特殊的功能,但有时它们可以为某些查询带来巨大的性能提升。是否值得维护这样的索引取决于查询中需要特定排序顺序的频率。...索引表达式的性能 索引表达式的维护成本较高,因为对于每次行插入和非 HOT 更新,必须计算派生表达式。然而,在索引搜索期间,不需要重新计算索引表达式,因为它们已经存储在索引中。...也可以通过创建具有限制的唯一部分索引,在列中只允许一个 null。IS NULL 例 11.4.不要使用部分索引来替代分区 在数据库中,不应该通过创建大量非重叠的部分索引来替代分区。...这对于了解实际查询工作负载中索引的使用情况非常重要。 收集统计信息: 在优化索引前,始终先运行 ANALYZE 命令。这个命令用于收集关于表中值分布的统计信息。

    9410

    见招拆招-PostgreSQL中文全文索引效率优化

    前言 上文 使用PostgreSQL进行中文全文检索 中我使用 PostgreSQL 搭建完成了一套中文全文检索系统,对数据库配置和分词都进行了优化,基本的查询完全可以支持,但是在使用过程中还是发现了一些很恼人的问题...---- 使用子查询优化查询效率 GIN索引效率问题 紧接着又发现了新的问题: PostgreSQL 的 GIN 索引(Generalized Inverted Index 通用倒排索引)存储的是 (key...缓存 对于这种响应超时的问题,大家肯定会想到万能的缓存:把响应超时的查询结果放到缓存,查询时先检查缓存。 可是超时的毕竟只有很少一部分,缓存的命中率堪忧。...分表 一个方法不行,那就换一个方向,既然某些关键词的结果集太大,那么我们就将它变小一些,我们一开始采用的策略是分表。...GIN 索引和前缀词查询的 B树索引之间配合并不完美。

    2.5K80

    Linux--awk命令

    花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。...在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。...然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况, awk 允许您定义一个 BEGIN 块。...数组 AWK 中的数组都是关联数组,数字索引也会转变为字符串索引 { cities[1]=”beijing” cities[2]=”shanghai” cities[“three...在 info 中查找满足正则表达式, /[0-9]+/ 用”!”

    6.4K30

    POSTGRESQL PG VS SQL SERVER 到底哪家强? (译) 应该是目前最全面的比较

    尽管它们共享一些核心特征,但它们之间存在某些差异。在本文中,我们提供详细的 PostgreSQL 和 SQL Server 之间相似和不同的概述。...MSSQL 中文:两种数据库的索引类型比较 PostgreSQL提供多个索引类型选项,包括B-tree、hash、广义搜索树(GiST)、空间划分GiST、广义反向索引(GIN)和区块范围索引(BRIN...聚集索引根据键值(索引定义中的列)对表或视图中的数据行进行排序。一个表只能有一个聚集索引。非聚集索引存储在表数据之外,每个键值条目都有一个指向数据的指针。...SQL Server本身不支持正则表达式评估;可以使用T-SQL函数LIKE、SUBSTRING和PATINDEX来实现类似但有限的结果。...SQL Server中的计算列如果未标记为PERSISTED属性,则不会在表中物理存储;只有在值是确定的(或始终返回相同的结果)时,列才能被持久化。

    3K20

    PostgreSQL 15 16 小版本更新信息小结 版本更新是不是挤牙膏

    Fix failure to remove non-first segments of large tables (Tom Lane) 15.1 在 GIN 索引的快速插入路径中修复 WAL 操作的错误排序...索引中避免具有极端区间值的计算溢出 https://www.postgresql.org/docs/release/15.5/ 15.5 避免系统日志记录器进程的标准输入意外关闭 15.6 跳过...The result would be a “could not read block” error. 15.7 修复 BRIN 输出函数中的错误 https://www.postgresql.org/...PG16.2 在并行哈希连接中避免请求过大的共享内存区域 pg16.2 修复了在继承树中复杂的情况下,进行alter table add column可能产生的错误问题 Fix possible failure...during ALTER TABLE ADD COLUMN on a complex inheritance tree (Tender Wang) 16.2 在备用服务器中在子事务期间错误处理死元组

    34610

    Linux每日一讲:awk命令

    花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。...在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。...I am Poe,my qq is 33794712 请从该文件中过滤出'Poe'字符串与33794712,最后输出的结果为:Poe 33794712 [root@Gin scripts]# awk -...然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况, awk 允许您定义一个 BEGIN 块。...在 info 中查找满足正则表达式, /[0-9]+/ 用”!”

    95920

    数据库PostrageSQL-客户端连接默认值

    受限的行可见性会导致不正确的结果时,可将其改成off。例如,pg_dump默认会做这种更改。这个变量对能绕过每一条行安全性策略的角色(即超级用户和具有BYPASSRLS)属性的角色没有效果。...当temp_tablespaces被交互式地设置时,指定一个不存在的表空间是一种错误,类似于为用户指定一个不具有CREATE权限的表空间。...这个设置当前仅适用于B-树索引。 如果没有元组从堆中删除,则当至少满足下列条件之一时,在VACUUM清理阶段仍会扫描B-树索引:索引统计信息过时或者索引中包含在清理时可回收的已删除页。...如果该列表增长到超过这个最大尺寸,会通过批量将其中的项移入主 GIN 数据结构来清理列表。默认值是四兆字节(4MB)。可以通过更改索引的存储参数来为个别 GIN 索引覆盖这个设置。...如果指定的库没有找到,连接尝试将会失败。只有超级用户能够更改这个设置。 这个特性的意图是允许在特定会话中载入调试用的或者测量性能的库,而不需要显式的给出一个 LOAD命令。

    4.3K20
    领券