One of the most controversial topics among DBAs is whether to rebuild indexes or not.
But it is so generic that the answer to the question depends on the database version, the index type and the reasons behind doing it.
In most cases, we consider b-tree indexes for rebuilt. Note that b stands not for “binary” but for “balanced”. We create indexes mostly for performance reasons. If performance is the real concern, we need to first understand at least at high level how those indexes are organized.
The MOS note Lists All Indexes that Benefit from a Rebuild (Doc ID 122008.1) suggests that indexes considered for rebuilt are indexes for which:
– deleted entries represent 20% or more of the current entries
– the index depth is more then 4 levels
And possible candidate for bitmap index were considered when the distinctiveness was more than 99%:
if ( height > 5 ) OR ( (del_lf_rows/lf_rows) > 0.2 ) then
dbms_output.put_line (rpad(r_indx.owner,16,’ ‘) || rpad(r_indx.index_name,40,’ ‘) ||
lpad(round((del_lf_rows/lf_rows)*100,3),17,’ ‘) ||
lpad(height-1,7,’ ‘) || lpad(round((lf_rows-distinct_keys)*100/lf_rows,3),16,’ ‘));
However, it is a good question if this applies to version 11g and above. I have personally seen good benefits of rebuilding indexes satisfying those conditions in lower versions of the database.
Another MOS article, Script to investigate a b-tree index structure (Doc ID 989186.1), provides a script which is quite handy as it verifies the structure of a b-tree index based on the existing table and index statistics. The script calculates the following items:
– Estimate the size the index should be as optimal packing can be specified
– The index layout
This script keeps a history of the the data gathered in the INDEX_HIST table. This can be useful to prevent a pattern in index rebuilding. The history log can be user defined.
Yes another MOS article, Index Rebuild, the Need vs the Implications (Doc ID 989093.1), specifies that the most common justifications given for rebuilding an index are:
– index becomes fragmented
– index grows and grows – deleted space is not re-used
– index clustering factor becomes out of sync
However, as noted, the impact of rebuilding the index can be quite significant:
Most scripts around depend on the index_stats dynamic tableRedo activity may increase and general performance might be impacted as a direct result of rebuilding an index
An index coalesce is often preferred instead of an index rebuild. It has the following advantages:
does not require approximately 2 times the disk storagealways onlinedoes not restructure the index, but combines index leaf blocks as much as possible, avoiding system overhead
Due to the reasons listed above, it is strongly advised not to rebuild indexes on a regular basis but instead use proper diagnostics.
Next, here is my personal experience from rebuilding indexes: either drop and create or simply rebuild. I have seen 3 main use cases:
For performance reasons: because of too many deleted rows or because of split index nodes. With every new release of Oracle, it looks like that we need less and less time on performing such a rebuild operation. Indexes get fragmented over time and occupy too much space. There was a mission critical production database where data was about 500MB and the indexes all together were about 4TB. You can release sometimes quite a lot of space.Indexes should be in my opinion in a separate tablespace. Not where the data is. If something gets wrong with the index tablespace: logical or physical corruption, or deleting files unintentionally, then it is just a matter of time to recreate the indexes again.
In Oracle 21c, there is a new feature called Automatic Index Optimization. The optimization process includes 3 actions:
• Compress: Compresses portions of the key values in an index segment (~3 times)
• Shrink: Merges the contents of index blocks where possible to free blocks for reuse
• Rebuild: Rebuilds an index to improve space usage and access speed
For a very long time, both DBAs and Developers, have been struggling (really struggling) with what indexes should be created, what type of indexes they should be created as and what indexes should be dropped from the database. By far, the most interesting new feature of Oracle Database 19c is Automatic Index creation (AI Creation). In the long run, this is to be one of the most important features in the Oracle database. Note that you cannot rebuild an auto index! Nice and useful capability for AI is that Oracle automatically rebuilds indexes that are marked as “Unusable”.
For more, check:
Automatic Indexes: Automatically Rebuild Unusable Indexes Part I by Richard Foote
Oracle B-Tree Index Internals: Rebuilding The Truth:
“Generally rebuild index when the clustering factor exceeds eight times the number of dirty blocks in the base table, when the levels exceed two or when there are excessive brown nodes in the index”.
When an index should be rebuilt? by Gouranga
SQL Server: Reorganize and Rebuild Indexes in the Database
“Microsoft recommends fixing index fragmentation issues by rebuilding the index if the fragmentation percentage of the index exceeds 30%, where it recommends fixing the index fragmentation issue by reorganizing the index if the index fragmentation percentage exceeds 5% and less than 30%”
How Often Do You Rebuild Indexes?
Rebuilding Indexes by Jonathan Lewis
Read MoreJulian Dontcheff’s Database Blog