搜集直方图

SQL> drop table test purge;

Table dropped.

SQL> create table test as select * from dba_objects;

Table created.


SQL> select a.column_name,
       b.num_rows,
       a.num_distinct Cardinality,
       round(a.num_distinct / b.num_rows * 100, 2) selectivity,
       a.histogram,
       a.num_buckets
  from dba_tab_col_statistics a, dba_tables b
 where a.owner = b.owner
   and a.table_name = b.table_name
   and a.owner = 'TEST'
   and a.table_name = 'TEST';
  2    3    4    5    6    7    8    9   10   11  
no rows selected

此时没有直方图的信息

BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'TEST',
                                tabname          => 'TEST',
                                estimate_percent => 100,
                                method_opt       => 'for all columns size skewonly',
                                no_invalidate    => FALSE,
                                degree           => 8,
                                cascade          => TRUE);
END;

method_opt       => 'for all columns size skewonly'---这种方式基本上对所有的列都搜集了直方图信息

SQL> select a.column_name,
       b.num_rows,
       a.num_distinct Cardinality,
       round(a.num_distinct / b.num_rows * 100, 2) selectivity,
       a.histogram,
       a.num_buckets
  from dba_tab_col_statistics a, dba_tables b
 where a.owner = b.owner
   and a.table_name = b.table_name
   and a.owner = 'TEST'
   and a.table_name = 'TEST';  2    3    4    5    6    7    8    9   10   11  

COLUMN_NAME			 NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM	  NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
OWNER				    72530	   30	      .04 FREQUENCY		   30
OBJECT_NAME			    72530	44279	    61.05 HEIGHT BALANCED	  254
SUBOBJECT_NAME			    72530	  114	      .16 FREQUENCY		  114
OBJECT_ID			    72530	72530	      100 NONE			    1
DATA_OBJECT_ID			    72530	 7687	     10.6 HEIGHT BALANCED	  254
OBJECT_TYPE			    72530	   44	      .06 FREQUENCY		   44
CREATED 			    72530	 1093	     1.51 HEIGHT BALANCED	  254
LAST_DDL_TIME			    72530	 1143	     1.58 HEIGHT BALANCED	  254
TIMESTAMP			    72530	 1214	     1.67 HEIGHT BALANCED	  254
STATUS				    72530	    2		0 FREQUENCY		    2
TEMPORARY			    72530	    2		0 FREQUENCY		    2

COLUMN_NAME			 NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM	  NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
GENERATED			    72530	    2		0 FREQUENCY		    2
SECONDARY			    72530	    2		0 FREQUENCY		    2
NAMESPACE			    72530	   21	      .03 FREQUENCY		   21
EDITION_NAME			    72530	    0		0 NONE			    0

15 rows selected.

可以看到基本上对所有列都搜集了直方图信息

SQL> drop table test purge;

Table dropped.

SQL>  create table test as select * from dba_objects;

Table created.

---------------------------------------------------------------------------------------------------------
SQL> BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'TEST',
                                tabname          => 'TEST',
                                estimate_percent => 100,
                                method_opt       => 'for all columns size auto',
                                no_invalidate    => FALSE,
                                degree           => 8,
                                cascade          => TRUE);
END;  2    3    4    5    6    7    8    9  
 10  /

PL/SQL procedure successfully completed.

SQL> select a.column_name,
       b.num_rows,
       a.num_distinct Cardinality,
       round(a.num_distinct / b.num_rows * 100, 2) selectivity,
       a.histogram,
       a.num_buckets
  from dba_tab_col_statistics a, dba_tables b
 where a.owner = b.owner
   and a.table_name = b.table_name
   and a.owner = 'TEST'
   and a.table_name = 'TEST';  2    3    4    5    6    7    8    9   10   11  

COLUMN_NAME			 NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM	  NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
OWNER				    72530	   30	      .04 NONE			    1
OBJECT_NAME			    72530	44279	    61.05 NONE			    1
SUBOBJECT_NAME			    72530	  114	      .16 NONE			    1
OBJECT_ID			    72530	72530	      100 NONE			    1
DATA_OBJECT_ID			    72530	 7687	     10.6 NONE			    1
OBJECT_TYPE			    72530	   44	      .06 NONE			    1
CREATED 			    72530	 1093	     1.51 NONE			    1
LAST_DDL_TIME			    72530	 1143	     1.58 NONE			    1
TIMESTAMP			    72530	 1214	     1.67 NONE			    1
STATUS				    72530	    2		0 NONE			    1
TEMPORARY			    72530	    2		0 NONE			    1

COLUMN_NAME			 NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM	  NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
GENERATED			    72530	    2		0 NONE			    1
SECONDARY			    72530	    2		0 NONE			    1
NAMESPACE			    72530	   21	      .03 NONE			    1
EDITION_NAME			    72530	    0		0 NONE			    0

15 rows selected.

SQL> select count(*) from test where owner='SYS';

  COUNT(*)
----------
     30795

SQL> BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'TEST',
                                tabname          => 'TEST',
                                estimate_percent => 100,
                                method_opt       => 'for all columns size auto',
                                no_invalidate    => FALSE,
                                degree           => 8,
                                cascade          => TRUE);
END;
  2    3    4    5    6    7    8    9   10  
 11  /

PL/SQL procedure successfully completed.

SQL> select a.column_name,
       b.num_rows,
       a.num_distinct Cardinality,
       round(a.num_distinct / b.num_rows * 100, 2) selectivity,
       a.histogram,
       a.num_buckets
  from dba_tab_col_statistics a, dba_tables b
 where a.owner = b.owner
   and a.table_name = b.table_name
   and a.owner = 'TEST'
   and a.table_name = 'TEST';  2    3    4    5    6    7    8    9   10   11  

