亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

探討基于不綁定變量與綁定變量的柱狀圖作用

2024-07-21 02:41:58
字體:
來源:轉載
供稿:網友

本文從不綁定變量與綁定變量兩種情況討論柱狀圖的作用。

一、不綁定變量的情況:

大家可以考慮下面的數據:


SQL> select owner,count(1) from th group by owner;

OWNER COUNT(1)
------------------------------ ----------
SUK 1
SYS 36216
SYSTEM 1
 

其中,在表的OWENR上建立有一個索引。

做完普通分析后,再來執行查詢。


SQL> analyze table th compute statistics;

Table analyzed

SQL> select * from th where owner='SYS';

已選擇36216行。

 

Execution Plan
-------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=50 Card=12073 Bytes=
881329)
1 0 TABLE access (FULL) OF 'TH' (Cost=50 Card=12073 Bytes=8813
29)


Statistics
-------------------------------------------
0 recursive calls
0 db block gets
2894 consistent gets
0 physical reads
0 redo size
2045535 bytes sent via SQL*Net to client
27057 bytes received via SQL*Net from client
2416 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
36216 rows PRocessed


SQL> select * from th where owner='SUK';


Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=50 Card=12073 Bytes=
881329)

1 0 TABLE ACCESS (FULL) OF 'TH' (Cost=50 Card=12073 Bytes=8813
29)


Statistics
--------------------------------------
0 recursive calls
0 db block gets
513 consistent gets
0 physical reads
0 redo size
1133 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
 


只需返回一條數據,但做了全表掃描,這是不合理的執行計劃。因為,它只是知道owner列有三個不同的值,但Oracle不知道每個不同的owner分別有多少記錄,Oracle默認為這些數據的分布是完全均勻的,所以,當用owner作條件時,Oracle會認為會返回總記錄的三分之一(從執行計劃中的Card=12073可以看出來)


對表TH生成柱狀圖后在做同樣的查詢:


SQL> analyze table th compute statistics for

table for all indexes for all indexed columns;

Table analyzed

SQL> select * from th where owner='SYS';

已選擇36216行。


Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=50 Card=36216 Bytes=
2643768)

1 0 TABLE ACCESS (FULL) OF 'TH' (Cost=50 Card=36216 Bytes=2643
768)


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2894 consistent gets
0 physical reads
0 redo size
2045535 bytes sent via SQL*Net to client
27057 bytes received via SQL*Net from client
2416 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
36216 rows processed

SQL> select * from th where owner='SUK';


Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=73)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TH' (Cost=2 Card=1 Bytes
=73)

2 1 INDEX (RANGE SCAN) OF 'IDX_TH' (NON-UNIQUE) (Cost=1 Card
=1)


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
1133 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

可見,生成了柱狀圖后,Oracle會根據數據的實際分布情況

選擇合適的執行計劃,提高性能。


-------------------------------------
 
 

 

 

二、綁定變量的情況下


下面看看在綁定變量的情況下,執行同樣的操作,會發生什么事情


SQL> analyze table th compute statistics;

表已分析。

SQL> var o varchar2(20)SQL> exec :o:='SYS'

PL/SQL 過程已成功完成。

SQL> select * from th where owner=:o;

已選擇32192行。


Execution Plan
-----------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=75 Card=10731 Bytes=
783363)

1 0 TABLE ACCESS (FULL) OF 'TH' (Cost=75 Card=10731 Bytes=7833
63)


Statistics
-----------------------------------------
0 recursive calls
0 db block gets
2886 consistent gets
0 physical reads
0 redo size
1818406 bytes sent via SQL*Net to client
24109 bytes received via SQL*Net from client
2148 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
32192 rows processed

SQL> exec :o:='SUK'

PL/SQL 過程已成功完成。

SQL> select * from th where owner=:o;


Execution Plan
------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=75 Card=10731 Bytes=
783363)

1 0 TABLE ACCESS (FULL) OF 'TH' (Cost=75 Card=10731 Bytes=7833
63)


Statistics
------------------------------------
0 recursive calls
0 db block gets
770 consistent gets
0 physical reads
0 redo size
1151 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
 

 

 

從以上測試可以看到,在綁定變量的情況下,如果沒有分析柱狀圖,兩個查詢都使用了相同的執行計劃--全表掃描。這也很容易理解,在第一次解析SQL的時候,會根據:o的綁定的值去窺視表數據,因為oracle不知道連接列的數據的具體分布,所以它會以為會返回三分之一的數據,所以選擇了全表掃描。在以后的執行同樣的SQL時會重用該SQL,都會使用第一次解析生成的執行計劃了。在本例中,由于沒有做柱狀圖,索引第一次執行select * from th where owner=:o時,無論:0是'SYS'還是'SUK',都會使用全表掃描。那么,我們是否可以得出這樣的一個結論:如果對表做了柱狀圖,那么如果第一次硬解析SQL時:o的值是'SUK'時,這個sql將會使用索引掃描;如果第一次硬解析時:o的值是'SYS'時,SQL將會使用全表掃描呢?看如下的測試例子:


