【发布时间】:2017-10-26 06:35:00
【问题描述】:
我有一个需要优化的 SQL 查询,因为它现在似乎永远运行。 我已经运行了 5 个多小时,但它似乎并没有结束。
SELECT
a.HD_ID,
CASE WHEN date_from > b.date_tag THEN date_from
ELSE b.date_tag
END date_from1,
CASE WHEN trunc(date_to)=b.date_tag THEN date_to
ELSE b.date_tag + interval '23 hours, 59 minutes,59 seconds'
END date_to1
FROM table1 a
JOIN table2 b
ON (b.date_tag between trunc(date_from) and date_to)
WHERE a.first_date between '2015-08-11' and sysdate-3;
我认为问题出在日期字段上,但我不知道有什么方法可以优化日期操作。 有人可以帮我解决这个问题吗?
【问题讨论】:
-
尝试将索引添加到
date_tag、date_from、date_to,以及first_date。您也可以在前后运行EXPLAIN,看看是否有帮助。 -
添加您正在使用的 DBMS 的标签
-
PostgreSQL 中没有
sysdate。请将EXPLAIN (ANALYZE, BUFFERS) SELECT ...的输出添加到问题中。 -
除了对解释计划等的请求 - 从 Table1 到 Table2 的连接似乎只引用 table2 和 date_from / date_to - 但没有给出这些值的来源(没有表别名,它们也是输入参数?)如果两个字段都不是来自table1,则会导致笛卡尔效应。笛卡尔是必需的,还是 table1 中的那些字段之一?
-
您确定此代码没有很多重复项吗?您只是按日期加入他们,这是很少做的事情。
标签: sql postgresql query-optimization