Oracle composite index column ordering
Answer: You are correct that the column sequence matters! This is an empirical question, and you need to run diagnostic scripts against your SQL workload (STATSPACK or AWR) to examine how frequently a specific index column was needed by SQL. Remember, it's the SQL workload that drives your choice of composite indexes, and the order of the columns within the index.
See these important scripts to display multi-column index usage using AWR.
- In general, when using a multi-column index, you want to put the most restrictive column value first (the column with the highest unique values) because this will trim-down the result set.
- Because Oracle can only access one index, your job is to examine your historical SQL workload and build a single composite index that satisfies the majority of the SQL queries.
- The Oracle optimizer may try to make single column indexes behave as-if they were a single composite index. Prior to 10g, this could be done with the "and_equal" hint.
- Beware that indexes have overhead and see my notes on detecting duplicate index columns.
- You can run scripts to monitor the invocation count for each column in a multiple column composite index (see counting column usage from a SQL workload)
I have more complete details on composite index usage monitoring in my bookAdvanced Oracle SQL Tuning: The Definitive Reference. Also, see my related notes on tuning with composite bitmap indexes and my scripts to monitor which columns of a composite index are used, and counting index column usage from AWR and STATSPACK.
Large Multi-column Composite Indexes
Multi-column indexes with more than 3 columns may not provide more efficient access than a two-column index. The objective of the index is to reduce the amount of rows returned from a table access. Therefore each added column must substantially reduce the number of returned rows to be effective. For example, assuming a large table, on a query with 5 or more WHERE (AND) clauses using a 5-column index may return only 1 row. However using a 3-column index may return only 50 rows. A two-column index returns 200 rows. The time it takes to extract the one row from the 200 rows using nested-loops is negligible.
Thus the two-column index may be almost as efficient (fast) as the 5-column index. The key is to index the most restrictive columns. Another tradeoff is a table with multiple column indexes where the leading column(s) are the same. For instance, a table with four 3-column indexes where the leading two columns are the same may work very efficiently on select statements but cause a heavy penalty on inserts and updates. Just one 2-column index on the leading two columns may provide acceptable query performance while greatly improving DML.
Small tables with two or three columns may benefit by being rebuilt as an Index Organized Table (IOT). A 2-column table with a primary key and a two-column index has 1.5 times the data in indexes that are in the table. Making the table an Index Organized Table reduced the need for indexes because the table is the index. Also IOTs can have indexes on non-leading columns if required. Again this has to be balanced with the overhead of maintaining the IOT.
Lastly, do not be afraid to use temporary indexes. If you run a nightly report that requires 6 hours to run, but will run in 30 mins with a specific index, you might want to create the index before running the report and drop it upon completion. I work with clients that drop certain indexes to expedite the bill run, then recreate then for the normal application. They create indexes each night and drop them in the morning. There is nothing wrong with dynamically changing you database to respond to varying tasks if it results in efficiency.
Script for tracking composite index column usage
These scripts will only track SQL that you have directed Oracle to capture via your threshold settings in AWR or STATSPACK. STATSPACK and AWR will not collect "transient SQL" that did not appear in v$sql at snapshot time. Hence, not all SQL will appear in these reports. See my notes here on adjusting the SQL capture thresholds.
index_usage_hr.sql
SEE CODE DEPOT FOR FULL SCRIPTS dba_hist_snapshot sn, dba_hist_sql_plan p, dba_hist_sqlstat st where st.sql_id = p.sql_id and sn.snap_id = st.snap_id and p.object_name = ‘&idxname' group by begin_interval_time,search_columns;
The query will produce an output showing a summary count of the index specified during the snapshot interval. This can be compared to the number of times that a table was invoked from SQL. Here is a sample of the output from the script.
Invocation Counts for cust_index Begin Interval Invocation time Search Columns Count -------------------- -------------- ----------- 04-10-21 15 1 3 04-10-10 16 0 1 04-10-10 19 1 1 04-10-11 02 0 2 04-10-11 04 2 1 04-10-11 06 3 1 04-10-11 11 0 1 04-10-11 12 0 2 04-10-11 13 2 1 04-10-11 15 0 3 04-10-11 17 0 14 04-10-11 18 4 1 04-10-11 19 0 1 04-10-11 20 3 7 04-10-11 21 0 1Oracle composite index column ordering的更多相关文章
- Oracle 字段监控 ( column monitor)
Oracle 字段监控 ( column monitor) */--> Oracle 字段监控 ( column monitor) Table of Contents 1. 开启与关闭 2. 字 ...
- mysql 1709: Index column size too large. The maximum column size is 767 bytes.
1709: Index column size too large. The maximum column size is 767 bytes. 修改排序规则解决 utf8_general_ci
- Index column size too large. The maximum column size is 767 bytes.
mysql建表时报Index column size too large. The maximum column size is 767 bytes.解决办法:在建表语句的后面加入:ENGINE=In ...
- JanusGraph 创建索引步骤(composite index)踩坑总结
前言 JanusGraph是一个图数据库引擎,安装及入门可以参考 JanusGraph 图数据库安装小记.为了提高查询速度,在使用过程中一般要为某些属性创建索引.这篇随笔主要是记录创建索引过程中踩过的 ...
- Oracle(创建index)
概念: 1. 类似书的目录结构 2. Oracle 的“索引”对象,与表关联的可选对象,提高SQL查询语句的速度 3. 索引直接指向包含所查询值的行的位置,减少磁盘I/O 4. 与所索引的表是相互独立 ...
- Oracle alter index rebuild 与 ORA-08104 说明
在ITPUB 论坛上看到的一个帖子,很不错.根据论坛的帖子重做整理了一下. 原文链接如下: alter index rebuild online引发的血案 http://www.itpub.net/t ...
- oracle alter index rebuild offline与online
oracle index build online与offline测试环境为oracle 11.2.0.4 --sql test SQL> conn test/test )); begin .. ...
- Oracle 11G INDEX FULL SCAN 和 INDEX FAST FULL SCAN 对比分析
SQL> drop table test; 表已删除. SQL> create table test as select * from dba_objects where 1!=1; 表已 ...
- Oracle 索引 index
索引是一个模式对象,其中包含每个值的条目,该条目出现在表或集群的索引列中,并提供对行的直接快速访问. 创建一个索引: create index 索引名 on 表名 (字段名); 删除索引: dro ...
随机推荐
- 《HTML5与CSS3基础教程》学习笔记 ——Two Day
第七章 1. 样式表:选择器和生命块 2. !important: 某条声明的重要程度比其他高,在末尾添加 3. 属性值:inherit; 是强制继承 4. 1em=16px; 5. 可以 ...
- apache commons-email1.3使用
apache commons-email1.3下载地址: https://repository.apache.org/content/repositories/orgapachecommons-0 ...
- OpenJudge 666:放苹果
总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输 ...
- poj 3669 Meteor Shower
Me ...
- [windows phone开发]新生助手的开发过程与体会一
功能需求分析: 1. 为到达学院的新生指路,给出所有路线,并给出必要提示: 2. 对学院建筑进行介绍: 3. 对学院周边环境(交通.购物.银行等)进行介绍: 4. 必要的应用设置 总体设计: ...
- 命名空间 和 class_exist() 问题
#namespace_test_1.php <?php namespace namespace_test_1; class test { const NAMESPACE = 'namespace ...
- Turn.js 实现翻书效果的学习与总结
最近CTO给我分配了一个移动端H5开发的任务,主要功能是需要实现翻书效果,我听过主要需求后,当时是呀!!!接下来自己尝试使用fullPage.js和Swiper来实现翻书效果,结果效果都不是非常的理想 ...
- 每日一“酷”之heapq
作用:heapq模块实现一个适用于Python列表的最小堆排序算法 堆(heap)是一个属性数据结构,其中子节点与父节点是一种有序关系.二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全 ...
- WPF学习05:2D绘图 使用Transform进行控件变形
在WPF学习04:2D绘图 使用Shape绘基本图形中,我们了解了如何绘制基本的图形. 这一次,我们进一步,研究如何将图形变形. 例子 一个三角形,经Transform形成组合图形: XAML代码: ...
- iOS常见问题(2)
一.模拟器黑屏 解决方法: 二.打代码时,Xcode没提示 解决方法: 0. 点击Preferences 1. 进入Text Editing 2. 勾选 三.有时候可能在勾选 Autolayout的时 ...