优化比较两个不同时间戳值的查询速度
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
中,则使用上述查询我会检查表。
如果它仅存在于其中一个中,则将其分配给deleted
或new
。
该查询在示例中运行快速且完美。
但是,当我将它应用到包含更多数据的原始数据库时,它的执行速度非常慢。 因此,我想知道是否有办法优化查询以使其在大量数据上也能快速运行?
【问题讨论】:
您的大表中是否只有 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;
【讨论】:
以上是关于优化比较两个不同时间戳值的查询速度的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 clojure.java.jdbc 插入包含时间戳值的行?