INDEX'S COST VS TABLE ACCESS FULL'S COST |
答題得分者是:VICSYS
|
alvin26
初階會員 發表:24 回覆:41 積分:28 註冊:2005-04-12 發送簡訊給我 |
以下是一個TABLE在 ORACLE 的結購:
SQL_EMP 的結構:
然後查看下列兩個SQL的執行計劃: 第一個: select /* INDEX(SQL_EMP, PK_SQL_EMP) */ empno, empname, deptno from SQL_emp order by empno, empname, deptno 以下是第一個的執行計劃結果:
想請教一下各位大大: 這個TABLE裡有1萬筆資料, 有兩個 index : PK_SQL_EMP IDX_SQL_EMP_DEPTNO 我有兩個問題: 1:為什麼有用 INDEX IDX_SQL_EMP_DEPTNO 了,怎麼還是 TABLE ACCESS FULL呢?? 2:兩個 INDEX 的 Explain Plan 不同,一個有用到 INDEX( PK_SQL_EMP) , 另一個雖然已經指定 INDEX(IDX_SQL_EMP_DEPTNO)了, 但是還是用 TABLE ACCESS FULL,更奇怪的是,TABLE ACCESS FULL 竟然比用 INDEX( PK_SQL_EMP)的 COST 小?? 為什麼 TABLE ACCESS FULL 的 COST 反而比較小呢??
------
弟子規,聖人訓,首孝悌,次謹信,泛愛眾,而親仁,有餘力,則學文。 編輯記錄
alvin26 重新編輯於 2007-09-12 09:47:55, 註解 無‧
alvin26 重新編輯於 2007-09-12 10:27:31, 註解 無‧ alvin26 重新編輯於 2007-09-12 10:29:10, 註解 無‧ alvin26 重新編輯於 2007-09-12 10:31:19, 註解 無‧ alvin26 重新編輯於 2007-09-12 10:33:17, 註解 無‧ alvin26 重新編輯於 2007-09-12 10:33:42, 註解 無‧ alvin26 重新編輯於 2007-09-12 10:35:04, 註解 無‧ alvin26 重新編輯於 2007-09-12 10:37:08, 註解 無‧ alvin26 重新編輯於 2007-09-13 17:49:51, 註解 無‧ alvin26 重新編輯於 2007-09-13 17:50:24, 註解 無‧ alvin26 重新編輯於 2007-09-13 17:51:11, 註解 無‧ | |||||||||||||||||||||||||||||||||||||||||
VICSYS
初階會員 發表:21 回覆:64 積分:32 註冊:2002-10-10 發送簡訊給我 |
不知道為什麼, 版面很亂, 看不出來, 到底你想要用那一個 Index
不過 EMPNO 不就是 PRIMARY KEY 嗎? 還有讀取的 SQL 都是讀取全部! Index 只是作為排序的機制, 不是過濾資料 (100 萬筆資料找出一些資料) 本來就是 TABLE ACCESS FULL(不是過濾資料), 跑 TABLE ACCESS FULL 很正常! 這兩個例子, 應該不需要指定 Index 及 Order by select empno, empname, deptno from SQL_emp where empno >' ' ORACLE 自動會用 PK 來排序, 不需要去指定 Index! |
|||||||||||||||||||||||||||||||||||||||||
alvin26
初階會員 發表:24 回覆:41 積分:28 註冊:2005-04-12 發送簡訊給我 |
||||||||||||||||||||||||||||||||||||||||||
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
||||||||||||||||||||||||||||||||||||||||||
alvin26
初階會員 發表:24 回覆:41 積分:28 註冊:2005-04-12 發送簡訊給我 |
是沒錯,但因為我是自行指定要用哪一個 INDEX 做 QUERY,
(像第一個QUERY),我沒有下 WHERE ORACLE 還是會按照我指定的 INDEX 去做 EXPLAIN PLAN. 只是第二個雖然指定了INDEX,但還是 TABLE ACCESS FULL. 這就是我的疑問.. ===================引 用 Fishman 文 章=================== 沒指定 WHERE Condition 當然是 FULL SCAN 囉! 索引確實可以增加查詢的速度,但是必須搭配 WHERE 的語句才可發揮效用!
------
弟子規,聖人訓,首孝悌,次謹信,泛愛眾,而親仁,有餘力,則學文。 |
|||||||||||||||||||||||||||||||||||||||||
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
想像一下你今天在一座圖書館的入口,你的BOSS跟你說:
1.去把圖書館的書全部搬出來(select * from yourtable) 1.1 無Index-->進入圖書館,推著推車,把一本一本的書放進推車然後全部搬出來(FULL SCAN & Return All Data) 1.2 指定Index-->進入圖書館,按照指定索引表找出書存放位置,把一本一本的書放進推車然後全部搬出來(一樣是Full Scan) PS:一般 select * from yourtable 是不會用到 Index 的,除非指定 2.去把所有書名叫做 "xxx" 的書搬出來(select * from yourtable where BookName = 'xxx') 2.1 無Index-->進入圖書館,推著推車,把一本一本的書拿出來看,若是書名是'xxx'就放進推車不是就放回去,將全部書看過一遍後把他車推出來(FULL SCAN & Return Some Data or No Data) 2.2 有Index-->進入圖書館,查詢索引表(索引表有排序功能,找出符合的第一筆資料,往下直到不符合的資料即可停止),若是索引中沒有該書,也無須進入存放書的區域找書,找出所有書名是'xxx'放的存放位置,再到指定位址取出書放入推車中,完成後推出去 哪一個最快?哪一個最慢?
------
Fishman |
|||||||||||||||||||||||||||||||||||||||||
alvin26
初階會員 發表:24 回覆:41 積分:28 註冊:2005-04-12 發送簡訊給我 |
這一點(1.2)我就是不解,
既然是指定了 INDEX , 為何是在 TABLE 中做 FULL SCAN, 而不是在 INDEX 做 FULL SCAN 呢? 因為EXPLAIN PLAN 是寫 TABLE ACCESS FULL 而不是 INDEX FULL SCAN 耶...(不解中) 跟資料的變化有關係嗎? 因為 DEPTNO 的值只有由1到10而已,我只是懷疑... ===================引 用 Fishman 文 章=================== 1.2 指定Index-->進入圖書館,按照指定索引表找出書存放位置,把一本一本的書放進推車然後全部搬出來(一樣是Full Scan) PS:一般 select * from yourtable 是不會用到 Index 的,除非指定
------
弟子規,聖人訓,首孝悌,次謹信,泛愛眾,而親仁,有餘力,則學文。 |
|||||||||||||||||||||||||||||||||||||||||
VICSYS
初階會員 發表:21 回覆:64 積分:32 註冊:2002-10-10 發送簡訊給我 |
select /*+ INDEX(SQL_EMP, IDX_SQL_EMP_DEPTNO) */ empno, empname, deptno from SQL_emp order by empno, empname, deptno
不合理的指定, Oracle 忽略了"指定 Index"! 下列才會有用 select /* INDEX(SQL_EMP, IDX_SQL_EMP_DEPTNO) */ empno, empname, deptno from SQL_emp order by deptno
編輯記錄
VICSYS 重新編輯於 2007-09-13 08:12:03, 註解 無‧
|
|||||||||||||||||||||||||||||||||||||||||
alvin26
初階會員 發表:24 回覆:41 積分:28 註冊:2005-04-12 發送簡訊給我 |
我把 select /*+ INDEX(SQL_EMP, IDX_SQL_EMP_DEPTNO) */ empno, empname, deptno from SQL_emp order by deptno
上機測了一下:
系統時間:2024-11-24 16:04:44
聯絡我們 | Delphi K.Top討論版
|