Thursday, January 24, 2013

Dynamic Sampling

Working on a query that selects from a Master Table and then outer joins three sub-queries to it based on a common column. While looking at the execution plan generated by the optimizer, I noticed this:

   - dynamic sampling used for this statement (level=5)

After some research on Dynamic Sampling (DS), I had noticed that I was using Parallel hints in my statement so I removed them expecting not to see DS being used. This made no difference. I also looked at our INIT setting - it was set to default (2):

NAME                                 TYPE        VALUE
------------------------------------ ----------- ----------
optimizer_dynamic_sampling           integer     2

Further research suggested missing Statistics and/or Histograms on the Tables used in my query. This was not the case either.

Recent Stats collected:

select table_name, LAST_ANALYZED from dba_tables where table_name in ('...')

No Locked Stats either:

where table_name in ('...')

So, I started to work backward and run my query with one table and add in each sub-query after checking the execution plans each time for DS.

Table 1 (Master) => no DS
Table 1 and sub-query => no DS
Table 1 and 2 sub-queries => no DS
Table 1 and 3 sub-queries => DS=5

So it appears that when I add the 3rd sub-query, DS kicks in. Originally I had thought that this could be caused by using the PIVOT command but I rewrote the sub-query as a simple SELECT statement just for testing. This made no difference - DS=5 was still being used.

One possible theory:

Perhaps in ‘auto’ mode the Optimizer just doesn’t feel that, based on my WHERE clause, that Stats are good enough and forces to augment the Stats with DS ?  When I join to this Table, I am (outer) joining on all Indexed columns. Perhaps that is a clue?

   and a.index_code = e.index_code(+)
   and a.fiscal_year = e.fiscal_year(+)
   and A.FISCAL_PERIOD = e.fiscal_period(+)
   and a.account = e.ACCT_CODE(+)

To be continued...

No comments:

Post a Comment