Oracle Histogram is very nice feature to help CBO to make right decision while constructing execution plan. But many of DBA’s do not use it, assuming it is complex concept to use. In next few posts, I will try to simplify it, so that we can achieve maximum benefit from it.
What it Histogram & what is its purpose:
A histogram is a special type of column statistic that provides more detailed information about the data distribution in a table column. In simple words, it is a feature in CBO and it helps optimizer to determine how data are distributed/skewed within column. Predicates with skewed data are good candidates for histogram creation.
Basically CBO assumes uniform data distribution of data inside column across the distinct values. For the columns that contain skewed data, histogram helps to generate more accurate execution plans.
Below example will explain you significance of histograms:
I have a table ADI.SALES_ORDER with 100000 rows with index SALES_ORDER_N1 on column GENERATED.
GENERATED column has 4 distinct values: A, B, Y, N. CBO will assume uniform data distribution across these values. So any query with column GENERATED as predicate will go for FTS, as CBO will assume it has to select 25% data from table.
But in reality data under column generated in skewed as given below:
I gathered fresh statistics without histogram on table as shown below:
Now will compare execution plan with different values for predicate:
As expected this query is going for FTS, as it has to select approx. 80% of data.
But I will expect query to pick index in case of GENERATED=’N’ as it will just select less than 1% of rows from table.
But NO its still going for FTS 😦 & it is due to CBO’s default behavior.
Now here Histogram should come into picture:
Now I will once again compare plans:
As expected following query is going for FTS, as it has to select approx. 80% of data.
But following query has picked up index due to creation of histogram. 🙂
In this post, we focused on what is histogram & why it is used.
Hope so u will find this post very useful:-)
Stay tuned for Oracle Histograms Simplified: Part 2, in which I will explain what are different ways to create & drop histogram on particular column.