问题描述
在测试环境中创建表,
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';
专家解答
该语句当前执行计划如下:
查看涉及到的列的统计信息:
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;
可以看到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'));
最后修改时间:2019-04-14 10:24:40
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。