如何提高以下查询的性能
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 设置为第一个过滤器。
【讨论】:
以上是关于如何提高以下查询的性能的主要内容,如果未能解决你的问题,请参考以下文章