为什么Oracle数据库不用索引来查找数据 oracle数据库中如何查看已经创建的索引信息?

\u4e3a\u4ec0\u4e48\u6709\u65f6 Oracle \u6570\u636e\u5e93\u4e0d\u7528\u7d22\u5f15\u6765\u67e5\u627e\u6570\u636e

\u5f53\u4f60\u8fd0\u7528SQL\u8bed\u8a00\uff0c\u5411\u6570\u636e\u5e93\u53d1\u5e03\u4e00\u6761\u67e5\u8be2\u8bed\u53e5\u65f6\uff0cORACLE\u5c06\u4f34\u968f\u4ea7\u751f\u4e00\u4e2a\u201c\u6267\u884c\u8ba1\u5212\u201d\uff0c\u4e5f\u5c31\u662f\u8be5\u8bed\u53e5\u5c06\u901a\u8fc7\u4f55\u79cd\u6570\u636e\u641c\u7d22\u65b9\u6848\u6267\u884c\uff0c\u662f\u901a\u8fc7\u5168\u8868\u626b\u63cf\u3001\u8fd8\u662f\u901a\u8fc7\u7d22\u5f15\u641c\u5bfb\u7b49\u5176\u5b83\u65b9\u5f0f\u3002\u641c\u7d22\u65b9\u6848\u7684\u9009\u7528\u4e0eORACLE\u7684\u4f18\u5316\u5668\u606f\u606f\u76f8\u5173\u3002
\u53ef\u4ee5\u53c2\u8003\uff1a
http://blog.csdn.net/sunhuiliang85/article/details/24434201

oracle\u5bf9\u4e8e\u6570\u636e\u5e93\u4e2d\u7684\u8868\u4fe1\u606f\uff0c\u5b58\u50a8\u5728\u7cfb\u7edf\u8868\u4e2d\u3002\u67e5\u8be2\u5df2\u521b\u5efa\u597d\u7684\u8868\u7d22\u5f15\uff0c\u53ef\u901a\u8fc7\u76f8\u5e94\u7684sql\u8bed\u53e5\u5230\u76f8\u5e94\u7684\u8868\u4e2d\u8fdb\u884c\u5feb\u6377\u7684\u67e5\u8be2\uff1a
1. \u6839\u636e\u8868\u540d\uff0c\u67e5\u8be2\u4e00\u5f20\u8868\u7684\u7d22\u5f15
select * from user_indexes where table_name=upper('\u8868\u540d');2. \u6839\u636e\u7d22\u5f15\u53f7\uff0c\u67e5\u8be2\u8868\u7d22\u5f15\u5b57\u6bb5
select * from user_ind_columns where index_name=('\u7d22\u5f15\u540d');3.\u6839\u636e\u7d22\u5f15\u540d\uff0c\u67e5\u8be2\u521b\u5efa\u7d22\u5f15\u7684\u8bed\u53e5
select dbms_metadata.get_ddl('INDEX','\u7d22\u5f15\u540d', ['\u7528\u6237\u540d']) from dual ; --['\u7528\u6237\u540d']\u53ef\u7701\uff0c\u9ed8\u8ba4\u4e3a\u767b\u5f55\u7528\u6237PS\uff1adbms_metadata.get_ddl\u8fd8\u53ef\u4ee5\u5f97\u5230\u5efa\u8868\u8bed\u53e5\uff0c\u5982\uff1a
SELECT DBMS_METADATA.GET_DDL('TABLE','\u8868\u540d', ['\u7528\u6237\u540d']) FROM DUAL ; //\u53d6\u5355\u4e2a\u8868\u7684\u5efa\u8868\u8bed\u53e5\uff0c['\u7528\u6237\u540d']\u53ef\u4e0d\u8f93\u5165\uff0c\u9ed8\u8ba4\u4e3a\u767b\u5f55\u7528\u6237SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u; //\u53d6\u7528\u6237\u4e0b\u6240\u6709\u8868\u7684\u5efa\u8868\u8bed\u53e5\u5f53\u7136\uff0c\u4e5f\u53ef\u4ee5\u7528pl/sql developer\u5de5\u5177\u6765\u67e5\u770b\u76f8\u5173\u7684\u8868\u7684\u5404\u79cd\u4fe1\u606f\u3002

当你运用SQL语言,向数据库发布一条查询语句时,ORACLE将伴随产生一个“执行计划”,也就是该语句将通过何种数据搜索方案执行,是通过全表扫描、还是通过索引搜寻等其它方式。搜索方案的选用与ORACLE的优化器息息相关。
SQL语句的执行步骤

