我如何提高以下查询的性能

时间:2018-08-08 06:40:23

标签: sql oracle sql-tuning

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秒,具体取决于数据。有什么可以进一步改善的,以便更好地进行调整。

4 个答案:

答案 0 :(得分:1)

您可以先修复以下基本知识:

  

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

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

然后删除无用的鞋帮。

答案 1 :(得分:0)

尝试删除子查询:

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子句中

答案 2 :(得分:0)

尝试这个

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 :(得分:0)

尝试以下代码(尽管我在黑暗中却不知道真实数据):

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')

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