【问题标题】: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

标签: sql oracle sql-tuning


【解决方案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 设置为第一个过滤器。

        【讨论】:

          猜你喜欢
          • 2015-10-19
          • 1970-01-01
          • 1970-01-01
          • 2016-01-17
          • 1970-01-01
          • 2013-03-21
          • 1970-01-01
          • 2017-01-21
          • 2013-12-15
          相关资源
          最近更新 更多