一条SQL语句的处理过程要经过以下几个步骤。

1 语法分析 分析语句的语法是否符合规范,衡量语句中各表达式的意义。

2 语义分析 检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。

3 视图转换 将涉及视图的查询语句转换为相应的对基表查询语句。

4 表达式转换 将复杂的SQL表达式转换为较简单的等效连接表达式。

5 选择优化器 不同的优化器一般产生不同的“执行计划”

6 选择连接方式 ORACLE有三种连接方式,对多表连接ORACLE可选择适当的连接方式。

7 选择连接顺序 对多表连接ORACLE选择哪一对表先连接,选择这两表中哪个表做为源数据表。

8 选择数据的搜索路径 根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。

9 运行“执行计划”

ORACLE的优化器

ORACLE有两种优化器:基于规则的优化器(RBO, Rule Based Optimizer),和基于代价的优化器(CBO, Cost Based Optimizer)。

RBO自ORACLE 6版以来被采用,有着一套严格的使用规则,只要你按照它去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说对数据不“敏感”,ORACLE公司已经不再发展这种技术了。
CBO自ORACLE 7版被引入,ORACLE自7版以来采用的许多新技术都是基于CBO的,如星型连接排列查询,哈希连接查询,和并行查询等。CBO计算各种可能“执行计划”的“代价”,即cost,从中选用cost最低的方案,作为实际运行方案。各“执行计划”的cost的计算根据,依赖于数据表中数据的统计分布,ORACLE数据库本身对该统计分布并不清楚,须要分析表和相关的索引,才能搜集到CBO所需的数据。

一般而言,CBO所选择的“执行计划”都不会比RBO的“执行计划”差,而且相对而言,CBO对程序员的要求没有RBO那么苛刻,节省了程序员为了从多个可能的“执行计划”中选择一个最优的方案而花费的调试时间,但在某些场合下也会存在问题。

较典型的问题有:有时,表明明建有索引,但查询过程显然没有用到相关的索引,导致查询过程耗时漫长,占用资源巨大,问题到底出在哪儿呢?按照以下顺序查找,基本上能发现原因所在。

查找原因的步骤

首先,我们要确定数据库运行在何种优化模式下,相应的参数是:optimizer_mode。可在svrmgrl中运行“show parameter optimizer_mode"来查看。ORACLE V7以来缺省的设置应是"choose",即如果对已分析的表查询的话选择CBO,否则选择RBO。如果该参数设为“rule”,则不论表是否分析过,一概选用RBO,除非在语句中用hint强制。

其次,检查被索引的列或组合索引的首列是否出现在PL/SQL语句的WHERE子句中,这是“执行计划”能用到相关索引的必要条件。

第三,看采用了哪种类型的连接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响。

第四,看连接顺序是否允许使用相关索引。假设表emp的deptno列上有索引,表dept的列deptno上无索引,WHERE语句有emp.deptno=dept.deptno条件。在做NL连接时,emp做为外表,先被访问,由于连接机制原因,外表的数据访问方式是全表扫描,emp.deptno上的索引显然是用不上,最多在其上做索引全扫描或索引快速全扫描。

第五,是否用到系统数据字典表或视图。由于系统数据字典表都未被分析过,可能导致极差的“执行计划”。但是不要擅自对数据字典表做分析,否则可能导致死锁,或系统性能下降。
第六,索引列是否函数的参数。如是,索引在查询时用不上。

第七,是否存在潜在的数据类型转换。如将字符型数据与数值型数据比较,ORACLE会自动将字符型用to_number()函数进行转换,从而导致第六种现象的发生。

第八,是否为表和相关的索引搜集足够的统计数据。对数据经常有增、删、改的表最好定期对表和索引进行分析,可用SQL语句“analyze table xxxx compute statistics for all indexes;"。ORACLE掌握了充分反映实际的统计数据,才有可能做出正确的选择。

第九,索引列的选择性不高。

我们假设典型情况,有表emp,共有一百万行数据,但其中的emp.deptno列,数据只有4种不同的值,如10、20、30、40。虽然emp数据行有很多,ORACLE缺省认定表中列的值是在所有数据行均匀分布的,也就是说每种deptno值各有25万数据行与之对应。假设SQL搜索条件DEPTNO=10,利用deptno列上的索引进行数据搜索效率,往往不比全表扫描的高,ORACLE理所当然对索引“视而不见”,认为该索引的选择性不高。

