 |
|
Oracle 11g changes to dbms_stats
Oracle Database Tips by Donald Burleson
|
In Oracle 11g we now see
11g
extended optimizer statistics, an
alternative to dynamic_sampling for estimating result set
sizes.
Arup Nanda has a great article on extended statistics with
dbms_stats,
specialty histogram analysis using function-based columnar data:Next, re-gather statistics on the table and collect the
extended statistics on the expression upper(cust_name).
begin
dbms_stats.gather_table_stats (
ownname => 'ARUP',
tabname => 'CUSTOMERS',
method_opt => 'for all columns size skewonly for columns (upper(cust_name))'
);
end;
Alternatively you can define
the column group as part of the gather statistics command.
You do that by placing
these columns in the method_opt parameter of the gather_table_stats procedure in
dbms_stats as shown below:
begin
dbms_stats.gather_table_stats (
ownname => 'ARUP',
tabname => 'BOOKINGS',
estimate_percent=> 100,
method_opt => 'FOR ALL COLUMNS SIZE SKEWONLY FOR COLUMNS(HOTEL_ID,RATE_CATEGORY)',
cascade => true
The new 10g default value for dbms_stats method_opt is
'FOR ALL COLUMNS SIZE AUTO'.
Using "for all columns size auto" directs Oracle to decide
automatically which will get histograms. Oracle examine the skew
of column values and also examines the "workload" associated with the
columns (querying v$sql for current SQL). However, the overhead
of creating and managing zillions of histograms can easily outweigh
the performance benefits of having the histograms.
It's a perpetual trade-off between sub-optimal plans and unneeded
overhead.
An exploration of "intelligent histogram creation", is needed, a
method that uses AWR to correlate the SQL to the objects, avoiding
histograms that are never used, and develop a method to only create
histograms that "make a difference".
|