数据库程序员面试分类真题13.docx
下:SYSdb>SHOWPARAMErtRBACKGRouND_DUMP_DEST眦三VA1.UEteckgnxnd_&n)jieststring/uOl/冲/OradeainlhrMlflP在OraCleIlg中,告警日志一般在$ORAC1.E_BASE/diag/rdbms/$DBNAME/$ORAC1.E_SID/traca目录下:S,Sglhrdb>SHOWPARAMETERBACKGROUNDDUMPDEST7faa三三VAUEbac11xmd.(tapjcststring1WleapMTttediag,dtas.Ohrdb.'ih11lbtraceZFZU1.HRDlOTckloracic>dECbaPPgJcldjgi±11sdbfeaZF2H1.HRDB1:OTdorade*ocJt姬hftmdtra0>ls-Ia!0t*11rIoradfISmMmin1JO42Oct1713akrt_lhrdbJos从OraCIe12.1.0.1开始,参数BACKGRoUND_DUMP_DEST己废弃,告警日志的位置应该由以下SQ1.来查询:SQ1.>SE1.ECTd.VA1.UEFROMV$DIAGNFodWHEREd.NAME=DiagTrace,;VA1.UEv三*w三MWVWu1/apporaele/diagrdbms/1hrdblhrdbtrace需要注意的是,该SQ1.也适用于OraCleUg的版本。3. 若告警志文件过大,则如何有效管理告警志文件?正确答案:由于告警日志按时间的先后顺序不断累积存储,久而久之,势必造成告警日志的过大,难以维护,查找相关的信息也不方便。另外,若告警日志超大,也会严市影响系统的性能。这里提供3种办法来管理告警日志:使用外部表方式来管理告警日志将大大简化维护工作量,也可以更直观地获取所需的信息;视图V$DTAG_A1.ERT_EXT对应的基表里存储了告警日志的内容,可以根据该视图将告警日志的内容行储在历史表中;利用SHE1.1.脚本定时将告警日志进行备份,防止告警日志过大而影响系统性能。4. 数据库处于RESTRICT、QUIESCE和SUSPEND状态的区别是什么?正确答案:在OraCle中,数据库可以有3种限制性状态,见下表。RESTWQUlEScISUSPENDR介011k,W哪删锚i腓.而胸稣作游谢H族不燃用跳户脚4«60.打这相如皿解魁人RISIWE)SESSION财,底祭止做用户化戏如与'湖眸以RESTRIer槌泊功.成槌入RKlWCT崎,0ral三明物M睇糜肺期胞蝴丸A曲RESTRICTEDSEsSK)X觊姻沪驹RESTRICTZit三三IP三1TW.豌配询用户可腰的闸W邮,翎州Kff½8RESnUCr用WlESCE腿脓6却懒,他NDBA胁训啊珊恨阳副胪不触所操作,1ft-ftfQUIESCEWR<JDBAR取棚IfM以选旗作,而制用户封6于等外轧JU当J根库迅出QUESCE婢制护推他t三,QnKeU迷肝724瑞提HHi传醐,好蹈护硫乂躁憾年酗硼洲强筋松螂RESTRICTB!制的是兴有RESTOCTtDsession-kw.他场颜护无液m.ftQl三EWW-SYS.S三M用户的时S三怡战鼓、确,DM1.ESuWEND主要跟SO用中肺用户的K)M的,覆辩好SUSPEND处EEfcQ岫曲,W2胞用网啊以正名盼.口副期执仔ft三J幅裸可跳BufcCKhe帔知利起蝌10.4t不会胡最旗代询强将削。姆才会圈第的盘颔嬲RKTRKI是黎止网即1U焉而对侬更姻户设舐版1果期服票止l三户的桶,mi三eif三iffi三j耨会乐并机"ms三0N微作.RESiwcn身题糊颂物,对典舲话坳建过谀耳系我的QuEScERES11UCHD.»WDBAflf处F到懒,府苜蝴迷是湿存侬措造用户部集无蝴行郴作,醺系起出Ql三CEtt.QUESCE自检筱蒯融股点f三SQim骸用帕好嫦修也是懒轴了晒SQ1.iif1.QuESCE喘怫话微力搦行会楸RACWft«RESTRICT幡麻RAC耳搬侬初明相魏物价做RESTRICr根浣轴油版嬲犹aQl'三会物耍懂斛柘跣嫡,HRAC州徽联无法在QUESCE悔下制SUSreNDR加细饰RAC知生虬酸悯的灼,ftmAcnXE艇,SlSPENDifWbW能用钟SuRnjPRKTMCT;一启防醴翎期A1.三SYSTEMEKAB1.ERESTRICTEDSESSIoN:-启用A1.TERSYsrEMDISAB1.ERI三ICH)SEsSloY一鞠Grantrestricto)sessionto1.HR;-三RMxERESJRiCTtDS三ONFROMM-Sft三AnERSYSTEMQl三IRME)T现A1.TERSYSTEMUNQUIESCE;-?i给A1.TERsYsnMSUSpEMb自用A1.TERSYSTEMRESUMErIifi处僦SE1.ECT1.OGINSFROMGVSINsTANCEIE常处为A1.1.OftlD.RESTWCT状态下为RESTRICTEDSE1.ECTDAEzsTAreFROMVsnstanceDrH常状器为NORMA1.QITESCE¾UTQb三H)SE1.ECTnDATABASE_STAMFROMVSINSTANaDr正穗为AemEQClESa悔下为SISPENDED脑瞄A1.T1.RSYsIEMubrouadSiSSjo11:Dtmhseisce11x×fe&spatin$<htbceaft加sjsnSuspxdcannand需要注意的是,可以使用“SE1.ECT*FROMSESSlOkRO1.ES;”查询当前用户具有的角色。5. 数据库的启动经历几个过程?正确答案:OraCle数据库的启动,严格来说应该是实例的启动,数据库仅仅是在实例启动后进行装载。OraCIe数据库启动的过程被划分为几个不同的步骤,在不同的启动过程中,可以对其实现不同的操作。启动命令:STARTUPFORCERESTRICTPFl1.E=.NOMOUNTMOUNTOPEN启动过程:NOMOUNT->MOUNT->OPEN,详细情况见下表。阶&缄任务I注自令NoMOlNr腿便实懒)蝴融函NrtM务:1)技以F财在SORAe1.EJIOMEdlB!Windousf台网ORAC1.EH0ME%-fa3bw股)睫下赞奸<SlD>i>cora>i!t<S11>ra2)源”陆械SGA3)职昭M4)打开腿改也吉文的曜文件策段多肝雎胞也视文件棘、特定的德诙娘,融注复艇.就段和ff三如戏即敝件.在IWAN快姐,醴觑mm三三fSTARTUPNOMOUKT(线)腿赖W任务各注自今MO1.NTSMiM(Wr阶胱眦任务好:1)用用参也攵件中的CWTRO1.Fl1.ES的值.打开制1定投制文件2)移费拓¥与实用知遑泉3)潮文件用网射8攵件gRdo日告文件的名聊脑做1,但不如Ii得岫城件麻舱该阶段多用于以F坛第D雷奇名醵文件,硼爆文师(W掰而及弼W三3iF也可以篁钝懿文件)2)附强谏哨州苜版3)发醵爆库的完域Uxsm½.这与蝴避敢件,跟这一步有的醐矫鼓翻,嬲Im激动STARTUPMOUNTOreN雕OreN松段剧的的如En三Mlift2)m三瞅件喊雕要M以机fi:D-1.QnldC神肺的寐文件就机潴文件暨看打开制映眯笈静G2)m处出现致性M1.脓SMoN鼾曜动宾WMl3)如I任富一M件飙机球如款,勒IOnKle跚物会报珞STARWP6. 关闭数据库有几种方式?正确答案:数据库的关闭也有一些参数需要注意,关闭命令为SHUTDOWNABORTIIMMEDIATETRANSACTIONA1.NORMA1.其中,SHUTDOWN不带参数将默认为ORMA1.0一般情况卜.,关闭数据库都使用uSHUTDOWNIMMEDIATE"命令。这几个参数的区别见卜表。YYYNNNNNYSHUTDOWNNORMA1.TRANSACTIONA1.IMMEDIATEABORT是否允许新连m接NNNN告警日志ShuttingdownShuttingdowninstanceShuttingdowninstanceShuttingdowninstance(normal)(transactional)(immediate)instance(abort)1)NORMA1.表示不准许新的连接,等待当前所有连接到数据库系统的用户都断开连接(DlSCONXECT),强制检查点并关闭文件,卜次启动不需要实例恢复。2)TRANSAc11onale表示不准许新的连接,不允许开启新事务,数据库等待所有事务完成后断开当前连接到数据库的所有用户,强制检查点并关闭文件,下次启动不需要实例恢复。3) IMMEDlATE表示不准许新的连接,不允许开启新事务,任何未提交的事务都进行回滚。数据库显式回滚活动的事务并断开所有当前连接到数据库的用户,强制检查点并关闭文件,下次启动不需要实例恢且。4) ABORT表示不准许新的连接,不允许开启新事务,任何未提交的事务不进行回滚。数据库立刻中断所有SQ1.的执行,并断开所有用户的连接。不做强制检杳点,下次启动需要做实例恢熨。7. 索引包括那几个特性?正确答案:一般来说索引有3大特性,即索引高度比较低、索引存储列值及索引本身有序,对这3大特性的应用见下表。索引特性带来的优势应用的常见SQ1.高度比较低索引高度低有利于索引范围扫描,通过索引可以非常迅速地从这也是索引存储列值索引本身有序海量数据中获取少量数据的原因。索引的高度越高,访问索引需要读取的数据块数越多,效率越差由于索引比表一般要小得多,所以在通过索引本身就可以查找到所需要的数据的情况卜.,可以将表看成是一个“瘦表”或“小表”,无须索引回表读这个过程(索引回表读是非常耗费性能的),这样访问路径就会大大减少。利用该特性可以优化的SQ1.包括COUNT(*).SUM(索引例J)等聚合语句能够利用索引本身已有的排序特性来消除目标SQ1.的排序操作,从而优化ORDERBY等排序语句能够用索引有序的特性在叶广块的最左边或最右边找到最小和最大值,从而优化类型MAX、VIN语句SE1.ECT*FROMTWHEREID=I;SE1.ECTCOUNT(*)FROMT;SE1.ECTSUM(OBJECT_ID)FROMT:SE1.ECT*FROMTWHEREOBJECT_ID>2ORDERBYOBJECT.ID;SE1.ECTMAX(OBJECT_ID)FROMT:另外,需要特别注意的是,索引不存储空值。考点索引8. 如何预估即将创建索引的大小?正确答案:如果当力表大小是1TB,那么在某一列上创建索引的话索引大概占用多大的空间?对于这个问题,Oracle提供了2种可以预估将要创建的索引大小的办法:D利用系统包DBMSSPACE.CREATEINDEXCoST直接得到。利用DBMSSPACE.CRETETAB1.ECoSTnj以获得将要创建的表的大小。2)利用OraCIeUg薪特性NOTERAISEDWHENEXP1.AINP1.ANFORCREATEINDEXo考点索引9. 如何监控索引的使用状况?正确答案:在开发应向程序时,可能会建立很多索引,那么这些索引的使用到底怎么样,是否有些索引一直都没有用到过,在这种情况下就需要对这些索引进行监控,以便确定它们的使用情况,并为是否可以清除它们给出依据。监控索引有两种方式:(D直接监控索引的使用情况1)设置所要监控的索引:A1.TERINDEXIDX_T_XXMONITORINGUSAGE;2)查看该索引有没有被使用:SE1.ECT*FROMV$OBJECT-USAGE;3)关闭监控:A1.TERINDEXIDX_T_XXNOMONITORINGUSAGE;查询V$0BJEe1.uSAGE就可以知适薪据库对索引的使用情况。通过一段时间的监控,就可以确定哪些是无用的索引。另外,为了避免使用V$0BJECTUSAGE只能查询到当前用户下索引的监控情况,可以使用如下语句查询数据库中所有被监控索引的使用情况:SE1.ECTU.NAMEOWNER,10.NAMEINDEX_NAME,T.NAMETB1.E-NAME,DECODE(BITAND(I.F1.AGS,65536、,0,'NO','YES')MONITORING,DECODE(BITND(OU.F1.AGS,1),0,NO','YES')USED,OU.STARTMONITORINGSTARTMONITORING,OU.ENDMONITORINGENDMONITORINGFROMSYS.USERSU,SYS.OBJJIO,SYS.OBJ$T.SYS.INDSI,SYS.OBJECT.USGEOUWHERE1.OBJ#=OU.OBJ#AND10.OBJtt=OU.OBJttANDT.OBJ#=1.BOttANDU.USERit=IO.OWNER#;(2)通过查看历史的执行计划,分析索引的使用情况可以从视图DBAJI1STSQl-P1.AN中获取到数据库中所有索引的扫描次数情况,然后根据扫描次数和开发人员沟通是否需要保留索引。考点索引10. 哪些操作会导致索引失效?正确答案:当某些操作导致数据行的ROwlD改变,索引就会完全失效。可以分普通表和分区表来讨论哪些操作将导致索引失效。D普通表索引失效的情形如下:手动置索引无效:A1.TERINDEXIND_OBJECT_1DUNUSAB1.E;。如果对表进行MOVE操作(包含移动表空间和血缩操作)或在线重定义表后,那么该表上所有的索引状态会变为UNUSAB1.E。MoVE操作的SQ1.语句为A1.TERTAB1.ETTMOVE;。SQ1.*1.oader加载数据。在SQ1.*1.Oader加载过程中会维护索引,由于数据量比较大,在SQ1.*1.oadcr加载过程中出现异常情况,也会导致OraCle来不及维护索引,导致索引处于失效状态,影响杳询和加载。异常情况主要有在加载过程中杀掉SQ1.*1.oader进程、重启或表空间不足等。2)分区表索引失效的情形如下:对分区表的某个含有数据的分区执行了TRUNCATEDROP操作可以导致该分区表的全局索引失效,而分区索引依然有效,如果操作的分区没有数据,那么不会影响索引的状态。需要注意的是,对分区表的ADD操作对分区索引和全局索引没有影响。执行EXCHANGE操作后,全局索引和分区索引都会被无条件地置为UNUSAB1.E(无论分区是否含有数据).但是,若包含INC1.UDINGINDEXES子句(默认情况下为EXCUJDlNGINDEXES),则全局索引会失效,而分区索引依然有效。如果执行Sp1.lT的目标分区含有数据,那么在执行SP1.lT操作后,全局索引和分区索引都会被置为UNUSAB1.Eo如果执行SP1.IT的目标分区没有数据,那么不会影响索引的状态。对分区表执行MOVE操作后,全局索引和分区索引都会被置于无效状态。手动置其无效:A1.TERINDEXINDOBJECTIDUNUSAB1.E;对于分区表而言,除了ADD操作之外,TRUNCATE.DROP、EXCHANGE和SP1.lT操作均会导致全局索引失效,但是可以加上UPDATEG1.OBA1.INDEXES子句让全局索引不失效。重建分区索引的命令为A1.TERINDEXIDX_RAM1.1.HRREBUI1.DPARTITIONPl;o考点索引11. 聚簇因子-(ClusteringFaCtOr)是什么?正确答案:OraCIe数据库中最普通、最为常用的即为堆表,堆表的数据存储方式为无序存储,当对数据进行检索的时候,柞常消耗资源,这个时候就可以为表创建索引了。在索引中,数据是按照一定的顺序排列起来的。当新建或重建索引时,索引列上的顺序是有序的,而表上的顺序是无序的,这样就存在了差异,即表现为聚簇因子(ChaSteringFactor,CF),也称为群集因子或集群因子等,本书统一称为聚簇因子。聚簇因子值的大小对CBO判断是否选择相关的索引起者至关重要的作用。在Oracle数据库中,聚簇因f是指按照索引键值排序的索引行和存储于时应表中数据行的存储顺序的相似程度,也就是说,衣中数据的存储顺序和某些索引字段顺序的符合程度。CF是基于表上索引列上的个值,每一个索引都有一个CF值。Oracle按照索引块所存储的ROWTD来标识相邻索引记录在表块中是否为相同块。好的CF值接近于表上的块数,而差的CF值则接近于表上的行数。CF值越小,相似度越高,CF值越大,相似度越低。如果CF的值接近块数,那么说明表的存储和索引存储排序接近,也就是说表中的记录很有序,这样在做IM)EXRANGESCA的时候,读取少量的数据块就能得到想要的数据,代价比较小。如果CF值接近表记录数,那么说明表的存储和索引排序差异很大,在做IW)EXRANGESCAX的时候,由于表记录分散,所以会额外读取多个块,代价较高。由于聚簇因子高的索引走索引范围扫描时比相同条件卜.聚簇因子低的索引要耗费更多的物理I/O,所以聚微因子高的索引走索引范围扫描的成本会比相同条件下聚簇因子低的索引走索引范围扫描的成本高。Oracle选择索引范围扫描的成本可以近似看作是和聚簇因子成正比,因此,聚簇因子值的大小实际上对CBo判断是否走相关的索引起着至关重要的作用。其实,聚簇因子决定着索引回表读的开销。在OraeIe数据库中,能够降低目标索引的聚簇因F的唯一方法就是对表中数据按照目标索引的索引健值排序后重新存储。需要注意的是,这种方法可能会同时增加该表上存在的其他索引的聚簇因子的值。可以通过如下的命令显式地设置聚簇因子的值:EXECDBMS_STATS.SET_INDEX_STATS(OWNNAME=>>1.HR,INDNAME=>,IND2,C1.STFCT=>400000000,NOINVA1.IDATE=>FA1.SE);CF值nJ"以通过查询视图DBAINDEKES中的C1.USTERIGFACTOR列来获取。卜边的SQ1.是查询索引的相关信息,通过视图DBAINDEXES.DBAOBJECTS和DBAJrAB1.ES关联得到,可以查询当前索引的大小、行数、创建口期、索引高度和聚簇因子等信息。考点索引12. 什么是索引的选择性(IndeXSelectivity)?正确答案:索引的选择性(IndCXselectivity,索引的选择度或索引的选择率)是指索引列中不同值的记录数与表中总记录数的比值。索引的选择性的取值范围是WUo例如,某个表的记录数是100o条,而该表的索引列的值只有900个不同的值(有100个是相同或者空),所以,该列索引的选择性为900/1000=0.9。对于索引的选择性,值越高表示该列索引的效率也就越高。可以使用如下的SQ1.来计算索引的选择性:SE1.ECTCOUNT(DISTINCTNME)/COUNT(*)FROMTB_A;这种方法的优点是在创建索引前就能评估索引的正择性。当索引被收集了最新的统计信息时,可以使用如下的SQ1.语句查询索引的选择性:SE1.ECT1NDEX_NAME,DISTINCT_KEYS/NUM_ROWSSE1.ECT1VEYFROMDBANDEXES;毋席置疑,主键的选择性为1。选择性越接近1,那么该索引就越好。考点索引13. 哪几种情况不能使用索引?正确答案:有多种原因会导致索引不能被使用。首要的原因就是统计信息不准,第二原因就是索引的选择度不高,使用索引比使用全表扫描效率更差。还有一个比较常见的原因,就是对索引列进行了函数、算术运算或其他表达式等操作,或出现隐式类型转换,导致无法使用索引。还有很多其他原因会导致不能使用索引,这个问题在MOS(MOS即MyOracleSupport)“文档这49181.l为何在查询中索引未被使用”中有非常详细的解释。详细情况见下表。表上是甭存在索引快速检查索引是否应该被使用检查那些认为应该通过索引访问的表上是否真的创建了索引。那些索引可能已经被删掉或者在创建的时候就失败了。例如,一种可能的场圻是,在对表做导入操作后,由于软件或人为错误造成索引没有被创建。通过DBA-NDEXES视图可以检查索引是否存在Oracle不会仅仅因为有索引存在就一定要使用索引。如果一个查询需要检索出这个表里所有的记录,那么只需要单独访问我的数据会更快。对所有的查询而言,OraCle优化器会基于统计信息来计算各种访问路径,包括索引,从而选出最优的一条路径对于单列索引而言,只有当索引列出现在查询的WHERE索引的索引列是否条件中时,OraCle才能使用到索引。对索引本身的问题在WHERE条件中(Predicate1.ist)索引列是否用在连接谓词中(JoinPredicates)连接顺序(JoinOrder)是于组合索引而言,如果索引的前置列没有出现在圳ERE条件中,而是用到了组合索引的其他索引列,那么这时候OraCIe可能会选择索引跳跃扫描(IndexSkipScan,INDEX_SS)或不会选择索引扫描如果索引列是连接谓词的一部分,那么需要查看使用了哪种类型的连接方式?在两张表连接中,且内表的目标列上建有索引时,只有M1.连接才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响杏看连接顺序(JoinOrdCr)是否允许使用相关索引。假设表A的ID列上有索引,表B的列ID否允许使用索引上无索引,WHERE语句有A.ID=B.ID条件,并且查询中没有与.ID相关的其他谓词。在做N1.索引列是否在IN或者多个OR语句中是否对索引列进行了函数、算术运算或其他表达式等操作连接时.,表A作为外部表,先被访问,由于连接机制原因,外部表的数据访问方式是全表扫描,A.ID上的索引显然是用不上如果索引列在IN或OR子句中,那么查询可能已经被转化为不能使用索引的语句应尽量避免在WHEREf句中对索引字段进行函数、算术运算或其他表达式等操作,因为这样可能会使索引失效,雀询时要尽可能将操作移至等号右边如果进行比较的两个值的数据类型不同,那么Oracle必须将其中一个值进行类型转换使其能够比较,这就是所谓的隐式类型转换。通常当开发人员将数字存储在字符列时会导致这种问索引列是否出现了题的产生。OraeIe在运行时会在索引字符列使用隐式TO_NUMBER函数强制转化字符类型为数值类型转换(ImPIiCit类型。由于添加函数到索引列,导致索引不被使用。实TypeConversion)是否在语义(semantically)上无法使用索引际上,OraCIe也只能这么做,类型转换是个应用程序设计因素。由于转换是在每行都进行的,这会导致性能问题。一般情况下,当比较不同数据类型的数据时,OraClC自动地从熨杂向简单的数据类型转换。所以,字符类型的字段值应该加上引号出于对杳询整体成本的考虑,一个成本较低的执行计划中可能是无法使用索引的。某索引可能已经被考虑在某种连接排序及方法中,但是成本最低的那个执行计划中却无法从“语义”角度使用该索引(续)分类索引本原因解释错误类型的索引扫描可以定义索引的排序顺序为递增或递减.Oracle对待降序索引就好像它是基于函数的索引,因此与默认使用的升序的执行计划不同。通过查看执行计划身的问题是看不到使用升序或降序的,需要额外检查视图DBA_IND_CO1.UMNS的DESCEND列。如果系统中经常使用索引范围扫描进行读取数据(例如在WHERE子句中使用“BETWEENAND”语句或比较运算符“>”“V”>=”“V=”等),那么反向键索引将不会被使用,此时Oracle会选择全表扫描。只有对反向键索引列进行“=”操作时,其反向键索引才会使用除了联合索引(即多列索引)和位图索引外,其他索引都不存储NU1.1.值。只有至少有一个索引列有值,联合索引才存储空值。联合索引中尾部的空值也会被存放在索引中。如果所有列的值都为索引列是否可以为空,这行将不会存储在索引中。由于索引中缺乏NU1.1.空值,那么一些结果中可能会返回NU1.1.值(例如,COUNT)的操作可能会被禁用索引。这是因为优化器不能保证在单独使用索引时可以获得准确的信息。位图索引允许存储空值。因此,无论它们的结果可信与否,优化器都会使用这些索引如果N1.S_SORT未设置为二进制,索引将不会被使用。N1.S_SORT是否设置这是因为索引是基于Key值的:进制顺为:进制(BINARY)序来建立的(Pre-SOrted使用:进制值)。无论优化器设置为何种方法,当N1.S_SORT不是二进制时,将使用全表扫描是否使用的是不可见索引(InViSibIeIndexes)从OraCleIlgRl开始,可以创建不可见索引或将一个已经存在的索引标记为不可见。如果在SESSION或SYSTEM级别将参数OPTIMIZERUSEINVISIB1.EINDEKES设置为TRUE(默认为FA1.SE,表示OraCIe优化器不会考虑不可见索引),那么OraCIe优化器就会考虑不可见索引。无论该参数的值为TR1.E还走FA1.SE,DM1.操作还是会维护这些不可见索引的优化器和成是否存在准确且合适的统计信息(Statistics)CBO依赖于准确的、最新的和完整的统计信息来确定一个特定查询的最佳执行计划。如果使用CBO,需确保统计信息已经收集。如果没有统计信息,CBO将使用预定义的统计信息,这样很可能不会产生良好的计划或让应用程序使用索引。请注本计算相关问题意,CBO会根据开销(COST)来决定使用不同的索引。除了基本的表和索引的信息之外,如果在某些列上数据分他是不均匀的,那么还需要收集这些列的数据的分布情况,即宜方图。一般情况下,而象的数据或结构的改变会使以前的统计信息不准确,因此应该重新收集新的统计信息。例如,对表装载了大量的数据后,需要收集新的统计信息。安装新补丁集(PatehSet)后,也建议重新收集统计信息。表访问最佳效果是统计信息在相同版本的数据库中生成的一个索引是否与其对于相同开销(COST)的索引,CBO会使用多种办法将不他的同的索引区分开,如将索引名称按字索引有相同的等级母顺序排序,完全匹配的索引扫描会选择更大的NDK(不或者成本同键值的个数)的索引(不适用于快速(Cost)全扫描)或选择叶块数量较少的索引CBO会假定列数据不会倾斜,并均匀分布。如果数据分布不是这种情况,那么统计信息可能没索引的选择度是否有反映真实情况,即使某些值的选择度高,索引也会因不高为整个列的选择度不高而不使用索引。如果是这种情况,那么应考虑采用直方图记求更准确的列的数据分布或者采用提示(Hint)通常来说,当使用索引的时候,需要再次检索表本身来找到索引中不存在的字段的值(索引回表读),这个操作比检索索引本身的开销要大很多。由于在总体成本中,表扫描的成本是否占大部分优化器是基于总体的成本来计算执行计划的,如果通过索引检索表的成本很大,并且超过了某个阀值,优化器就会考虑其他的访问路径。优化器(Optimizer)使用聚簇因子(CIUSteringFactor)来判断若使用索引的话需耍对表做多少次访问,因此当索引的聚簇因子很大的时候OraCIe会选择全表扫重组、TRINCATE或DE1.ETE操作不一定会影响SQ1.语句访问空索引并不意执行的成本。需要注意的是,删除味着操作并不会从对象中真正释放空间。也就是说,DE1.ETE比访问有值的索引操作不会重置对象的高水位。TRUNCATE高效操作会重黄高水位。空块的存在会使索引和表扫描的成本比实际应该的成本高参数设置是否正确是否存在远程表(RemoteTable)其他问题是否使用了并行执行(PX)是否包含/子查询的UPDATE语句查询是否使用r绑定变量查询是否引用了带有延迟约束的列索引提示(Hint)是否不工作(续)原因其索引列是否使用了某些参数的设置可能会影响索引的使用。比如在大多数情况下都建议使用db_fIlejiultiblock_read_count和OPTIMIZER_INDEX_COST_ADJ的默认值。除非某些特定的操作有猫定的还议,使用其他值会使索引的成本不现实地减少或变大,从而极大地降低查询的性能通常远程表不会使用索引。索引在分布式查询中的使用依赖于被发送到远程的查询。CBO将评估远程访问的成本,并评估比较发送或者不发送索引的谓词到远程站点的成本。因此,CBO可以做出有关远程表上使用索引的更加明智的决定。一种非常有效的方法就是,在远程建立包含相关谓词的视图并强制使用索引,之后在本地查询中使用这个视图在并行执行时索引的采用比在串行执行(SerialEXeCUtion)时更加严格。一种快速检测的方法就是禁用并行,然后查看该索引是否被使用。并行查询将不会用到索引在一些情况下,基于成本的考虑,索引没有被使用是因为它依赖于一个子查询返回的值。这种情况下,可以使用提示(Hint)来强制使用索引CBO对1.IKE或范围谓词的绑定变量不能产生准确的成本,或绑定变量窥探操作都可能会导致索引不被选择如果一一个表中的某一列上含有延迟约束(比如NOTNU1.1.)并且这一列上有索引,那么不管这个约束当前是延迟状态或者被显式地设置为立即使用,Oracle都不会考虑使用这一列上的索引语法不正确、使用了RB0、Hinl的对象名不正确、使用了非空索引列来计算行数等情况都可能导致索引提示不工作解释KWHERE子句中,如果索引列所对应的值的第一个字符前置通配符(盼索引列是否使用了非等值连接符是否在WHERE子句中对索引列进行了ISNU1.1.值判断查询转换失败,不了索引是否使用了视图或子查询由通配符曲I1.DCARD)开始,索引将不被采用应尽量避免在WHERE子句中使用!=或V操作符,否则引擎将放弃使用索引而进行全表扫描。可以通过改写为IN或UNIONA1.1.来使用索引应尽量避免在WHERE子句中对字段进行ISNU1.1.值判断,否则将导致引擎放弃使用索引而进行全表扫描。可以通过加伪列创建伪联合索引来使得ISNU1.1.使用索引查询转换是非常复杂的过程,OracleCBo的查询转换有了查询展开、视图合并、星型转换、连接谓词推入、表扩展等。如果查询转换失败,那么必将影响后续优化器的一些操作,比如JPPD中JOIN谓词无法推入视图中,那么很可能视图就无法选择索引了。另外,查询转换有很多BUG,若触发BUG则需要找到原因,比如设置隐含参数、fixcontrol,或者改写SQ1.绕过BUG等查询涉及视图或者子查询时可能会被改写,导致不使用索引(尽管该改写的目标之一是扩展更多的访问路径)-这些改写(Rewrite)一般来说都是合并(Merging)操作建议读者对每种类型的情况都做实验,以便加深理解和印象。14. ISNU1.1.如何用到索引?正确答案:ISNU1.1.用于判断某一列中的值是否为空。当ISVJ1.1.作为WHERE条件的时候,该列是不会用到索引的,但是可以加伪列创建伪联合索引来使得ISNU1.1.使用索引。考点索引15. 模糊杳询可以使用索引吗?正确答案:可以分为以卜几种情况:1)若SE1.ECT子句只检索索引字段,那么模糊查询可以使用索引,例如,“SE1.ECTIDFROMTBWHEREID1.IKE,%123%,:,可以使用索引。2)若SE1.ECT子句不只检索索引字段还检索其他非索引字段,那么分为以下几种情况:模糊查询形如“WHERECO1._NAME1.IKE,ABC%,;,可以用到索引。模糊查询形如“WHEREC01._NAME1.IKE,%BC,不能使用索引,但是可以通过REVERSE函数来创建函数靠引才能使用到索引。模糊查询形如“WHEREC01.NAME1.IKE'%ABC%'不能使用索引,但是,如果所查询的字符串有一定的瓦律,那么还是可以使用到索引的,分以卜.几种情况:a.如果字符串ABC始终从原字符串的某个固定位置出现,那么可以创建SUBSTR函数索引进行优化。b.如果字符串ABC始终从原字符串结尾的某个固定位置出现,那么可以创建函数组合索引进行优化。c.如果字符串ABC在原字符串中位置不固定,那么可以通过改写SQ1.进行优化。改写的方法主要是通过先使用广查询查询出需要的字段,然后在外层嵌套,这样就可以使用到索引了。建全文索引后使用CONTAINS也可以用到域索引。16. Hint是什么?正确答案:Oracle的HinI是用来提示Oracle的优化器,用来选择用户期望的执行计划。OraCIe推出了一个隐含参数“.OPTIMIZERGNoRE_HINTS”,其取值为TRUE或FA1.SE,默认值是FA1.SE。OraCIe可以通过将该隐含参数设置为TRUE,使得OraCle优化器忽略语句中所有的HinK显然,OraCIe提供此参数的目的是在不修改应用的前提下,忽略所有Hint,让OraCle优化器自己来选择执行路径。考点Hint17. N01.0GGING是一种Hint吗?正确答案:下面几条SQ1.都是使用nologging时的错误用法:INSERTINTOTlNO1.OGGING;INSERTINTOTlSE1.ECT*FROMT2NO1.OGGING;INSERT*÷NOl,OGGING*/1NTOTlVA1.UES('0');INSERT*+NO1.OGGING*/INTOTlSE1.ECT*FROMT2:DE1.ETE*+NO1.OGGING*FROMTl:UPDATE*+NO1.OGG1NG*T1SET=;实际上,上述