• 【Oracle 函数索引】一次数据库的优化过程


    【问题】表里数据2万条,查询执行时间 818087.38 ms(12分钟)。
    SQL语句如下:select   F1,F2,F3,F4
      from t_sms_g_send t
      left join v_sms_mstate zt
        on t.dstatus = zt.DICCODE
    where t.ddepartment = '部门'
       and GetXXX(t.F2) like '%河津市%'
    order by  mmitdate desc

    【分析】
    1、检查 表上索引情况,正常.
    2、分析SQL语句,发现存在GetXXX函数,函数代码存在select 子查询,初步判断此函数严重影响查询速度,需要优化。
    3、建立函数索引GetXXX(t.F2),索引名称为FDX_Send ,发现表与函数不是同一User下的,表属于a用户,函数属于B用户。需要对函数的Execute权限 grant to A用户。而且自定义函数在建立时需要
    DETERMINISTIC 标识。
    4、
    建立函数索引后,又发现查询语句属于模糊搜索(即 like ‘%XXX%’),一般索引在模糊搜索下会全表扫描。但此函数索引不是要用其索引的快速筛选功能,而是要用其函数内部计算的过程(直接使用索引值而不用每次查询时再计算函数了,因为其严重影响效率),所以考虑只要使索引在执行计划中起效就行。
    5、通过建立 hint 强制语句使用索引,查看执行计划 FDX_SEND起效,方式为Full Index Scan。
    查询时间最终优化从12m 到  10s以下。

    【结论】
    在无法优化结构和比较复杂查询的情况下,注重函数索引和Hint的使用。
    最后语句如下,
    select   /*+index(a,fdx_send)*/ F1,F2,F3,F4
      from t_sms_g_send t
      left join v_sms_mstate zt
        on t.dstatus = zt.DICCODE
    where t.ddepartment = '部门'
    and GetXXX(t.F2) like '%河津市%'

  • 相关阅读:
    简爱 灵魂所在
    charles抓取http/https
    Class.forName()用法
    ArrayList源码剖析
    java中的多线程
    分布式负载均衡缓冲系统,如何快速定位到是那个服务器
    maven依赖jar包时版本冲突的解决
    简单工厂模式设计(java反射机制改进)
    Fiddler 抓包工具使用详解
    Fiddler 使用
  • 原文地址:https://www.cnblogs.com/riskyer/p/3223524.html
Copyright © 2020-2023  润新知