但我们考虑另一种情况,如果一百万数据行实际不是在4种deptno值间平均分配,其中有99万行对应着值10,5000行对应值20,3000行对应值30,2000行对应值40。在这种数据分布图案中对除值为10外的其它deptno值搜索时,毫无疑问,如果索引能被应用,那么效率会高出很多。我们可以采用对该索引列进行单独分析,或用analyze语句对该列建立直方图,对该列搜集足够的统计数据,使ORACLE在搜索选择性较高的值能用上索引。

第十,索引列值是否可为空(NULL)。如果索引列值可以是空值,在SQL语句中那些需要返回NULL值的操作,将不会用到索引,如COUNT(*),而是用全表扫描。这是因为索引中存储值不能为全空。

第十一,看是否有用到并行查询(PQO)。并行查询将不会用到索引。

第十二,看PL/SQL语句中是否有用到bind变量。由于数据库不知道bind变量具体是什么值,在做非相等连接时,如“<”,“>”,“like”等。ORACLE将引用缺省值,在某些情况下会对执行计划造成影响。

如果从以上几个方面都查不出原因的话,我们只好用采用在语句中加hint的方式强制ORACLE使用最优的“执行计划”。

hint采用注释的方式,有行注释和段注释两种方式。
如我们想要用到A表的IND_COL1索引的话,可采用以下方式:
“SELECT /*+ INDEX(A IND_COL1)*/ * FROM A WHERE COL1 = XXX;"

