选择性(SELECTIVITY)这个是个老话题了,作优化的DBA确定听过。数据库
在说这个选择率以前须要澄清几个概念:测试
某个列惟一键(Distinct_Keys)的数量叫做基数。主键列的基数等于表的总行数。基数的高低影响列的数据分布。优化
以测试表test为例,owner列和object_id列的基数分别以下所示。spa
select count(distinct owner),count(distinct object_id),count(*) from test; COUNT(DISTINCT OWNER) COUNT(DISTINCT OBJECT_ID) COUNT(*) -------------------- ------------------------ ---------- 29 72462 72462
咱们能够看到 object_id 列基数比较高,因此它的数据分布比较均匀,code
基数与总行数的比值再乘以100%就是某个列的选择性。索引
如今来构造数据测试一下:it
create table test as select * from dba_objects; --收集 SYS.TEST统计信息,否则 ‘dba_tab_col_statistics’会没有SYS.TABLE的统计信息。 BEGIN DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SYS', tabname => 'TEST', estimate_percent => 100, method_opt => 'for all columns size 1', no_invalidate => FALSE, degree => 1, cascade => TRUE); END; / --刷新数据库信息,避免干扰。也能够不作 begin dbms_stats.flush_database_monitoring_info; end; / --查看SYS.TEST 各个列的选择率 select a.table_name,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 = 'SYS' and a.table_name = 'TEST';
查看 ‘selectivity’列 >20%的适合建立索引。table