我在DB2中执行复杂查询,其响应时间非常长。经过大量的研发后,我发现重复使用max()
函数会导致执行时间受到阻碍。
因此,我想知道max()
函数是否有替代方法。我读了一下关于rank()
的内容,并想知道是否可以使用它,但是无法得到我想要的结果。
我的查询的一部分是:
Select DISTINCT
(Select MAX(DATE(last_timestamp)) from Table_1 where ID = E.EID)
From Table_2 E
我现在被困在这里太久了。所以任何帮助都会受到赞赏。
答案 0 :(得分:0)
row_number()优于rank(),因为您不需要重复项。这里是。我很感谢这个网站作为参考:https://www.ibm.com/developerworks/community/blogs/SQLTips4DB2LUW/entry/finding_the_maximum_row_and_more56?lang=en
SELECT DISTINCT last_timestamp
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY A.ID ORDER BY A.last_timestamp DESC) AS rn, DATE(A.last_timestamp) as last_timestamp
FROM Table_1 A, From Table_2 E where A.ID = E.EID)
WHERE rn = 1;
语法可能不准确,因为我没有测试它并且我没有安装DB2。
答案 1 :(得分:0)
问题可能是将时间戳转换为日期--DATE() - 在执行MAX()函数之前 - 不是DB2专家,但是猜测这可能会最终创建一个日期的临时表,然后MAXed,并且不使用索引......
建议尝试以下方法:
{{1}}
当然,查询优化器可能足够聪明,可以做到这一点......
答案 2 :(得分:0)
也许您可以加入以下CTE:
WITH t1(i,t) AS
( SELECT id, MAX(last_timestamp)
FROM Table_1
GROUP BY id )
SELECT
...
DATE(t1.t),
...
FROM Table_2
LEFT JOIN t1 ON Table_2.EID = t1.i