索引全掃描 (index full scan)

wayout99 2014-11-20 05:02:30
您好:

網路上,看到有index full scan ,他說:
查询出的数据都必须從索引中可以直接得到。

Index BE_IX is a concatenated index on big_emp (empno,ename)
SQL> explain plan for select empno,ename from big_emp order by empno,ename;

那這是說建立一個 組合索引 (empno,ename)後,
要查詢的資料欄位,必須只有 empno,ename 嗎? 若多出1個 empXX, 或少一個ename,就不算 索引全掃描了嗎?

那 order by empno,ename 的順序,是否又會有影響。empno,ename 與 ename,empno

謝謝!
...全文
755 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wayout99 2014-11-26
  • 打赏
  • 举报
回复
您好: 謝謝您 我可能 偏想到 索引的 條件篩選 而沒有去注意 CBO 還會去使用的COST 判斷來決定執行計畫. 所以 索引歸索引,SERVER 還是會根據 執行計畫的COST 來決定是否引用 FULL INDXE SCAN 或 FULL TABLE SCAN 等?
wayout99 2014-11-26
  • 打赏
  • 举报
回复
謝謝您的指導!
小灰狼W 2014-11-26
  • 打赏
  • 举报
回复
对的,CBO基于成本来决定 其他的讨论只是推断什么样的方式的COST会高一些,猜测CBO会怎么选择
小灰狼W 2014-11-25
  • 打赏
  • 举报
回复
索引的存在,是为了提高执行效率。 其中一个主要的用法,即是大家知道的,作为目录一般,系统通过索引快速定位到需要的记录上,例如,index range scan 在某些条件下,例如你的例子中,索引起不到上面的效果,但是,由于查询需要的所有字段都处于索引之中,因此,index full scan可以读取比table access full更少的块,消耗更少的IO CBO根据COST的大小来决定执行计划,感觉你这里有点钻得太死了...
wayout99 2014-11-25
  • 打赏
  • 举报
回复
您好: 謝謝您。 不過 要先釐清一個問題 INDEX(A,B) 一般索引,是否 主要為 WHERE A = and B= 為主要查詢 索引後的資料? 若有找到, 他查詢欄位:select A,B 只是順便用到 這2個欄位 最後,ORDER BY A,B 只是依順序 撈出資料? 所以 "查询中只包含empno的意思是说,整条SQL语句只用到了这个字段,不只是条件列中。" 相對的 是否 若 where A=? ,雖然他 會比index(A) 還慢(且若沒有此INDEX(A)存在時),但畢竟 可用INDEX(A,B), 但 select A,B 或 select A 或 select B 情況下, where A=? 仍可用到 INDEX(A,B),只是效率不如INDEX(A) 嗎?
小灰狼W 2014-11-25
  • 打赏
  • 举报
回复
1. 可以这么说吧 2. 数据库是根据cost来确定执行计划的 当你的SQL中出现了CLOUMN_XX,此时若走index full scan,就要根据索引中的每一个rowid到表中去找对应记录的column_xx的值,cost明显增加 我没说清楚,查询中只包含empno的意思是说,整条SQL语句只用到了这个字段,不只是条件列中。此时走empno列上的索引也可以达到一样的效果,而empno的单列索引占用的块数比empno,empname的组合索引要少,效率更高 如果查询中只用到ename字段,此时按ename排序,顺序和empno,ename组合索引中的顺序就不一致了,若走该组合索引,就需要重新排序,cost相应增加
wayout99 2014-11-25
  • 打赏
  • 举报
回复
您好:謝謝您 想跟您確認下: 1.您說: 系统只需要从索引中将数据读取出来,而且索引中储存的顺序和order by后面一致,因此索引还避免了排序 -->是指:因為「組合索引」的順序為(empno,ename) ;而 自己下SQL的語法有ORDER BY empno,ename 因為2者的順序都相同,所以 結果可以不用再排序 嗎? 2. 2-A.如果查询中出现了第三个字段,不管是在「查询列」裡,還是「条件列」裡,還是「排序列」裡,都不能走index full scan,因为索引中不包含需要的所有字段。 2-B.如果查询中少了ename字段,则还可以使用,但是效率不如走empno的单列索引的index full scan。 2-C.如果少的是empno字段,则可能会走该索引,但要重新排序。 -->是指:「組合索引」(empno,ename) 2-A.當我SQL 語法中「查询列」or「条件列」or「排序列」裡 , 多出1個欄位 CLOUMN_XX時,都不會用到「組合索引」(empno,ename)的 index full scan? 2-B.若是條件列中,只用empno 欄位,還是會用「組合索引」(empno,ename)的 index full scan,只是效率 不如单列索引(empno)的index full scan。 2-C.若是條件列中,只用ename 欄位,還是會用「組合索引」(empno,ename)的 index full scan,只是要重新排序? 謝謝!
小灰狼W 2014-11-25
  • 打赏
  • 举报