COLUMN_NAME			 NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM	  NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
OWNER				    72530	   30	      .04 FREQUENCY		   30
OBJECT_NAME			    72530	44279	    61.05 NONE			    1
SUBOBJECT_NAME			    72530	  114	      .16 NONE			    1
OBJECT_ID			    72530	72530	      100 NONE			    1
DATA_OBJECT_ID			    72530	 7687	     10.6 NONE			    1
OBJECT_TYPE			    72530	   44	      .06 NONE			    1
CREATED 			    72530	 1093	     1.51 NONE			    1
LAST_DDL_TIME			    72530	 1143	     1.58 NONE			    1
TIMESTAMP			    72530	 1214	     1.67 NONE			    1
STATUS				    72530	    2		0 NONE			    1
TEMPORARY			    72530	    2		0 NONE			    1

COLUMN_NAME			 NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM	  NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
GENERATED			    72530	    2		0 NONE			    1
SECONDARY			    72530	    2		0 NONE			    1
NAMESPACE			    72530	   21	      .03 NONE			    1
EDITION_NAME			    72530	    0		0 NONE			    0

auto的方式 有where条件去搜集


---------------------------------------------------------------------------------------------------
SQL> drop table test purge;

Table dropped.

SQL>  create table test as select * from dba_objects;

Table created.

SQL> select a.column_name,
       b.num_rows,
       a.num_distinct Cardinality,
       round(a.num_distinct / b.num_rows * 100, 2) selectivity,
       a.histogram,
       a.num_buckets
  from dba_tab_col_statistics a, dba_tables b
 where a.owner = b.owner
   and a.table_name = b.table_name
   and a.owner = 'TEST'
   and a.table_name = 'TEST';  2    3    4    5    6    7    8    9   10   11  

no rows selected


SQL> BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'TEST',
                                tabname          => 'TEST',
                                estimate_percent => 100,
                                method_opt       => 'for  columns  owner size skewonly',
                                no_invalidate    => FALSE,
                                degree           => 8,
                                cascade          => TRUE);
END;
  2    3    4    5    6    7    8    9   10  
 11  /

PL/SQL procedure successfully completed.

SQL> select a.column_name,
       b.num_rows,
       a.num_distinct Cardinality,
       round(a.num_distinct / b.num_rows * 100, 2) selectivity,
       a.histogram,
       a.num_buckets
  from dba_tab_col_statistics a, dba_tables b
 where a.owner = b.owner
   and a.table_name = b.table_name
   and a.owner = 'TEST'
   and a.table_name = 'TEST';  2    3    4    5    6    7    8    9   10   11  

COLUMN_NAME			 NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM	  NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
OWNER				    72530	   30	      .04 FREQUENCY		   30

SQL> select a.column_name,
       b.num_rows,
       a.num_distinct Cardinality,
       round(a.num_distinct / b.num_rows * 100, 2) selectivity,
       a.histogram,
       a.num_buckets
  from dba_tab_col_statistics a, dba_tables b
 where a.owner = b.owner
   and a.table_name = b.table_name
   and a.owner = 'TEST'
   and a.table_name = 'TEST';  2    3    4    5    6    7    8    9   10   11  

COLUMN_NAME			 NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM	  NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
OWNER				    72530	   30	      .04 FREQUENCY		   30

SQL> BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'TEST',
                                tabname          => 'TEST',
                                estimate_percent => 100,
                                method_opt       => 'for all columns size repeat',
                                no_invalidate    => FALSE,
                                degree           => 8,
                                cascade          => TRUE);
END;
  2    3    4    5    6    7    8    9   10  
 11  /

PL/SQL procedure successfully completed.

SQL> select a.column_name,
       b.num_rows,
       a.num_distinct Cardinality,
       round(a.num_distinct / b.num_rows * 100, 2) selectivity,
       a.histogram,
       a.num_buckets
  from dba_tab_col_statistics a, dba_tables b
 where a.owner = b.owner
   and a.table_name = b.table_name
   and a.owner = 'TEST'
   and a.table_name = 'TEST';  2    3    4    5    6    7    8    9   10   11  

COLUMN_NAME			 NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM	  NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
OWNER				    72530	   30	      .04 FREQUENCY		   30
OBJECT_NAME			    72530	44279	    61.05 NONE			    1
SUBOBJECT_NAME			    72530	  114	      .16 NONE			    1
OBJECT_ID			    72530	72530	      100 NONE			    1
DATA_OBJECT_ID			    72530	 7687	     10.6 NONE			    1
OBJECT_TYPE			    72530	   44	      .06 NONE			    1
CREATED 			    72530	 1093	     1.51 NONE			    1
LAST_DDL_TIME			    72530	 1143	     1.58 NONE			    1
TIMESTAMP			    72530	 1214	     1.67 NONE			    1
STATUS				    72530	    2		0 NONE			    1
TEMPORARY			    72530	    2		0 NONE			    1

COLUMN_NAME			 NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM	  NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
GENERATED			    72530	    2		0 NONE			    1
SECONDARY			    72530	    2		0 NONE			    1
NAMESPACE			    72530	   21	      .03 NONE			    1
EDITION_NAME			    72530	    0		0 NONE			    0



method_opt       => 'for all columns size repeat',重复上次搜集过的统计信息


原文地址:https://www.cnblogs.com/hzcya1995/p/13352436.html