gpt4 book ai didi

sql - 使用 CURRENT_TIMESTAMP 查询时间戳分区表的效率

转载 作者:行者123 更新时间:2023-11-29 12:34:22 25 4
gpt4 key购买 nike

给定下表在 PostgreSQL 9.0.3 下的分区:

CREATE TABLE records (
ts TIMESTAMP,
...
);

CREATE TABLE records_2010 (
CHECK (ts >= '2010-01-01 00:00:00' AND ts < '2011-01-01 00:00:00')
) INHERITS (records);

CREATE TABLE records_2011 (
CHECK (ts >= '2011-01-01 00:00:00' AND ts < '2012-01-01 00:00:00')
) INHERITS (records);

我希望以下 SELECT 查询具有相同的 EXPLAINed 计划,仅查询“records”和“records_2011”,但它们不同:

BEGIN;
-- Assume CURRENT_TIMESTAMP is 9 a.m. on 5 March 2011
SELECT * FROM records WHERE ts >= '2011-03-05 09:00:00'; -- scans 2 tables
SELECT * FROM records WHERE ts >= CURRENT_TIMESTAMP; -- scans all 3 tables
COMMIT;

鉴于 CURRENT_TIMESTAMP 在其封闭事务期间返回一个常量值,为什么带有 CURRENT_TIMESTAMP 的查询不利用 Postgres 的分区而只扫描两个表?

更新:

目前这是不可能的,但它被认为是一个需要改进的领域。 PostgreSQL 9.1 可能 address this behavior in the query executor .

最佳答案

如果您是第一次运行查询,PostgreSQL 会确定一个查询计划。这是一个昂贵的操作,结果被缓存。因此查询也必须适用于 future 的执行。

无论何时运行,您的第一个查询都永远不需要 records_2010

但第二个查询使用变量 CURRENT_TIMESTAMP。优化器不知道时间只能增加,并生成一个计划,该计划适用于 ts 的任何值。这意味着它必须查看所有三个表。

关于sql - 使用 CURRENT_TIMESTAMP 查询时间戳分区表的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com