繁体   English   中英

CTE 中的连接是否在 postgres 中被索引或可搜索

[英]Are joins in CTEs indexed or searchable in postgres

有谁知道 Postgres 是否足够聪明,可以以某种二进制方式在 memory 表中搜索一个,或者如果没有,有没有办法标记一个列来告诉 postgres 它是有序的并且可以以二进制方式搜索?

我知道您不能在 postgres 中的 memory 表/CTE 中放置索引。 我很好奇是否有人知道 postgres 是否已经在以某种方式搜索,或者我是否可以给它一个提示。 最终,我很好奇是否值得尝试做我正在做的事情。

在我的场景中,我正在创建一系列日期( generate_series(...) ),按天排序,以及一些我想包含在许多结果中的计算信息。 它是日期查找表的功能等价物,除了我在 memory (CTE) 中为有限的日期子集生成此表。 一般的想法是,这将阻止我需要对目标表中的每一行数据进行某些计算(这可能并且经常在许多不同的记录中具有相同的日期),而是每个只计算一次日期,然后简单地在目标表中查找。

但是,这可能是几年的日期(5+),我想如果 postgres 对这些数据进行列扫描,它可能比只进行在线计算要慢。

我正在做的一些人为的例子(也未经测试,所以可能有一些语法错误),但我认为它得到了基本点。

WITH dates AS (
  SELECT 
    day::date as day,
    EXTRACT(DOW FROM day) as day_of_week,
    EXTRACT(DOY FROM day) as day_of_year -- etc
  FROM generate_series('1/1/2015'::timestamp, '12/31/2020'::timestamp, '1 day'::interval) day
)
SELECT
  mt.*, d.day_of_week, d.day_of_year -- etc
FROM my_table mt INNER JOIN dates d ON mt.date = d.day

不,PostgreSQL 不执行二进制搜索。 pg_am中列出了唯一的访问方法:顺序扫描和索引扫描。 所以 PostgreSQL 将不得不扫描整个 function 结果。 您可以将 function 结果加载到临时表中,在其上创建索引并在查询中使用它,但这对于一次性查询不会胜出。

我建议为周围的日期保留一个永久的查找表。

PostgreSQL 不提供二分搜索连接。 但它确实提供了合并连接和 hash 连接。 这些如何连接到 CTE 的详细信息将取决于 PostgreSQL 的版本和您尚未共享的列数据类型。 您可以使用EXPLAIN或更好的EXPLAIN (ANALYZE, BUFFERS)来查看它在您的系统上实际执行的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM