INDEXING STRATEGIES
Sean Scott
Oracle DBA, Bodybuilding.com
“An index is an optional structure, associated with a table or table
cluster, that can sometimes speed data access.”
B-TREE INDEXES
• Most common type of index
• Data is ordered within the index
• Consists of branches and leaves
B-TREE INDEXES
B-TREE INDEXES
• Options include
• Unique
• Descending
• Reverse Key
• Index Organized Tables
• Composite, Covering, Concatenated
• Compressed
REVERSE KEY INDEXES
• Creates a “mirror image” of the key
• UTOUG would become GUOTU
• Used to spread block splits and avoid hot blocks in RAC environments
• No index range scans
• Lots of conflicting information
• Test extensively, and use with caution
REVERSE KEY INDEXES
• Two implementations:
• last_updated_date in a customer order table
• Sequentially updated primary key
REVERSE KEY INDEXES
• Things to watch for:
• Increase in db sequential read wait events
• Backup time increase
• Space use increase
INDEX ORGANIZED TABLES
• Stores data and index in the same segment
• Must have a primary key
• Data is ordered
• Can have secondary indexes
• Useful for tables that are fully accessed
• Overflow for less-used data
COMPOSITE INDEXES
• Sometimes known as covering or concatenated
• Consist of more than one column
• Leading column is important
COMPOSITE INDEXES
create index test_i1
on test(col1);
create index test_i2
on test(col1, col2);
COMPOSITE INDEXES
• Choosing a leading column
• High cardinality?
• Low cardinality?
• Most frequently accessed
• The Poor-Man’s IOT
• Use to improve performance of select by reducing I/O
COVERING INDEXES
 SELECT price_id
,         price 
     FROM dcs_price
    WHERE version_id       = :1
      AND price_id           = :2;
-------------------------------------------------------------------------------------------
| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |             |     1 |    29 |     5   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS BY INDEX ROWID| DCS_PRICE   |     1 |    29 |     5   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | DCS_PRICE_P |     2 |       |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
create unique index dcs_price_i3
      on dcs_price (
price_id
, version_id
, price);
-----------------------------------------------------------------------------------
| Id  | Operation        | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                |     1 |    22 |     2   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| DCS_PRICE_I03 |     1 |    22 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------
COMPRESSED KEY INDEXES
• Leading columns have low cardinality
• Save space
• Improve performance
BITMAP INDEXES
• Index on low cardinality data
• Take up little space
• Bitmap join
• Typically found in data warehouse environments
FUNCTION BASED, INDEXEDVIRTUAL
• Index on a database function (predefined, user written)
• Allows index lookups when a function is used
• Both store the derived value in the index
INVISIBLE INDEXES
• Create or modify an index to be invisible
• Invisible to the optimizer
• Still maintained by the database
• Better, more reliable option than MONITORING USAGE
• Must set optimizer_use_invisible_indexes=TRUE
VIRTUAL INDEXES
• Only visible to the optimizer
• Used for evaluating an indexes usefulness
VIRTUAL INDEXES
SQL> create table test (col1 integer);
Table created.
SQL> create index test_i1 on test(col1);
Index created.
SQL> create index test_i2 on test(col1);
create index test_i2 on test(col1)
*
ERROR at line 1:
ORA-01408: such column list already indexed
VIRTUAL INDEXES
SQL> create index test_i2 on test(col1) nosegment;
Index created.
SQL> select table_name, index_name, column_name from user_ind_columns where
table_name = 'TEST';
TABLE_NAME INDEX_NAME COLUMN_NAME
------------------------------ ------------------------------ --------------------
TEST TEST_I1 COL1
TEST TEST_I2 COL1
CLUSTER INDEXES
• B-Tree Cluster Index
• Hash Cluster Index
• Hash clusters can exist on a single table
PARTITIONED INDEXES
• Global Partitioned
• Crosses partitions
• Exists on whole table
• Local Partitioned
• Unique to each partition
• Watch out for non-partitioned indexes on partitions
PARTITIONED INDEXES
• Locally partitioned indexes
• Isolate maintenance operations to a single partition
• Mark unusable/invisible independently
• Separate partitions into different tablespaces
• Prefixed, non-prefixed
• Unique indexes must include partition key
• Can only exist on partitioned tables
PARTITIONED INDEXES
• Globally partitioned indexes
• Can exist on non-partitioned tables
• Can be either range or hash based
• Partition maintenance can render the index unusable
• Global indexes on partitioned tables must lead with the partition key
PARTITIONED INDEXES
Local partition
Partition index unusable
Partition index unusable
Partitions involved unusable
Partition index unusable
No effect on index
No effect on index
Global or non-partition
Entire index unusable
Entire index unusable
Entire index unusable
Entire index unusable
Entire index unusable
Entire index unusable
Operation
Split
Move
Merge
Exchange
Truncate
Drop
WHAT TO INDEX
• Primary keys
• Unique keys
• Foreign keys
• Columns frequently used in where, distinct, and order by clauses
• Columns often queried together
Index all that should be, and no more.
If in doubt, b-tree is probably safest.
KEY CONSIDERATIONS
Create primary and unique keys within a create table or build the indexes
and constraints separately?
The create table method is easier, but:
• Indexes don’t persist
• May break GoldenGate, replication
create table test1 (
col1 integer);
create unique index
test1_p
on test1(col1);
alter table test1
add constraint
test1_p
primary key
(col1)
using index test1_p;
create table test2 (
col1 integer
primary key);
-or-
create table test2 (
col1 integer,
constraint test2_p
primary key
(col1));
select table_name, index_name
from dba_indexes
where table_name like 'TEST%';
TEST2 SYS_C0015135
TEST1 TEST1_P
alter table test1
drop constraint test1_p;
alter table test2
drop constraint SYS_C0015135;
select table_name, index_name
from dba_indexes
where table_name like 'TEST%';
TEST1 TEST1_P
• Pick a convention and stick to it!
• tablename_p
• tablename_un
• tablename_in
• tablename_fn
• tablename_bn
• ...etc
NAMING CONVENTION
--------------------------------------------------------------------------------------------------------
| Id | Operation" " " "" " " | Name" " " | Rows | Bytes| Cost (%CPU)| Time " |
--------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT"" "" " " |" " " " | 30| 4230| 560 (1)| 00:00:07|
| 1 | SORT ORDER BY" " " "" " |" " " " | 30| 4230| 560 (1)| 00:00:07|
| 2 | NESTED LOOPS" " " "" " |" " " " | 30| 4230| 559 (1)| 00:00:07|
| 3 | NESTED LOOPS "" "" " " |" " " " | 30| 3630| 552 (1)| 00:00:07|
| 4 | NESTED LOOPS"" "" " " |" " " " | 30| 2790| 544 (1)| 00:00:07|
| 5 | MERGE JOIN "" "" " " |" " " " | 30| 1290| 537 (1)| 00:00:07|
|* 6 | TABLE ACCESS BY INDEX ROWID " | TICKET_STATUSES" | 7| 42| 1 (0)| 00:00:01|
|* 7 | INDEX FULL SCAN" " "" | SYS_C0107546 | 10| | 1 (0)| 00:00:01|
|* 8 | SORT JOIN "" "" " " |" " " " | 35| 1295| 536 (1)| 00:00:07|
|* 9 | TABLE ACCESS BY INDEX ROWID " | TICKETS"" " | 35| 1295| 535 (1)| 00:00:07|
| 10 | " BITMAP CONVERSION TO ROWIDS " " |" " " " | | |" " |" " |
| 11 | " BITMAP AND" " "" " " |" " " " | | |" " " |" " |
| 12 | " BITMAP MINUS" " "" " |" " " " | | |" " | " " |
|* 13 | " BITMAP INDEX SINGLE VALUE" " | TICKETS1 " | | |" " | " " |
|* 14 | " BITMAP INDEX SINGLE VALUE" " | IDX_TICKETS_I01 "| | |" " " | " " |
|* 15 | " BITMAP INDEX SINGLE VALUE " " | TICKETS_INDEX | | |" " " |" " |
| 16 | TABLE ACCESS BY INDEX ROWID " | PANELS"" " | 1| 50| 1 (0)| 00:00:01|
|* 17 | INDEX UNIQUE SCAN " "" " | SYS_C0367234 " | 1| | 1 (0)| 00:00:01|
| 18 | TABLE ACCESS BY INDEX ROWID " | USERS" " " | 1| 28| 1 (0)| 00:00:01|
|* 19 | INDEX UNIQUE SCAN" " "" | SYS_C0038942" | 1| | 1 (0)| 00:00:01|
| 20 | TABLE ACCESS BY INDEX ROWID" "" | CUSTOMERS " " | 1| 20| 1 (0)| 00:00:01|
|* 21 | INDEX UNIQUE SCAN"" "" " | SYS_C8712300" | 1| | 1 (0)| 00:00:01|
--------------------------------------------------------------------------------------------------------
STORAGE
• Consider separating table and index tablespaces
• Specify suitable storage parameters
• PCTFREE is meaningless in indexes
• logging/nologging
• Extent and block size can be defined
• Manage backups
• Manage physical storage
• Index reorganization options
• alter index rebuild
• alter index coalesce
• alter index shrink space (compact)
MAINTENANCE
• Use DBMS_STATS
• Defaults are usually best:
exec dbms_stats.set_global_prefs(‘METHOD_OPT’, ‘FOR ALL COLUMNS SIZE AUTO’);
exec dbms_stats.reset_global_pref_defaults;
• CASCADE=TRUE
structureddata.org/2008/10/14/dbms_stats-method_opt-and-for-all-indexed-columns/
GENERATING STATISTICS
• Introduced in 11g
• Allows you to create column groups
• Determines a relationship among potentially skewed data
dbms_stats.create_extended_stats(
‘APP’, ‘CUSTOMERS’, ‘(BIRTHDATE, BIRTHSTONE)’);
EXTENDED STATISTICS
oracle.sean@gmail.com
sean.scott@bodybuilding.com
github.com/oraclesean/oracle

More Related Content

PDF
Introduction into MySQL Query Tuning for Dev[Op]s
PPTX
Understanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
PDF
AWR & ASH Analysis
PPTX
Adapting to Adaptive Plans on 12c
PDF
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAs
PDF
Oracle SQL Performance Tuning and Optimization v26 chapter 1
PDF
Oracle Performance Tuning Fundamentals
PDF
Chasing the optimizer
Introduction into MySQL Query Tuning for Dev[Op]s
Understanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
AWR & ASH Analysis
Adapting to Adaptive Plans on 12c
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle SQL Performance Tuning and Optimization v26 chapter 1
Oracle Performance Tuning Fundamentals
Chasing the optimizer

What's hot (20)

PDF
Parallel Execution With Oracle Database 12c - Masterclass
PPT
Your tuning arsenal: AWR, ADDM, ASH, Metrics and Advisors
PPTX
Sisteme de Operare: Sincronizare
PDF
Troubleshooting Tips and Tricks for Database 19c - Sangam 2019
PDF
Oracle Database performance tuning using oratop
PDF
Oracle Clusterware Node Management and Voting Disks
PDF
Troubleshooting Complex Oracle Performance Problems with Tanel Poder
PDF
Oracle db performance tuning
PPT
Using Statspack and AWR for Memory Monitoring and Tuning
PDF
SQLd360
PPTX
Sisteme de Operare: Sistemul de Intrare si Iesire
PPTX
Understanding my database through SQL*Plus using the free tool eDB360
PPTX
Hitchhiker's Guide to free Oracle tuning tools
PDF
TFA Collector - what can one do with it
PDF
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
PDF
Tanel Poder - Performance stories from Exadata Migrations
PPSX
How a Developer can Troubleshoot a SQL performing poorly on a Production DB
PDF
Oracle RAC 19c - the Basis for the Autonomous Database
DOC
AWR reports-Measuring CPU
PDF
Same plan different performance
Parallel Execution With Oracle Database 12c - Masterclass
Your tuning arsenal: AWR, ADDM, ASH, Metrics and Advisors
Sisteme de Operare: Sincronizare
Troubleshooting Tips and Tricks for Database 19c - Sangam 2019
Oracle Database performance tuning using oratop
Oracle Clusterware Node Management and Voting Disks
Troubleshooting Complex Oracle Performance Problems with Tanel Poder
Oracle db performance tuning
Using Statspack and AWR for Memory Monitoring and Tuning
SQLd360
Sisteme de Operare: Sistemul de Intrare si Iesire
Understanding my database through SQL*Plus using the free tool eDB360
Hitchhiker's Guide to free Oracle tuning tools
TFA Collector - what can one do with it
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
Tanel Poder - Performance stories from Exadata Migrations
How a Developer can Troubleshoot a SQL performing poorly on a Production DB
Oracle RAC 19c - the Basis for the Autonomous Database
AWR reports-Measuring CPU
Same plan different performance
Ad

Viewers also liked (8)

PDF
Oracle b tree index internals - rebuilding the thruth
PPT
Less13 Performance
PPTX
Oracle Data Redaction
PPTX
Oracle Database Performance Tuning Basics
PPTX
Getting to know oracle database objects iot, mviews, clusters and more…
PDF
Oracle Database Management - Backup/Recovery
PDF
Oracle Index
PPTX
Oracle database performance tuning
Oracle b tree index internals - rebuilding the thruth
Less13 Performance
Oracle Data Redaction
Oracle Database Performance Tuning Basics
Getting to know oracle database objects iot, mviews, clusters and more…
Oracle Database Management - Backup/Recovery
Oracle Index
Oracle database performance tuning
Ad

Similar to Indexing Strategies for Oracle Databases - Beyond the Create Index Statement (20)

PDF
Oracle Query Tuning Tips - Get it Right the First Time
PPT
Sydney Oracle Meetup - access paths
PPTX
Oracle sql high performance tuning
PPTX
Five Tips to Get the Most Out of Your Indexing
PPTX
Sql and PL/SQL Best Practices I
PPTX
Top 10 tips for Oracle performance
PDF
NOCOUG_201311_Fine_Tuning_Execution_Plans.pdf
PDF
Enterprise dbs and Database indexing
PDF
Horizontally Scalable Relational Databases with Spark: Spark Summit East talk...
PDF
Query Optimization with MySQL 5.6: Old and New Tricks
PPT
Dbms plan - A swiss army knife for performance engineers
PDF
12 things Oracle DBAs must know about SQL
PDF
Oracle Diagnostics : Joins - 1
PDF
Managing Statistics for Optimal Query Performance
PPTX
SQL Server 2022 Programmability & Performance
PPTX
Oracle performance tuning_sfsf
PDF
Oracle statistics by example
PDF
Ssn0020 ssis 2012 for beginners
PPTX
PHP UK 2020 Tutorial: MySQL Indexes, Histograms And other ways To Speed Up Yo...
PPTX
Oracle 122 partitioning_in_action_slide_share
Oracle Query Tuning Tips - Get it Right the First Time
Sydney Oracle Meetup - access paths
Oracle sql high performance tuning
Five Tips to Get the Most Out of Your Indexing
Sql and PL/SQL Best Practices I
Top 10 tips for Oracle performance
NOCOUG_201311_Fine_Tuning_Execution_Plans.pdf
Enterprise dbs and Database indexing
Horizontally Scalable Relational Databases with Spark: Spark Summit East talk...
Query Optimization with MySQL 5.6: Old and New Tricks
Dbms plan - A swiss army knife for performance engineers
12 things Oracle DBAs must know about SQL
Oracle Diagnostics : Joins - 1
Managing Statistics for Optimal Query Performance
SQL Server 2022 Programmability & Performance
Oracle performance tuning_sfsf
Oracle statistics by example
Ssn0020 ssis 2012 for beginners
PHP UK 2020 Tutorial: MySQL Indexes, Histograms And other ways To Speed Up Yo...
Oracle 122 partitioning_in_action_slide_share

Recently uploaded (20)

PPTX
recommendation Project PPT with details attached
PDF
Jean-Georges Perrin - Spark in Action, Second Edition (2020, Manning Publicat...
PPT
statistic analysis for study - data collection
PPTX
FMIS 108 and AISlaudon_mis17_ppt_ch11.pptx
PPTX
Caseware_IDEA_Detailed_Presentation.pptx
PPT
lectureusjsjdhdsjjshdshshddhdhddhhd1.ppt
PDF
Best Data Science Professional Certificates in the USA | IABAC
PPTX
CHAPTER-2-THE-ACCOUNTING-PROCESS-2-4.pptx
PPTX
Business_Capability_Map_Collection__pptx
PDF
REAL ILLUMINATI AGENT IN KAMPALA UGANDA CALL ON+256765750853/0705037305
PDF
Microsoft 365 products and services descrption
PPTX
eGramSWARAJ-PPT Training Module for beginners
PPTX
Tapan_20220802057_Researchinternship_final_stage.pptx
PDF
Global Data and Analytics Market Outlook Report
PPT
PROJECT CYCLE MANAGEMENT FRAMEWORK (PCM).ppt
PPTX
DS-40-Pre-Engagement and Kickoff deck - v8.0.pptx
PPTX
chuitkarjhanbijunsdivndsijvndiucbhsaxnmzsicvjsd
PPTX
chrmotography.pptx food anaylysis techni
PPTX
sac 451hinhgsgshssjsjsjheegdggeegegdggddgeg.pptx
PDF
Tetra Pak Index 2023 - The future of health and nutrition - Full report.pdf
recommendation Project PPT with details attached
Jean-Georges Perrin - Spark in Action, Second Edition (2020, Manning Publicat...
statistic analysis for study - data collection
FMIS 108 and AISlaudon_mis17_ppt_ch11.pptx
Caseware_IDEA_Detailed_Presentation.pptx
lectureusjsjdhdsjjshdshshddhdhddhhd1.ppt
Best Data Science Professional Certificates in the USA | IABAC
CHAPTER-2-THE-ACCOUNTING-PROCESS-2-4.pptx
Business_Capability_Map_Collection__pptx
REAL ILLUMINATI AGENT IN KAMPALA UGANDA CALL ON+256765750853/0705037305
Microsoft 365 products and services descrption
eGramSWARAJ-PPT Training Module for beginners
Tapan_20220802057_Researchinternship_final_stage.pptx
Global Data and Analytics Market Outlook Report
PROJECT CYCLE MANAGEMENT FRAMEWORK (PCM).ppt
DS-40-Pre-Engagement and Kickoff deck - v8.0.pptx
chuitkarjhanbijunsdivndsijvndiucbhsaxnmzsicvjsd
chrmotography.pptx food anaylysis techni
sac 451hinhgsgshssjsjsjheegdggeegegdggddgeg.pptx
Tetra Pak Index 2023 - The future of health and nutrition - Full report.pdf

Indexing Strategies for Oracle Databases - Beyond the Create Index Statement

  • 2. “An index is an optional structure, associated with a table or table cluster, that can sometimes speed data access.”
  • 3. B-TREE INDEXES • Most common type of index • Data is ordered within the index • Consists of branches and leaves
  • 5. B-TREE INDEXES • Options include • Unique • Descending • Reverse Key • Index Organized Tables • Composite, Covering, Concatenated • Compressed
  • 6. REVERSE KEY INDEXES • Creates a “mirror image” of the key • UTOUG would become GUOTU • Used to spread block splits and avoid hot blocks in RAC environments • No index range scans • Lots of conflicting information • Test extensively, and use with caution
  • 7. REVERSE KEY INDEXES • Two implementations: • last_updated_date in a customer order table • Sequentially updated primary key
  • 8. REVERSE KEY INDEXES • Things to watch for: • Increase in db sequential read wait events • Backup time increase • Space use increase
  • 9. INDEX ORGANIZED TABLES • Stores data and index in the same segment • Must have a primary key • Data is ordered • Can have secondary indexes • Useful for tables that are fully accessed • Overflow for less-used data
  • 10. COMPOSITE INDEXES • Sometimes known as covering or concatenated • Consist of more than one column • Leading column is important
  • 11. COMPOSITE INDEXES create index test_i1 on test(col1); create index test_i2 on test(col1, col2);
  • 12. COMPOSITE INDEXES • Choosing a leading column • High cardinality? • Low cardinality? • Most frequently accessed
  • 13. • The Poor-Man’s IOT • Use to improve performance of select by reducing I/O COVERING INDEXES
  • 14.  SELECT price_id ,         price       FROM dcs_price     WHERE version_id       = :1       AND price_id           = :2; ------------------------------------------------------------------------------------------- | Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     | ------------------------------------------------------------------------------------------- |   0 | SELECT STATEMENT            |             |     1 |    29 |     5   (0)| 00:00:01 | |*  1 |  TABLE ACCESS BY INDEX ROWID| DCS_PRICE   |     1 |    29 |     5   (0)| 00:00:01 | |*  2 |   INDEX RANGE SCAN          | DCS_PRICE_P |     2 |       |     3   (0)| 00:00:01 | -------------------------------------------------------------------------------------------
  • 15. create unique index dcs_price_i3       on dcs_price ( price_id , version_id , price); ----------------------------------------------------------------------------------- | Id  | Operation        | Name           | Rows  | Bytes | Cost (%CPU)| Time     | ----------------------------------------------------------------------------------- |   0 | SELECT STATEMENT |                |     1 |    22 |     2   (0)| 00:00:01 | |*  1 |  INDEX RANGE SCAN| DCS_PRICE_I03 |     1 |    22 |     2   (0)| 00:00:01 | -----------------------------------------------------------------------------------
  • 16. COMPRESSED KEY INDEXES • Leading columns have low cardinality • Save space • Improve performance
  • 17. BITMAP INDEXES • Index on low cardinality data • Take up little space • Bitmap join • Typically found in data warehouse environments
  • 18. FUNCTION BASED, INDEXEDVIRTUAL • Index on a database function (predefined, user written) • Allows index lookups when a function is used • Both store the derived value in the index
  • 19. INVISIBLE INDEXES • Create or modify an index to be invisible • Invisible to the optimizer • Still maintained by the database • Better, more reliable option than MONITORING USAGE • Must set optimizer_use_invisible_indexes=TRUE
  • 20. VIRTUAL INDEXES • Only visible to the optimizer • Used for evaluating an indexes usefulness
  • 21. VIRTUAL INDEXES SQL> create table test (col1 integer); Table created. SQL> create index test_i1 on test(col1); Index created. SQL> create index test_i2 on test(col1); create index test_i2 on test(col1) * ERROR at line 1: ORA-01408: such column list already indexed
  • 22. VIRTUAL INDEXES SQL> create index test_i2 on test(col1) nosegment; Index created. SQL> select table_name, index_name, column_name from user_ind_columns where table_name = 'TEST'; TABLE_NAME INDEX_NAME COLUMN_NAME ------------------------------ ------------------------------ -------------------- TEST TEST_I1 COL1 TEST TEST_I2 COL1
  • 23. CLUSTER INDEXES • B-Tree Cluster Index • Hash Cluster Index • Hash clusters can exist on a single table
  • 24. PARTITIONED INDEXES • Global Partitioned • Crosses partitions • Exists on whole table • Local Partitioned • Unique to each partition • Watch out for non-partitioned indexes on partitions
  • 25. PARTITIONED INDEXES • Locally partitioned indexes • Isolate maintenance operations to a single partition • Mark unusable/invisible independently • Separate partitions into different tablespaces • Prefixed, non-prefixed • Unique indexes must include partition key • Can only exist on partitioned tables
  • 26. PARTITIONED INDEXES • Globally partitioned indexes • Can exist on non-partitioned tables • Can be either range or hash based • Partition maintenance can render the index unusable • Global indexes on partitioned tables must lead with the partition key
  • 27. PARTITIONED INDEXES Local partition Partition index unusable Partition index unusable Partitions involved unusable Partition index unusable No effect on index No effect on index Global or non-partition Entire index unusable Entire index unusable Entire index unusable Entire index unusable Entire index unusable Entire index unusable Operation Split Move Merge Exchange Truncate Drop
  • 28. WHAT TO INDEX • Primary keys • Unique keys • Foreign keys • Columns frequently used in where, distinct, and order by clauses • Columns often queried together
  • 29. Index all that should be, and no more.
  • 30. If in doubt, b-tree is probably safest.
  • 31. KEY CONSIDERATIONS Create primary and unique keys within a create table or build the indexes and constraints separately? The create table method is easier, but: • Indexes don’t persist • May break GoldenGate, replication
  • 32. create table test1 ( col1 integer); create unique index test1_p on test1(col1); alter table test1 add constraint test1_p primary key (col1) using index test1_p; create table test2 ( col1 integer primary key); -or- create table test2 ( col1 integer, constraint test2_p primary key (col1));
  • 33. select table_name, index_name from dba_indexes where table_name like 'TEST%'; TEST2 SYS_C0015135 TEST1 TEST1_P
  • 34. alter table test1 drop constraint test1_p; alter table test2 drop constraint SYS_C0015135; select table_name, index_name from dba_indexes where table_name like 'TEST%'; TEST1 TEST1_P
  • 35. • Pick a convention and stick to it! • tablename_p • tablename_un • tablename_in • tablename_fn • tablename_bn • ...etc NAMING CONVENTION
  • 36. -------------------------------------------------------------------------------------------------------- | Id | Operation" " " "" " " | Name" " " | Rows | Bytes| Cost (%CPU)| Time " | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT"" "" " " |" " " " | 30| 4230| 560 (1)| 00:00:07| | 1 | SORT ORDER BY" " " "" " |" " " " | 30| 4230| 560 (1)| 00:00:07| | 2 | NESTED LOOPS" " " "" " |" " " " | 30| 4230| 559 (1)| 00:00:07| | 3 | NESTED LOOPS "" "" " " |" " " " | 30| 3630| 552 (1)| 00:00:07| | 4 | NESTED LOOPS"" "" " " |" " " " | 30| 2790| 544 (1)| 00:00:07| | 5 | MERGE JOIN "" "" " " |" " " " | 30| 1290| 537 (1)| 00:00:07| |* 6 | TABLE ACCESS BY INDEX ROWID " | TICKET_STATUSES" | 7| 42| 1 (0)| 00:00:01| |* 7 | INDEX FULL SCAN" " "" | SYS_C0107546 | 10| | 1 (0)| 00:00:01| |* 8 | SORT JOIN "" "" " " |" " " " | 35| 1295| 536 (1)| 00:00:07| |* 9 | TABLE ACCESS BY INDEX ROWID " | TICKETS"" " | 35| 1295| 535 (1)| 00:00:07| | 10 | " BITMAP CONVERSION TO ROWIDS " " |" " " " | | |" " |" " | | 11 | " BITMAP AND" " "" " " |" " " " | | |" " " |" " | | 12 | " BITMAP MINUS" " "" " |" " " " | | |" " | " " | |* 13 | " BITMAP INDEX SINGLE VALUE" " | TICKETS1 " | | |" " | " " | |* 14 | " BITMAP INDEX SINGLE VALUE" " | IDX_TICKETS_I01 "| | |" " " | " " | |* 15 | " BITMAP INDEX SINGLE VALUE " " | TICKETS_INDEX | | |" " " |" " | | 16 | TABLE ACCESS BY INDEX ROWID " | PANELS"" " | 1| 50| 1 (0)| 00:00:01| |* 17 | INDEX UNIQUE SCAN " "" " | SYS_C0367234 " | 1| | 1 (0)| 00:00:01| | 18 | TABLE ACCESS BY INDEX ROWID " | USERS" " " | 1| 28| 1 (0)| 00:00:01| |* 19 | INDEX UNIQUE SCAN" " "" | SYS_C0038942" | 1| | 1 (0)| 00:00:01| | 20 | TABLE ACCESS BY INDEX ROWID" "" | CUSTOMERS " " | 1| 20| 1 (0)| 00:00:01| |* 21 | INDEX UNIQUE SCAN"" "" " | SYS_C8712300" | 1| | 1 (0)| 00:00:01| --------------------------------------------------------------------------------------------------------
  • 37. STORAGE • Consider separating table and index tablespaces • Specify suitable storage parameters • PCTFREE is meaningless in indexes • logging/nologging • Extent and block size can be defined • Manage backups • Manage physical storage
  • 38. • Index reorganization options • alter index rebuild • alter index coalesce • alter index shrink space (compact) MAINTENANCE
  • 39. • Use DBMS_STATS • Defaults are usually best: exec dbms_stats.set_global_prefs(‘METHOD_OPT’, ‘FOR ALL COLUMNS SIZE AUTO’); exec dbms_stats.reset_global_pref_defaults; • CASCADE=TRUE structureddata.org/2008/10/14/dbms_stats-method_opt-and-for-all-indexed-columns/ GENERATING STATISTICS
  • 40. • Introduced in 11g • Allows you to create column groups • Determines a relationship among potentially skewed data dbms_stats.create_extended_stats( ‘APP’, ‘CUSTOMERS’, ‘(BIRTHDATE, BIRTHSTONE)’); EXTENDED STATISTICS