SQL> alter system flush shared_pool;

系統已更改。

SQL> analyze table th delete statistics;

表已分析。

SQL> analyze table th compute statistics for table
for all indexes for all indexed columns;

表已分析。

SQL> exec :o:='SYS'

PL/SQL 過程已成功完成。

SQL> select * from th where owner=:o;

已選擇32192行。


Execution Plan
---------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=75 Card=10731 Bytes=
890673)

1 0 TABLE ACCESS (FULL) OF 'TH' (Cost=75 Card=10731 Bytes=8906
73)


Statistics
--------------------------------------
271 recursive calls
0 db block gets
2900 consistent gets
0 physical reads
0 redo size
1818406 bytes sent via SQL*Net to client
24109 bytes received via SQL*Net from client
2148 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
32192 rows processed

SQL> alter system flush shared_pool;

系統已更改。

SQL> exec :o:='SUK'

PL/SQL 過程已成功完成。

SQL> select * from th where owner=:o;


Execution Plan
----------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=75 Card=10731 Bytes=
890673)

1 0 TABLE ACCESS (FULL) OF 'TH' (Cost=75 Card=10731 Bytes=8906
73)


Statistics
----------------------------------------
529 recursive calls
0 db block gets
51 consistent gets
0 physical reads
0 redo size
1151 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
7 sorts (memory)
0 sorts (disk)
1 rows processed
 

從這個結果可以看到,分析了柱狀圖后,無論:o的值是'SYS'還是'SUK',第一次執行該sql時,使用的都是全表掃描,這與剛才我們的推論不一致了,如果真是這樣的話,使用綁定變量對表做柱狀圖還有什么意義呢?其實這應該算是ORACLE的一個BUG,在這里AUTOTRACE的結果是不對的,我們可以用10046看


第一次執行
select *
from
th where owner=:o

當:o:='SYS'時


call count cpu elapsed disk query current rows
------- ------ -------- ---------- ----------
Parse 1 0.00 0.01 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2148 0.09 0.17 0 2886 0 32192
------- ------ -------- ---------- ----------
total 2150 0.09 0.18 0 2886 0 32192

Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 23

Rows Row Source Operation
------- -----------------------------------
32192 TABLE ACCESS FULL TH


第一次執行
select *
from
th where owner=:o

當:o:='SUK'時


call count cpu elapsed disk query current rows
------- ------ -------- ---------- ----------
Parse 1 0.01 0.01 0 31 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 0 4 0 1
------- ------ -------- ---------- ----------
total 4 0.01 0.01 0 35 0 1

Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 23

Rows Row Source Operation
------- ---------------------------------------
1 TABLE ACCESS BY INDEX ROWID TH
1 INDEX RANGE SCAN IDX_TH (object id 7248)
 

從Oracle 9i開始,Oracle在對sql第一次硬解析時,會對綁定的變量值進行窺視,從而根據變量值和數據的分布決定sql的執行計劃。從以上的例子可以證明這點。


結論:

1、無論是否綁定變量,對數據分布不均的情況下柱狀圖都是很有效的

2、對數據分布不均勻的情況下,使用綁定變量可能會造成惡果,就算對表做了柱狀圖也一樣

3、使用綁定變量,sql第一次執行決定了以后同樣的sql執行的執行計劃

