--選擇率和基數簡析
選擇率(selectivity)是乙個介於0和1之間的值,用來表示某個操作所返回的記錄數的比例。
乙個操作返回記錄的行數稱作基數(cardinality)。
**基數 = 選擇率 * 行數
--建立模擬實驗環境
scott@prod1> set echo on
scott@prod1> start /tmp/1.sql
scott@prod1> set termout on
scott@prod1> set feedback on
scott@prod1> set verify off
scott@prod1> set scan on
scott@prod1>
scott@prod1> column pad format a20 truncate
scott@prod1>
scott@prod1> drop table t;
table dropped.
scott@prod1>
scott@prod1> execute dbms_random.seed(0)
pl/sql procedure successfully completed.
scott@prod1>
scott@prod1> create table t
2 as
3 select rownum as id,
4 round(5678+dbms_random.normal*1234) as n1,
5 mod(255+trunc(dbms_random.normal*1000),255) as n2,
6 dbms_random.string('p',255) as pad
7 from dual
8 connect by level <= 10000
9 order by dbms_random.value;
table created.
scott@prod1>
scott@prod1> alter table t add constraint t_pk primary key (id);
table altered.
scott@prod1> create index t_n2_i on t (n2);
index created.
scott@prod1>
scott@prod1> begin
2 dbms_stats.gather_table_stats(
3 ownname => user,
4 tabname => 't',
5 estimate_percent => 100,
6 method_opt => 'for all columns size skewonly',
7 cascade => true
8 );
9 end;
10 /
pl/sql procedure successfully completed.
--select * from t
10000 rows selected.
scott@prod1> l
1* select * from t
--此處沒有where條件,返回所有記錄,基數等於表中的行數,所以選擇率為1,也可稱為弱選擇性。
--select * from t where n1 between 2000 and 2400;
26 rows selected.
scott@prod1> l
1* select * from t where n1 between 2000 and 2400
--這個查詢中基數為26,所以選擇率為26/10000=0.0026,當選擇率接近0時,也可稱為具有強選擇性。
--select * from t where n1 = 14;
scott@prod1> select * from t where n1 = 14;
no rows selected
--這個查詢無返回行,所以基數為0,選擇率為0。
由於以上三個查詢都不包含連線或聚合操作,所以這種演算法可行,下面舉例。
--select sum(n2) from t where n1 between 3100 and 4300;
scott@prod1> select sum(n2) from t where n1 between 3100 and 4300;
sum(n2)
----------
31554
1 row selected.
--此時不能簡單的計算基數為1,選擇率為萬分之一,而是要先找出輸入到聚合函式sum前的輸入源。
scott@prod1> select count(*) from t where n1 between 3100 and 4300;
count(*)
----------
1116
1 row selected.
--輸入源為1116,所以『select sum(n2) from t where n1 between 3100 and 4300;』基數為1116,選擇率為0.1116。
譯 索引列,列選擇率和等式謂詞
本篇文章也可以叫做 建立索引時那一列應該放到最前面 通常對於索引列的選擇的通常準則都是把最高選擇率 譯者注 所謂選擇率指的是在where子句中作為選擇條件使用次數的比例來說的 的列放在最前面,我接下來並不是要說這個準則不對,因為這個準則本身是正確的。但通常在給出這個準則的同時並沒有同時給出為什麼要把...
譯 索引列,列選擇率和等式謂詞
本篇文章也可以叫做 建立索引時那一列應該放到最前面 通常對於索引列的選擇的通常準則都是把最高選擇率 譯者注 所謂選擇率指的是在where子句中作為選擇條件使用次數的比例來說的 的列放在最前面,我接下來並不是要說這個準則不對,因為這個準則本身是正確的。但通常在給出這個準則的同時並沒有同時給出為什麼要把...
路由選擇方式簡析
路由選擇方式簡析 典型的路由選擇方式有兩種 靜態路由和動態路由。靜態路由是在路由器中設定的固定的路由表。除非網路管理員干預,否則靜態路由不會發生變化。靜態路由不能對網路的改變作出反映.www.2cto.com 動態路由是網路中的路由器之間相互通訊,傳遞路由資訊,利用收到的路由資訊更新路由器表的過程。...