注意,注释符必须跟在SELECT之后,且注释中的“+”要紧跟着注释起始符“/*”或“--”,否则hint就被认为是一般注释,对PL/SQL语句的执行不产生任何影响。

两种有效的跟踪调试方法

ORACLE提供了两种有效的工具来跟踪调试PL/SQL语句的执行计划。

一种是EXPLAIN TABLE方式。用户必须首先在自己的模式(SCHEMA)下,建立PLAN_TABLE表,执行计划的每一步骤都将记录在该表中,建表SQL脚本为在${ORACLE_HOME}/rdbms/admin/下的utlxplan.sql。

打开SQL*PLUS,输入“SET AUTOTRACE ON”,然后运行待调试的SQL语句。在给出查询结果后,ORACLE将显示相应的“执行计划”,包括优化器类型、执行代价、连接方式、连接顺序、数据搜索路径以及相应的连续读、物理读等资源代价。

如果我们不能确定需要跟踪的具体SQL语句,比如某个应用使用一段时间后,响应速度忽然变慢。我们这时可以利用ORACLE提供的另一个有力工具TKPROF,对应用的执行过程全程跟踪。

我们要先在系统视图V$SESSION中,可根据USERID或MACHINE,查出相应的SID和SERIAL#。

以SYS或其他有执行DBMS_SYSTEM程序包的用户连接数据库,执行“EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID,SERIAL#,TRUE);”。

然后运行应用程序,这时在服务器端,数据库参数“USER_DUMP_DEST”指示的目录下,会生成ora__xxxx.trc文件,其中xxxx为被跟踪应用的操作系统进程号。

应用程序执行完成后,用命令tkprof对该文件进行分析。命令示例:“tkprof tracefile outputfile explain=userid/password"。在操作系统ORACLE用户下,键入“tkprof”,会有详细的命令帮助。分析后的输出文件outputfile中,有每一条PL/SQL语句的“执行计划”、CPU占用、物理读次数、逻辑读次数、执行时长等重要信息。根据输出文件的信息,我们可以很快发现应用中哪条PL/SQL语句是问题的症结所在。

  • Oracle鏁版嵁搴涓储寮曠殑缁存姢
    绛旓細Oracle涓鏁版嵁搴涓殑鎵鏈夋暟鎹垎閰嶉昏緫缁撴瀯绌洪棿 鏁版嵁搴撶┖闂寸殑鍗曚綅鏄暟鎹潡(block) 鑼冨洿(extent)鍜屾(segment) Oracle鏁版嵁鍧(block)鏄Oracle浣跨敤鍜屽垎閰嶇殑鏈灏忓瓨鍌ㄥ崟浣 瀹冩槸鐢辨暟鎹簱寤虹珛鏃惰缃殑DB_BLOCK_SIZE鍐冲畾鐨 涓鏃︽暟鎹簱鐢熸垚浜 鏁版嵁鍧楃殑澶у皬涓嶈兘鏀瑰彉 瑕佹兂鏀瑰彉鍙兘閲嶆柊寤虹珛鏁版嵁搴 (鍦∣racle i涓湁涓浜涗笉鍚 涓嶈繃...
  • oracle 绱㈠紩
    绛旓細绱㈠紩缁存姢鍚屾牱閲嶈锛屽寘鎷暣鍚堢鐗囥佸垎鏋愮储寮曠殑浣跨敤鎯呭喌锛屼互鍙婃竻鐞嗘爣璁颁负鍒犻櫎鐨勬暟鎹紝杩欎簺鎿嶄綔閮戒細褰卞搷鏁版嵁搴鐨勬ц兘鍜屽瓨鍌ㄧ┖闂寸殑鍒╃敤鐜囥傛瘡涓涓楠ら兘鏄负浜嗕繚璇佺储寮曠殑鏈浣崇姸鎬侊紝涓烘煡璇㈤熷害淇濋┚鎶よ埅銆傛讳箣锛Oracle鐨勭储寮曚笘鐣屾槸涓涓簿蹇冭璁$殑鎬ц兘浼樺寲鑸炲彴锛岄氳繃鐞嗚В涓嶅悓绫诲瀷鐨勭储寮曘佸叾鑳屽悗鐨勫師鐞嗕互鍙婄淮鎶ょ瓥鐣ワ紝鎴...
  • 绁為鏁版嵁搴涓oracle鐨鍖哄埆
    绛旓細绁為鏁版嵁搴鏄竴娆捐绠楁満鏁版嵁搴撱俹racle: oracle浣跨敤琛岀骇閿,瀵硅祫婧愰攣瀹氱殑绮掑害瑕佸皬寰堝,鍙槸閿佸畾sql闇瑕佺殑璧勬簮,骞朵笖鍔犻攣鏄湪鏁版嵁搴撲腑鐨勬暟鎹涓,涓嶄緷璧栦笌绱㈠紩銆傜閫氭暟鎹簱鏍囧噯鐗堟彁渚涗簡澶у瀷鍏崇郴鍨嬫暟鎹簱閫氱敤鐨勫姛鑳斤紝涓板瘜鐨勬暟鎹被鍨嬨佸绉嶇储寮曠被鍨嬨佸瓨鍌ㄨ繃绋嬨佽Е鍙戝櫒銆佸唴缃嚱鏁般佽鍥俱丳ackage銆佽绾ч攣銆佸畬鏁存...
  • Oracle鏁版嵁搴涓殑鈥滅储寮曗濇庝箞鐞嗚В?
    绛旓細鍋囪鎴戜滑鏈200鏉鏁版嵁锛屼笉寤虹储寮曠殑鎯呭喌涓嬶紝浣犺鎵句竴涓暟锛屾瘮濡20锛屼綘瑕佹壘200娆★紝鐒跺悗杩斿洖浣犳壘鍒扮殑閭f銆備絾鏄鏋滄湁绱㈠紩锛屼綘灏辩煡閬撳厛鎵1--100涔嬮棿鐨勶紝鐒跺悗鍐嶆壘1--50涔嬮棿鐨勶紝鐒跺悗鎵1--25涔嬮棿鐨勶紝澶уぇ缂╁皬鐨勬煡鎵剧殑娆℃暟锛屽姞蹇簡鏌ヨ銆傜悊瑙o紵
  • oracle 涓轰粈涔鏈夌储寮曡繕鏄叏琛ㄦ壂鎻
    绛旓細杩欎釜涓鑸湅鏁版嵁鎯呭喌鍜鏁版嵁搴鎶鏈殑缁熻淇℃伅鎯呭喌锛屽彟澶栬繕鍜宻ql璇彞鐩稿叧锛氭瘮濡傛暟鎹簱涓煇绱㈠紩瀛楁鍊煎叏閮ㄤ负1锛岄偅涔堜綘鏉ヤ竴涓猚ol=1锛屽熀鏈笂鏄敤涓嶄簡绱㈠紩鐨勩傜粺璁′俊鎭鏋滄病鏈夊強鏃舵洿鏂帮紝涔熷彲鑳藉鑷存棤娉浣跨敤绱寮曘
  • oracle涓巑ysql鐨勫尯鍒?
    绛旓細mysql閫昏緫澶囦唤鏃惰閿佸畾鏁版嵁锛屾墠鑳戒繚璇佸浠界殑鏁版嵁鏄竴鑷寸殑锛屽奖鍝嶄笟鍔℃甯哥殑dml浣跨敤銆備竷銆佺儹澶囦唤 oracle鏈夋垚鐔熺殑鐑宸ュ叿rman锛岀儹澶囨椂锛屼笉褰卞搷鐢ㄦ埛浣跨敤鏁版嵁搴撱傚嵆浣垮浠界殑鏁版嵁搴撲笉涓鑷达紝涔熷彲浠ュ湪鎭㈠鏃堕氳繃褰掓。鏃ュ織鍜岃仈鏈洪噸鍋氭棩蹇楄繘琛屼竴鑷寸殑鍥炲銆俶ysql锛歮yisam鐨勫紩鎿庯紝鐢╩ysql鑷甫鐨刴ysqlhostcopy鐑鏃讹紝闇瑕...
  • java杩炴帴oracle鏁版嵁搴java.sql.SQLException: 鏃犳晥鐨勫垪绱㈠紩闂_鐧惧害鐭 ...
    绛旓細杩欏拰鐢ㄤ粈涔堢敤鎴锋棤鍏筹紝鍙鑳借繛涓鏁版嵁搴銆佸苟涓斾娇鐢ㄧ殑鐢ㄦ埛瀵硅琛ㄦ湁鎻掑叆鏉冮檺锛屽氨娌¢棶棰樸傜幇鍦ㄥ嚭鐜扮殑鈥滄棤鏁堢殑鍒楃储寮曠殑寮傚父鈥濓紝鏄寚鍦ㄨ鍙stmt.setString(2,str2);涓紝鍒楃储寮2鏄棤鏁堢殑锛屽洜涓簊ql璇彞涓彧鏈変竴涓棶鍙枫侾reparedStatement 瀵硅薄涓殑 setString鏂规硶鐨勭涓涓弬鏁版槸鍒楃储寮曪紝杩欎釜鍙傛暟鐨勫彇鍊艰寖鍥存槸鍜...
  • oracle鏁版嵁搴绱㈠紩绉嶇被,鍒嗗埆浠涔鎯呭喌涓嬩娇鐢
    绛旓細1. b-tree绱㈠紩 Oracle鏁版嵁搴涓渶甯歌鐨勭储寮曠被鍨嬫槸b-tree绱㈠紩锛屼篃灏辨槸B-鏍戠储寮曪紝浠ュ叾鍚屽悕鐨勮绠楃瀛︾粨鏋勫懡鍚嶃侰REATE INDEX璇彞鏃讹紝榛樿灏辨槸鍦ㄥ垱寤篵-tree绱㈠紩銆傛病鏈夌壒鍒瀹氬彲鐢ㄤ簬浠讳綍鎯呭喌銆2. 浣嶅浘绱㈠紩(bitmap index)浣嶅浘绱㈠紩鐗瑰畾浜庤鍒楀彧鏈夊嚑涓灇涓惧肩殑鎯呭喌锛屾瘮濡傛у埆瀛楁锛屾爣绀哄瓧娈垫瘮濡傚彧鏈0鍜1鐨...
  • mysql鏁版嵁搴撳拰oracle鏁版嵁搴鐨勫尯鍒
    绛旓細Mysql涓Oracle鍖哄埆鎬荤粨濡備笅锛1. Oracle鏄ぇ鍨鏁版嵁搴鑰孧ysql鏄腑灏忓瀷鏁版嵁搴擄紝Oracle甯傚満鍗犳湁鐜囪揪40%锛孧ysql鍙湁20%宸﹀彸锛屽悓鏃禡ysql鏄紑婧愮殑鑰孫racle浠锋牸闈炲父楂樸2. Oracle鏀寔澶у苟鍙戯紝澶ц闂噺锛屾槸OLTP鏈濂界殑宸ュ叿銆3. 瀹夎鎵鐢ㄧ殑绌洪棿宸埆涔熸槸寰堝ぇ鐨勶紝Mysql瀹夎瀹屽悗鎵152M鑰孫racle鏈3G宸﹀彸锛屼笖浣跨敤鐨勬椂鍊...
  • oracle鏁版嵁搴鐨勬搷浣滈棶棰
    绛旓細鏅氳繖涔堝ぇ鐨勮〃锛屾彃鍏鏁版嵁鏃朵細寮曡捣绱㈠紩缁存姢銆傛墍浠ユ兂鎻掑叆鐨勫緢蹇氨鎶婄储寮曠鐢ㄦ垨閮藉垹闄ゆ帀锛佷互涓婂洖绛斾綘婊℃剰涔堬紵
  • 扩展阅读:oracle数据库一年多少钱 ... oracle数据库有必要学吗 ... 财务oracle是什么软件 ... oracle数据库入门教程 ... 为什么不建议学oracle ... oracle一年多少钱公司 ... oracle数据库是免费的吗 ... oracle数据库的存取方法 ... 高斯数据库和oracle数据库的区别 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网