【Oracle 函数索引】一次数据库的优化过程
2013-07-29 19:17
405 查看
【问题】表里数据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 '%河津市%'
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 '%河津市%'
相关文章推荐
- 【Oracle 函数索引】一次数据库的优化过程
- 【Oracle 函数索引】一次数据库的优化过程
- 数据库开发必看 -- 用索引优化SQL,开发优秀的分页存储过程(一)
- 记一次oracle创建一个新数据库,并导入正式环境数据库备份的dmp包过程
- Oracle 优化——位图、函数等索引介绍
- Oracle学习总结(7)—— 常用的数据库索引优化语句总结
- 【Oracle】记一次数据库连接没有关闭导致数据库宕机的排查过程
- Oracle学习总结(7)—— 常用的数据库索引优化语句总结
- 数据库开发必看 -- 用索引优化SQL,开发优秀的分页存储过程(一)
- 数据库字符集不一样导致函数或存储过程中使用的索引失效
- Oracle数据库开发之存储过程和自定义函数
- Oracle 10g管理存储过程——查询数据库中的视图、存储过程、函数
- 14.数据库oracle必学,其他最好了解一种以上(mysql,sql server,access==) oracle:视图,索引,存储过程,触发器,游标,包,常用函数
- 数据库开发必看 -- 用索引优化SQL,开发优秀的分页存储过程(三)
- 【数据库学习笔记】Oracle_04_存储过程,函数,触发器,索引,同义词
- 数据库开发必看 -- 用索引优化SQL,开发优秀的分页存储过程(三)
- 记录一次SqlServer查询优化的过程(聚合索引的使用)
- oracle 创建表,序列,索引,视图,触发器,函数,存储过程,定时器,包体
- 一个用 Oracle 函数索引进行优化的例子
- 运用ORACLE的OO4O类库函数解决调用存储过程向远程数据库上传超过32K图片失败的问题