回复
索引全扫描和全表扫描类似,即对索引进行全段扫描 Retrieval of all rowids from an index when there is no start or stop key. Indexed values are scanned in ascending order. 比起全表扫描,索引全扫描有两个好处:1:扫描的块更少,因为索引只储存部分字段的数据;2: 索引是顺序存储的,在某些条件下,可以避免额外的排序操作 在你的例子里,该组合索引上述两个好处都能用到。系统只需要从索引中将数据读取出来,而且索引中储存的顺序和order by后面一致,因此索引还避免了排序 如果查询中出现了第三个字段,不管是在查询列里还是条件列还是排序列里,都不能走index full scan,因为索引中不包含需要的所有字段。如果查询中少了ename字段,则还可以使用,但是效率不如走empno的单列索引的index full scan。如果少的是empno字段,则可能会走该索引,但要重新排序
wayout99 2014-11-24
  • 打赏
  • 举报
回复
您好: 我使用,2個語法一起執行

SET AUTOTRACE ON;
select  count(*) from scott.emp;
SQL DEVELOPER -->OK 可RUN出 PL/SQL DEVELOPER-->ORA00922:離漏選項獲此選項無效 TOAD----------------------->ORA00922:離漏選項獲此選項無效 這該如何處理? 謝謝!
wayout99 2014-11-23
  • 打赏
  • 举报
回复
pl/sql 介面蠻多的,沒頭緒中.. 之前要用 http://bbs.csdn.net/topics/390934343 就不知如何處理了... 他也拿來當開發 REPORT 或 FORM 嗎?
江南小鱼 2014-11-23
  • 打赏
  • 举报
回复
pl/sql不错,绿色免安装,使用起来比蛤蟆方便
wayout99 2014-11-22
  • 打赏
  • 举报
回复
您好: 謝謝 ,那有入門教學嗎? TOAD 後續也可用來開發 REPORT 或 FORM 嗎?
布丁88 2014-11-22
  • 打赏
  • 举报
回复
TOAD下載地址: key: 0-63920-08593-29060-02749 site message: flyfish576 Site Message: ZYanMooB Authorizaton Key: 0-63920-03313-29060-07749 http://us-downloads.quest.com/Repository/support.quest.com/Toad for Oracle/12.0/Software/Toad for Oracle 12 64bit.msi http://us-downloads.quest.com/Repository/support.quest.com/Toad for Oracle/12.0/Software/Toad Development Suite for Oracle 12 64-bit Commercial.exe http://us-downloads.quest.com/Repository/support.quest.com/Toad for Oracle/12.0/Software/Toad DBA Suite for Oracle 12 64-bit Commercial.exe
布丁88 2014-11-22
  • 打赏
  • 举报
回复
用TOAD 吧!很好用的工具。
wayout99 2014-11-21
  • 打赏
  • 举报
回复
您好: 謝謝, 所以 組合索引(empno,ename)中 除了 where 中 empno 或 empno,ename 會有影響外 ORDER BY 也會有影響? 那 不用ORDER BY ,應該不會有影響吧(因為他是 以 empno,enam 的順序將結果列出?
卖水果的net 2014-11-21
  • 打赏
  • 举报
回复
你的索引建立在(empno,ename) 這兩列上。 如果你 order by empno,ename 是可以用到這個索引的。 order by ename,empno 這個不能用到 order by empno , ename , exmpxxx 可以用到 order by empno 可以用到。
华而不实 2014-11-21
  • 打赏
  • 举报
回复
索引记录索引列值和数据行地址。索引扫名,通过索引列值,找到数据行地址,定位数据行取出数据

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