選擇率和基數簡析

2021-07-27 07:02:28 字數 2666 閱讀 8156

--選擇率和基數簡析

選擇率(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 動態路由是網路中的路由器之間相互通訊,傳遞路由資訊,利用收到的路由資訊更新路由器表的過程。...