如何提高以下查询的性能

Posted

技术标签:

【中文标题】如何提高以下查询的性能【英文标题】:How can i improve performance of below query 【发布时间】:2018-08-08 06:40:23 【问题描述】:
select 
    m.* 
from 
    MEDICALHIERARCHY_LEAF_LEVEL_V_5_0_LC_1 m 
inner join  
    (select synid 
     from SYNID_PROFILE_MAP_5 
     where upper(map_type) = upper('primary') 
       and upper(map_to_profile) = upper('Diagnostic Tests & Exams'))
map on m.name = map.synid 
where 
    m.Depth is null

以上查询需要 5-20 秒,具体取决于数据。可以进一步改进它以更好地调整。

【问题讨论】:

你是唯一知道数据的人......所以你是唯一能够改进它的人。我们不知道容量、索引、执行计划......如果没有这些信息,您希望我们如何帮助解决这个问题!? @jamie Drq 我想知道我可以用什么替代方法来改进它(例如,鞋面可以替代什么,因为鞋面本身就是一个减慢它的功能) 如果你真的想改进那个查询,我问你的信息很重要,相信我 您使用的是什么RDBMS?请为您的问题添加相关标签 @marc_s 我正在使用 oracle 【参考方案1】:

您可以从修复以下基本内容开始:

UPPER(map_to_profile)=UPPER('诊断测试和考试'))

除非您使用区分大小写的排序规则,否则上层只会做一件事:确保不使用索引并且查询可能会变慢。如果您不想要区分大小写的排序规则,请不要使用区分大小写的排序规则。

然后把没用的鞋面去掉。

【讨论】:

【参考方案2】:

试试这个

Select m.* from MEDICALHIERARCHY_LEAF_LEVEL_V_5_0_LC_1 m inner join  
(select synid from SYNID_PROFILE_MAP_5 where  UPPER(map_type) = 
'PRIMARY' and UPPER(map_to_profile)='DIAGNOSTIC TESTS & EXAMS')
map on m.name=map.synid where m.Depth is null

避免在 m.* 中使用 * 而不是这样使用列名

【讨论】:

【参考方案3】:

尝试删除子查询:

SELECT m.* 
FROM MEDICALHIERARCHY_LEAF_LEVEL_V_5_0_LC_1 m INNER JOIN  
SYNID_PROFILE_MAP_5 map ON (CASE WHEN m.Depth is null THEN m.name end)=(CASE WHEN UPPER(map_type) = 
UPPER('primary') and UPPER(map_to_profile)=UPPER('Diagnostic Tests & Exams') THEN map.synid end)

根据您的连接条件,您可能希望将m.Depth is null 放入WHERE 子句中

【讨论】:

【参考方案4】:

试试这段代码(虽然我一无所知,不知道真实数据):

SELECT m.*
  FROM MEDICALHIERARCHY_LEAF_LEVEL_V_5_0_LC_1 m
 WHERE m.DEPTH IS NULL
   AND m.name = (SELECT synid
                   FROM SYNID_PROFILE_MAP_5
                  WHERE UPPER (map_type) = 'PRIMARY'
                    AND UPPER (map_to_profile) = 'DIAGNOSTIC TESTS & EXAMS')

我删除了不必要的 UPPER 函数并删除了您的 JOIN to WHERE 子句(因为它对您的选择没有贡献),同时将 m.DEPTH IS NULL 设置为第一个过滤器。

【讨论】:

以上是关于如何提高以下查询的性能的主要内容,如果未能解决你的问题,请参考以下文章

如何提高这个慢查询的性能

如何提高子查询的性能或 sql 中子查询的替代方案

如何提高 SQL Server 查询的性能 [关闭]

如何提高此 PostgreSQL 查询在索引扫描中的性能

从 Android ContactsContract.Contacts 查询所有联系人的许多数据时如何提高性能?

如何提高其 SET 涉及昂贵的聚合子查询的 SQL UPDATE 语句的性能?