优化比较两个不同时间戳值的查询速度

Posted

技术标签:

【中文标题】优化比较两个不同时间戳值的查询速度【英文标题】:Optimize speed of query which compares values of two different time-stamps 【发布时间】:2020-09-03 18:35:57 【问题描述】:

DB-Fiddle

CREATE TABLE operations (
    id int auto_increment primary key,
    time_stamp DATE,
    product VARCHAR(255)
);

INSERT INTO operations
(time_stamp, product)
VALUES 
("2020-01-01", "Product_A"),
("2020-01-01", "Product_B"),
("2020-01-01", "Product_C"),
("2020-01-01", "Product_D"),

("2020-03-15", "Product_A"),
("2020-03-15", "Product_C"),
("2020-03-15", "Product_E");

查询:

SELECT 
time_stamp,
product,

 (CASE 
 WHEN MAX(time_stamp) OVER (PARTITION BY product) 
    = MIN(time_stamp) OVER () THEN 'deleted'
 WHEN MIN(time_stamp) OVER (PARTITION BY product) 
    = MAX(time_stamp) OVER () THEN 'new'
 ELSE 'both' END) AS existing_type
 
FROM operations
GROUP BY time_stamp, product
ORDER BY product, time_stamp;

如果产品存在于both time-stamps 中,则使用上述查询我会检查表。 如果它仅存在于其中一个中,则将其分配给deletednew。 该查询在示例中运行快速且完美。

但是,当我将它应用到包含更多数据的原始数据库时,它的执行速度非常慢。 因此,我想知道是否有办法优化查询以使其在大量数据上也能快速运行?

【问题讨论】:

您的大表中是否只有 2 个时间戳值? 请再添加几行——包括一些“两种”情况。并指出“正确”的结果集。 【参考方案1】:

您提供的数据中没有重复的 timestamp/product 对。这表明聚合是多余的:

SELECT time_stamp, product,
       (CASE WHEN MAX(time_stamp) OVER (PARTITION BY product) = MIN(time_stamp) OVER () THEN 'deleted'
             WHEN MIN(time_stamp) OVER (PARTITION BY product) = MAX(time_stamp) OVER () THEN 'new'
             ELSE 'both'
        END) AS existing_type 
FROM operations
ORDER BY 2, 1;

【讨论】:

以上是关于优化比较两个不同时间戳值的查询速度的主要内容,如果未能解决你的问题,请参考以下文章

加入两个表后 Hive 时间戳值更改

sql 显示在最后一小时内具有时间戳值的行

如何使用 clojure.java.jdbc 插入包含时间戳值的行?

Pandas:如何添加两个时间戳值?

以准确的 MAX 顺序获取特定时间戳之间具有 MAX 值的记录

bigquery 标准 sql 错误,时间戳无效