你的索引建立在(empno,ename) 這兩列上。如果你  order by empno,ename 是可以用到這個索引的。
order by  ename,empno  這個不能用到order by empno , ename , exmpxxx 可以用到
order by empno 可以用到。

解决方案 »

  1.   

    您好:
    謝謝,
    所以 組合索引(empno,ename)中
    除了 where 中 empno 或  empno,ename  會有影響外ORDER BY 也會有影響?
    那 不用ORDER BY ,應該不會有影響吧(因為他是 以 empno,enam 的順序將結果列出?
      

  2.   

    用TOAD 吧!很好用的工具。
      

  3.   

    TOAD下載地址:
    key: 0-63920-08593-29060-02749
    site message: flyfish576Site Message: ZYanMooB
    Authorizaton Key: 0-63920-03313-29060-07749http://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
      

  4.   

    您好:
    謝謝 ,那有入門教學嗎?
    TOAD 後續也可用來開發  REPORT 或 FORM 嗎?
      

  5.   

    pl/sql不错,绿色免安装,使用起来比蛤蟆方便
      

  6.   

    pl/sql 介面蠻多的,沒頭緒中..
    之前要用 
    http://bbs.csdn.net/topics/390934343
    就不知如何處理了...他也拿來當開發  REPORT 或 FORM 嗎?
      

  7.   

    您好:
    我使用,2個語法一起執行SET AUTOTRACE ON;
    select  count(*) from scott.emp;
    SQL DEVELOPER -->OK 可RUN出
    PL/SQL DEVELOPER-->ORA00922:離漏選項獲此選項無效
    TOAD----------------------->ORA00922:離漏選項獲此選項無效這該如何處理?
    謝謝!
      

  8.   

    索引全扫描和全表扫描类似,即对索引进行全段扫描
    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字段,则可能会走该索引,但要重新排序
      

  9.   

    您好:謝謝您
    想跟您確認下:
    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,只是要重新排序?
    謝謝!
      

  10.   

    1. 可以这么说吧
    2. 数据库是根据cost来确定执行计划的
    当你的SQL中出现了CLOUMN_XX,此时若走index full scan,就要根据索引中的每一个rowid到表中去找对应记录的column_xx的值,cost明显增加
    我没说清楚,查询中只包含empno的意思是说,整条SQL语句只用到了这个字段,不只是条件列中。此时走empno列上的索引也可以达到一样的效果,而empno的单列索引占用的块数比empno,empname的组合索引要少,效率更高
    如果查询中只用到ename字段,此时按ename排序,顺序和empno,ename组合索引中的顺序就不一致了,若走该组合索引,就需要重新排序,cost相应增加
      

  11.   

    您好:
    謝謝您。
    不過 要先釐清一個問題
    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)  嗎?
      

  12.   

    索引的存在,是为了提高执行效率。
    其中一个主要的用法,即是大家知道的,作为目录一般,系统通过索引快速定位到需要的记录上,例如,index range scan
    在某些条件下,例如你的例子中,索引起不到上面的效果,但是,由于查询需要的所有字段都处于索引之中,因此,index full scan可以读取比table access full更少的块,消耗更少的IO
    CBO根据COST的大小来决定执行计划,感觉你这里有点钻得太死了...
      

  13.   

    您好:
    謝謝您
    我可能 偏想到 索引的 條件篩選
    而沒有去注意 CBO 還會去使用的COST 判斷來決定執行計畫.所以 索引歸索引,SERVER 還是會根據 執行計畫的COST 來決定是否引用 FULL INDXE SCAN 或 FULL TABLE SCAN 等?
      

  14.   

    对的,CBO基于成本来决定
    其他的讨论只是推断什么样的方式的COST会高一些,猜测CBO会怎么选择