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秒,具体取决于数据。有什么可以进一步改善的,以便更好地进行调整。
答案 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子句(因为它对您的选择没有帮助)。