4、AUTOTRACE的信息不一定準確,必要時要用10046查看需要的信息


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品电影在线观看| 欧美在线一级视频| 91精品中文在线| 欧美一级黑人aaaaaaa做受| 国产亚洲欧美日韩美女| 伦伦影院午夜日韩欧美限制| 一本色道久久综合亚洲精品小说| 日韩在线观看av| 91精品久久久久久久久久久久久久| 国产精品一区二区三区毛片淫片| 亚洲精品久久久久久久久久久久久| 欧美电影电视剧在线观看| 欧美性高潮床叫视频| 日韩中文字幕在线观看| 欧美午夜精品久久久久久浪潮| 精品久久久久人成| 国产成人精品免高潮费视频| 久久亚洲国产精品成人av秋霞| 亚洲人成电影网站| 国产精品丝袜久久久久久不卡| 欧美精品激情视频| 97涩涩爰在线观看亚洲| 日韩欧美一区二区三区| 欧美另类老肥妇| 亚洲色图五月天| 青草青草久热精品视频在线网站| 亚洲精品视频二区| 久久久久免费视频| 日韩a**中文字幕| 亚洲精品97久久| 中文字幕日韩欧美| 成人乱人伦精品视频在线观看| 日韩欧美一区二区在线| 久久精品中文字幕一区| 伊人久久久久久久久久| 国产精品欧美激情在线播放| 欧美另类极品videosbest最新版本| 日本精品久久中文字幕佐佐木| 日韩欧美大尺度| 亚洲综合精品伊人久久| 亚洲激情电影中文字幕| 97超级碰碰碰久久久| 91九色国产社区在线观看| 国产精品扒开腿做爽爽爽的视频| 狠狠躁夜夜躁人人爽超碰91| 日韩av电影中文字幕| 国产精品丝袜久久久久久不卡| 欧美壮男野外gaytube| 亚洲国语精品自产拍在线观看| 日韩三级成人av网| 欧美激情免费在线| 97在线观看免费高清| 国产亚洲美女久久| 国产一区深夜福利| 欧美高跟鞋交xxxxxhd| 亚洲理论电影网| 色诱女教师一区二区三区| 成人网在线免费观看| 欧美一级大片视频| 亚洲一区二区久久久久久久| 亚洲一区二区三区成人在线视频精品| 欧美日韩性视频在线| 亚洲欧洲成视频免费观看| 日韩av网站在线| 91国产精品视频在线| 成人a视频在线观看| 最近更新的2019中文字幕| 久久久久国产一区二区三区| 欧美成人免费一级人片100| 国产欧美日韩最新| 日韩欧美精品免费在线| 国产视频一区在线| 2019av中文字幕| 亚洲一区中文字幕在线观看| 97在线视频国产| 国产午夜精品全部视频播放| 国产一级揄自揄精品视频| 欧美性jizz18性欧美| 国产一区二区成人| 欧美日韩亚洲视频| 国产精品日韩在线播放| 久久久久久久久网站| 国产欧美精品日韩精品| 在线看国产精品| 亚洲激情 国产| 91高清免费在线观看| 亚洲国产精品va在看黑人| 日韩av三级在线观看| 亚洲无av在线中文字幕| 国产一区私人高清影院| 国产日韩欧美另类| 精品女厕一区二区三区| 26uuu日韩精品一区二区| 亚洲色图色老头| 日韩日本欧美亚洲| 国产丝袜精品第一页| 日韩电影免费观看中文字幕| 国产精品九九九| 国产成人黄色av| 伊人激情综合网| 亚洲一区中文字幕| 97av在线播放| 欧美在线观看www| 亚洲毛片在线免费观看| 国产精品成人一区| 成人免费看吃奶视频网站| 97成人在线视频| 91精品国产自产91精品| 亚洲综合中文字幕在线观看| 欧美美女18p| 92国产精品久久久久首页| 第一福利永久视频精品| 97欧美精品一区二区三区| 一区二区三区亚洲| 日韩免费在线播放| 亚洲欧美福利视频| 成人黄色av播放免费| 日韩在线观看视频免费| 欧美成人精品激情在线观看| 欧美精品18videos性欧| 欧美大片在线看免费观看| 欧美精品电影在线| 国产免费成人av| 色婷婷久久av| 国产午夜精品一区二区三区| 欧美裸体男粗大视频在线观看| 亚洲久久久久久久久久| 国产69精品久久久| 狠狠色狠狠色综合日日五| 亚洲精品小视频| 热re99久久精品国产66热| 91啪国产在线| 亚洲欧美成人精品| 国内外成人免费激情在线视频网站| 欧美尺度大的性做爰视频| 国产经典一区二区| 91久久久久久国产精品| 国产精品美腿一区在线看| 久久人人爽亚洲精品天堂| 菠萝蜜影院一区二区免费| 亚洲欧美日韩中文在线| 亚洲影院色无极综合| 亚洲视频在线观看视频| 伊人亚洲福利一区二区三区| 国产精品亚洲欧美导航| 日韩欧美在线观看| 久久亚洲精品视频| 久久精品视频免费播放| 一本一道久久a久久精品逆3p| 久久精品一区中文字幕| 欧美黑人国产人伦爽爽爽| 久久精品99久久久久久久久| 久久综合伊人77777尤物| 高清日韩电视剧大全免费播放在线观看| 欧美日韩国产成人在线| 欧美性xxxxx极品| 日本久久久久久| 欧美大学生性色视频| 欧美寡妇偷汉性猛交| 国产视频久久久| 精品久久香蕉国产线看观看亚洲| 国产成人av网| 精品久久久久国产| 欧美与黑人午夜性猛交久久久|