zoukankan      html  css  js  c++  java
  • 【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 '%河津市%'

  • 相关阅读:
    golang交叉编译:Linux
    vmware共享文件夹
    虚拟机-Debian服务器配置
    day38--MySQL基础二
    day19-IO多路复用
    mysql 对时间的处理
    mysql 优化
    Linux性能查看
    day18-socket 编程
    JAVA 消耗 CPU过高排查方法
  • 原文地址:https://www.cnblogs.com/aukle/p/3226197.html
Copyright © 2011-2022 走看看