1. There isn't a direct way. You can compare the difference in last_analyzed times from dba_tables:
select table_name, last_analyzed ,
(last_analyzed - lag(last_analyzed) over (order by last_analyzed)) * 86400 time_in_s
from dba_tables
where last_analyzed > sysdate - 1
order by 1 desc, table_name;Last_analyzed is a date, so it only has precision to the second. So this is non-deterministic if you have small tables than take less than a second to analyze.
2. The auto degree is either 1 (for small object) or up to the limit calculated as follows:
PARALLEL_THREADS_PER_CPU X CPU_COUNT
http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-bp-for-stats-gather-12c-1967354.pdf 3. How are you determining that the table has changed by more than 10%?
You should calculate it using the following:
select (m.inserts + m.updates + m.deletes) / t.num_rows
from user_tab_modifications m
join user_tables t
on t.table_name = m.table_name;
If this is > 10%, are stats on the table locked?
4. The stale percentage (number of rows modified - default 10) determines whether an object needs stats or not. Objects below this threshold aren't analyzed. I don't have the exact algorithm, but it will be based on those the changed percentage (the query above) and those tables with no stats.