我想提高 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 的性能

INNER JOIN与LEFT JOIN在SQL Server的性能

提高分层 SQL 结构的性能

如何使用许多 JOIN 提高查询性能

提高 SQL Server 查询性能

提高 mariaDB 查询的 sql 代码性能