当前位置: 首页 > 面试题库 >

在PostgreSQL中索引空值

韩耘豪
2023-03-14
问题内容

我有以下形式的查询:

select m.id from mytable m
left outer join othertable o on o.m_id = m.id
    and o.col1 is not null and o.col2 is not null and o.col3 is not null
where o.id is null

该查询返回几百条记录,尽管这些表具有数百万行,并且它要花很长时间才能运行(大约一个小时)。

当我使用以下方法检查索引统计信息时:

select * from pg_stat_all_indexes
where schemaname <> 'pg_catalog' and (indexrelname like 'othertable_%' or indexrelname like 'mytable_%')

我看到只使用了othertable.m_id的索引,而根本没有使用col1..3的索引。为什么是这样?

我在一些
地方读过,PG传统上无法索引NULL值。但是,我已经阅读了自PG 8.3以来的情况,据说已经改变了吗?我目前在Ubuntu
10.04上使用PostgreSQL 8.4。我是否需要专门创建“部分”或“功能”索引以加快IS NOT
NULL查询的速度,还是已经为NULL编制索引,而我只是误解了这个问题?


问题答案:

您可以尝试部分索引:

CREATE INDEX idx_partial ON othertable (m_id)
WHERE (col1 is not null and col2 is not null and col3 is not null);

从文档中:http : //www.postgresql.org/docs/current/interactive/indexes-
partial.html



 类似资料:
  • 索引是加速搜索引擎检索数据的一种特殊表查询。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。 拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。 索引有助于加快 SELECT 查询和 WHERE 子句,但它会减慢使用 UPDATE 和 INSERT 语句时的数据输入。索引可以创建或删除,但不会影响数据。

  • 问题内容: 我知道如何创建索引 以及如何检查索引是否已存在? 我需要检查它们的存在并创建它们(如果还不存在)。 问题答案: 您可以使用以下查询获取索引列表,它们的表和列: 从那里,您可以按索引名称或所涉及的列检查是否存在,并决定创建/跳过索引。

  • PostgreSQL 提供了多种索引类型:B 树、hash、GiST 和 GIN,每种索引类型都有适合的应用场景,可以根据场景选择合适的索引以提高效率。 B 树 B 树适合相等判断和有序的区间查询,通常来说,经常使用这些查询时推荐使用 B 树索引: <、>、<=、>= 以及 =。 此外,对于判断字符串开头的 LIKE 和 ~ 查询也可以考虑使用 B 树索引。比如: col LIKE 'foo%'

  • 问题内容: 参考原始的stackoverflow问题,我试图将gin索引应用于Postgres 9.4中数组对象中的键,但没有得到第一个答案中所述的结果。 您能纠正错误吗? 我遵循的步骤已写在下面。 第1部分:创建表和索引 第2部分:查询 该查询给出空结果。 我也尝试使用GIN索引。 替代索引和查询: 问题答案: 原始答案中的这个特定jsonb示例缺少用于包含查询的非原始对象周围的数组层。此后已修

  • 问题内容: 我想使用Postgres 9.4 在json列上创建一个索引,该索引将在搜索列中的特定键时使用。 例如,我有一个带有json列“ animals”的“农场”表。 animals列具有通用格式的json对象: 我已经尝试了多个索引(分别): 我想运行如下查询: 并让该查询使用索引。 当我运行此查询时: 那么(1)索引就可以了,但是我无法获得任何索引来解决不平等问题。 这样的索引可能吗?

  • 我有一个ionic应用程序,它将json数据发送到使用laravel作为后端的api。 当发送请求到我的路由时,我在控制器上调用一个方法... 然后,该控制器获取数据并将其输入数据库,但有时并非所有从ionic应用程序发送的数据都在数据库中。 也就是说,我的laravel应用程序正在等待名字,姓氏,公司,有时我的离子应用程序只会发送first_name,last_name意味着公司的索引丢失。 如