暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

为SQL创建合理的函数索引

原创 张卓 2019-03-21
596

问题描述

在测试环境中创建表,

create table ash_tmp as select * from dba_hist_active_sess_history;

给以下SQL设计合理的索引, 并解释创建改索引的原因。

select * from ash_tmp where to_char(sample_time,'YYYYMMDD-HH24') between
'20181128-09' and '20181128-10' and program like '%LGWR%' and event = 'log file parallel write';

专家解答

该语句当前执行计划如下:

image.png

       查看涉及到的列的统计信息:

select c.column_name,t.num_rows,c.num_distinct from dba_tables t,
dba_tab_columns cwhere t.owner=c.owner and t.table_name=c.table_name andt.table_name='ash_tmp' and column_name in (upper('sample_time'),upper('program'),upper('event'));
 
select count(*),count(distinct sample_time),count(distinct program),count(distinct event),count(distinct sample_time||’’ ||program||’’||event) from ash_tmp;

image.png

可以看到sample_time列选择度较高,所以为其创建单列索引;

索引创建后查看执行计划发现to_char的用法导致发生了函数转换,所以创建函数索引,再次查询,发现执行计划走了索引:

--create index idx_ash_tmp__time on ash_tmp(sample_time);
create index idx_ash_tmp_h_time on ash_tmp(to_char(sample_time,'yyyymmdd-hh24'));

image.png

最后修改时间:2019-04-14 10:24:40
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论