我想提高 JOIN SQL 性能
Posted
技术标签:
【中文标题】我想提高 JOIN SQL 性能【英文标题】:I want to inprove JOIN SQL performance 【发布时间】:2019-01-16 01:03:59 【问题描述】:以下代码是选择每个 CID 的最新数据的查询。但查询速度很慢(大约 4 秒)。
表格信息
CID, GATH_DTM(datatype: date) 是PK。
DATA_STAT_CODE 是一个标志。
索引:列
PK_020:CID,GATH_DTM IDX_020_STAT_CODE:DATA_STAT_CODE、CID、GATH_DTM TABLE_INDEX : GATH_DTM ACCUM_IDX:ACCUM_QTY优化器计划结果
哈希分组方式:索引范围扫描 嵌套循环:索引范围扫描选择结果
SELECT COUNT(*) FROM tb_020; and SELECT COUNT(*) FROM tb_020 WHERE DATA_STAT_CODE = 28001;
3591336
SELECT COUNT(*) FROM tb_020; and SELECT COUNT(*) FROM tb_020;
4179537
SQL
SELECT *
FROM TB_020 E,
(SELECT /*+ INDEX(TB_020 IDX_020_STAT_CODE)*/
CID,
MAX(GATH_DTM) GATH_DTM
FROM TB_020
WHERE DATA_STAT_CODE=28001
GROUP BY CID
) J
WHERE E.GATH_DTM=J.GATH_DTM
AND E.CID =J.CID
我想提高性能。
【问题讨论】:
您有多个查询。您希望在哪个方面提高性能? @GordonLinoff 哦,我要 SQL1(现在是 SQL,删除 SQL2) 使用 ANSI JOIN 语法。内部联接 。您正在使用旧的 JOIN 语法 @VenkataramanR 是的,我已经尝试过了。但性能仍然相同。 @sw.jeong,我并不是从性能的角度来看 ANSI JOIN 语法。在代码可维护性和代码过时以及遵守标准方面更多。 【参考方案1】:我建议您避免使用索引提示。 ORACLE 更了解使用基于成本的优化器。此外,随着数据的增长,您当前的索引提示可能已过时。我觉得你已经有足够的索引了。只需尝试以下方法,看看您的查询是否表现更好。
SELECT *
FROM TB_020 AS E
INNER JOIN (SELECT
CID,
MAX(GATH_DTM) GATH_DTM
FROM TB_020
WHERE DATA_STAT_CODE=28001
GROUP BY CID
) AS J
ON E.GATH_DTM=J.GATH_DTM
AND E.CID =J.CID
【讨论】:
哦,它比旧查询更快。【参考方案2】:尝试:
select *
from tb_020 e
where E.GATH_DTM in (SELECT MAX(GATH_DTM) GATH_DTM
FROM TB_020 j
WHERE DATA_STAT_CODE = 28001
AND j.CID = e.cid);
【讨论】:
运行时间从 4 秒缩短到 2 秒。但我想减少更多.. 也试试这个.. select * from ( SELECT e.*, ROW_NUMBER() OVER(PARTITION BY e.CID ORDER BY e.GATH_DTM desc) seq_no FROM tb_020 e where e.DATA_STAT_CODE = 28001 )其中 seq_no = 1;【参考方案3】:您可以使用row_number()
SELECT * FROM
( SELECT t.*, row_number() OVER ( PARTITION BY CID ORDER BY GATH_DTM DESC ) as rn
FROM TB_020 t
WHERE DATA_STAT_CODE=28001
) WHERE rn = 1
【讨论】:
这个查询比旧查询慢。 @sw.jeong :正如另一个答案所提到的,在没有这些提示的情况下也可以尝试这个查询。以上是关于我想提高 JOIN SQL 性能的主要内容,如果未能解决你的问题,请参考以下文章
SQL:如何使用 CASE 提高 INNER JOIN 的性能