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

强制索引扫描以进行多列比较

查锦程
2023-03-14
问题内容

我知道索引在内部是B树或类似的树结构。假设索引是为3列构建的(a,b,c),我希望Postgres执行以下操作:

  1. 在该B树中找到键[a = 10,b = 20,c = 30],
  2. 扫描下10个条目并返回它们。

如果索引只有一列,则解决方案显而易见:

select * from table1
where a >= 10
order by a limit 10

但是,如果有更多的列,解决方案将变得更加复杂。对于2列:

select * from table1
where a > 10 or (a = 10 and b >= 20)
order by a, b limit 10

3栏:

select * from table1
where a > 10 or (a = 10 and (b > 20 or b = 20 and c >= 30))
order by a, b, c limit 10

请注意查询:

select * from table1
where a >= 10 and b >= 20 and c >= 30
order by a, b, c limit 10

不正确的 ,因为它将例如过滤掉[a = 11,b = 10,c = 1]。

如何告诉Postgres我要执行此操作?

我是否可以确定,即使对于2+列的那些复杂查询,优化器也将始终理解他应该执行范围扫描? 为什么?


问题答案:

使用ROW值进行比较:

SELECT *
FROM   table1
WHERE  (a,b,c) >= (10, 20, 30)
ORDER  BY a,b,c
LIMIT  10;

>=尽管您的描述显示了建议,但仍可使用它来匹配您的代码>。两种方法都可以。)

(a,b,c)是的缩写ROW(a,b,c),真的。

是的,Postgres知道可以为此使用匹配的多列B树索引(与其他RDBMS不同-或我听说过)。

“匹配” 意味着所有索引表达式,它们的序列和关联的顺序(ASC| DESC)都是相同的-
或整个索引行的排序顺序完全相反,因此Postgres可以以几乎相同的速度向后扫描索引。
对于给定的示例,这些索引匹配:

(a ASC, b ASC, c ASC)
(a DESC, b DESC, c DESC)

但是这些 不是

(a ASC, b DESC, c ASC)
(a ASC, c ASC, b ASC)

在一系列时间戳上优化查询(两列)



 类似资料:
  • 问题内容: 据我所知,堆表是没有聚簇索引并且没有物理顺序的表。我有一个具有12万行的堆表“扫描”,并且正在使用以下选择: 如果为“ id”列创建非聚集索引,则将获得 223次物理读取 。如果删除非聚集索引并更改表以使“ id”成为主键(以及聚集索引),则将获得 515次物理读取 。 如果聚集索引表如下图所示: 为什么聚簇索引扫描的工作方式类似于表扫描?(或者在检索所有行的情况下更糟)。为什么不使用

  • 我想从标准输入中读取一个双数,但是我总是得到这个异常: Java . util . inputmismatchexception 如果输入是整数,那没问题,但是如果是双精度的,我会得到异常。 线程“main”Java . util . inputmismatchexception Java . util . scanner . throw for(scanner . Java:864)Java .

  • 问题内容: 我在MySQL数据库中有下表: SQL将如下所示: 如您所见,我同时创建了primaryId和和imgDate索引键。我的想法是,该WHERE子句使用primaryId,而ORDER子句使用来查询结果imgDate。 我的问题是,现在使用多索引会更好吗?还是我应该使用多列索引(目前我不太了解)? 这是我从EXPLAIN得到的: 注意:这不是使用多列索引,这是使用上表说明的结果。 问题答

  • 问题:我有一个SQL Server表,有一个varchar列和数百万行,它被索引。在SQL Server查询工具中运行查询很快,因为它使用索引。当我从JavaJDBCPreparedStatement运行查询时,需要花费很多分钟,调查显示SQLServer会进行表扫描。如何解决此问题?

  • 问题内容: 在PostgreSQL中,我在表的日期字段上有一个索引。当我将字段与进行比较时,查询效率很高: 如果我尝试将其与负间隔进行比较,它会下坡并使用位图堆扫描。 有没有一种更有效的使用日期算术查询的方法? 问题答案: 第一个查询希望找到 ,但实际上找到。 第二个查询期望找到 并实际找到。 当然,处理23倍的行会花费更多的时间。因此,您的实际时间不足为奇。 的数据统计信息已过时。跑: 并重复您

  • 本文向大家介绍在MySQL中搜索多列以进行行匹配,包括了在MySQL中搜索多列以进行行匹配的使用技巧和注意事项,需要的朋友参考一下 为此,请使用UNION。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是搜索多列的查询- 这将产生以下输出-