一安裝配置cognos調優說明_第1頁
一安裝配置cognos調優說明_第2頁
一安裝配置cognos調優說明_第3頁
一安裝配置cognos調優說明_第4頁
一安裝配置cognos調優說明_第5頁
已閱讀5頁,還剩55頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Apache配置調 IIS配置調 連接超 性 ReportNet自帶tomcat配置調 CognosReportNet配置調 CognosReportNet服務器管理設 ContentStore數據庫連接池設 修改CognosConfiguration配置提高Cognos8速 COGNOS設計調 ReportStuido設計調 報表Processing設 使用With子 FrameworkManager設計調 手寫SQL定制查詢.................................................................................................... ernors查詢性能設 Reporttablelimits設 Dataretrievallimits設 Queryexecutiontimelimits設 Largetextitemslimit設 Transformer和Cube設計調 啟用多CPU數據源 通過crosstabcaching提高cube速 恰當分配數據庫和Cognos之間的運算 優化參數提高cube在cognos8上的展示性能 調節Transformer每次提交數據 ORACLE設計調 1.1Table的方 共享SQL語 WHERE子句中的連接順序 SELECT子句中避免使用‘* 使用DECODE函數來減少處理時 通過內部函數提高SQL效 用EXISTS替代 用NOTEXISTS替代NOT 用表連換 用EXISTS替換 識別’低效執行’的SQL語 用 N分析SQL語 多個的索 用UNION替換OR(適用于索引列 用IN來替換 避免在索引列上使用ISNULL和ISNOT 用UNION-ALL替換UNION(如果有可能的話 用WHERE替代ORDER 需要當心的WHERE子 一、Apacheapacheapache\conf\httpd.conf默認值300秒。跟根據當前的網絡狀態對超時進行設置0(對最大連接請求數不做限制。從同一個客戶端的同接發過來的兩個請求之間的允許的最大時間間隔,運行IIS通過點擊默認的右鍵,點其屬性,出現如下webserver得到相應的最大時間間隔。默認值150秒。跟根據當前的網絡狀態對超時進行設置限制可以使用的帶寬,應設置為不限ReportNettomcat minProcessors="5"maxProcessors="500"enableLookups="true"redirectPort="9443"acceptCount="500"debug="0"connectionTimeout="60000"useURIValidationHack="false"tomcat在運行的時候允許的最大處理請求(多線程。在服務器資源允許的情況下,提高該值500500。Tomcatreportnethttpservertomcat,所以該值httpserverKeepAliveTimeout值匹配。60000Session30CognosReportNet文件路徑:CRN_ROOTwebapps\p2pd\WEB-INF\services\<!-- umnumberofprocessesthatcanberunningatonetime--CPU2個處理。注:該值需要和ReportNetReportService服務中的umnumberofin ctivereportserviceprocesses值匹配。<!--Theminimumnumberofprocessestokeepinmemoryoncethey'restarted--CPU1個處理。注:提高該屬性設置,可以提高服務器在非使用時段的處理能力<!-- umnumberofnon-affineconnectionsperprocess--CPU4個處理,Windows2個處理。注:該值需要和ReportNetReportService服務中的Numberoflowaffinityconnectionsforthe ctivereportservice值匹配。<!--Timeperiodbetweenchecksforidleorexpiredprocesses(inms).Everytimewecheckanidleprocesswebumpitstickcount. Everytimeweuseaprocessthecountisresetto0. Ifthecounteverreachesthevalueofidle_process_max_idle_ticks(below)theprocessis<!--numberofidlecheckticksbeforeanidleprocessiskilled.--10。由于進程的頻繁啟動退出會消耗服務器資源,可根據并發<!-- umtimearequestisqueuedbeforeitgivesup(inms)--30000,單位毫秒。可根據并發查詢情況,增大時間限制,ReportNetReportServiceQueuetimelimitofreportservicein<!--Theamountoftimethedispatcherwillwaitforaasyncrequestbeforeitcancelsitms)--

Dispatcher30000,單位毫秒。可根據并發查詢情況,增大時間tomcatapache文件路徑:CRN_ROOTwebapps\p2pd\WEB-INF\services\<!-- umnumberofprocessesthatcanberunningatonetime--CPU2個處理。注:該值需要和ReportNetBatchReportService服務中的 processes值匹配。<!--Theminimumnumberofprocessestokeepinmemoryoncethey'restarted--CPU1個處理。注:提高該屬性設置,可以提高服務器在非使用時段的處理能力<!--Theumnumberofnon-affineconnectionsperprocess--CPU4個處理,Windows2個處理。ReportNetBatchReportServiceNumberoflowaffinityconnectionsforthebatchreportservice值匹配。<!--Timeperiodbetweenchecksforidleorexpiredprocesses(inms).Everytimewecheckanidleprocesswebumpitstickcount. Everytimeweuseaprocessthecountisresetto0. Ifthecounteverreachesthevalueofidle_process_max_idle_ticks(below)theprocessis<!--numberofidlecheckticksbeforeanidleprocessiskilled.--10。由于進程的頻繁啟動退出會消耗服務器資源,可根據并發<!-- umtimearequestisqueuedbeforeitgivesup(inms)--<!--4hoursinmsec.0(blockforever)isverydangerous-- <!--Theamountoftimethedispatcherwillwaitforaasyncrequestbeforeitcancelsitms)--

Dispatcher請求等待同步時間,默認值為 tomcatapache主要是與數據庫參數設置,文件路徑:CRN_ROOT\configuration\CQEConfig.xml.sampleCQEConfig.xml<!--Description:Databaseconnectiontimeout.Defaultis900seconds(15minutes)--<entryname="Timeout"<!--Description:Databaseconnectionpoolsize.--<!--umnumberofconnectionsmanagedbythereportserver.Default=20--<entryname="PoolSize"<section<!-- ControlsthequeryReusefeature.Theentrymust mented.--<!--Avalueof0willdisablequeryReuse.--<!--Thedefaultvalueof5meansthat5resultsetsarereused. umissetto10.--<entryname="queryReuse"value="5"<!----5100主要進行緩存和日志參數設置,文件路徑:\cognos\c8\configuration\根據具體環境情況適當提高ReadCacheSize,可減少用戶時服務器的磁盤IO。提高速建議生產環境關閉該日志的,一般默認也是關閉狀態CognosReportNetContentStoreAdministration(Settings(Editentry)ContentStore數據庫連接池的幾項屬性。 有效設置為-1或5到 ContentManager有效設置為-1到 0DbConnectPoolCleanUpPeriod有效設置為-1 01ContentManager默認值:300000(5過了DbConnectPoolIdleTime的設置,以毫秒為單位)。有效設置為-1到 設置0或-1指定無清除線程。默認值:300000(5分鐘)注:參見安裝配置手冊《Cognos?8管理和安全性指南》中的《管理ContentAdministrationCognos8對Cognos8組件的第查詢(本地查詢注:在8.3版本中,該設置在CognosAdministration中的調度程序和服務。參見具體可參照《cognos3章設置日志。Cognos和數據庫間參數在cer*\bin\cogdm**.ini文件中,(*根據版本不同是安 的數字oracle數據庫為例,cogdmor.iniFetchNumberofRows=102000;FetchNumberofRows=20002000條數據。 的數字(SortMemory單位是2kbytes,51202kx5120(SortMemory取空閑內存的十分之一到八分之一大小[PoweryDataServer](WriteCahceSizeKbytes,16384(WriteCacheSizecube大小差不多就可以了2G800M內存[PoweryDataServer]CognosConfiguration點擊ReportNetservice結點下的CognosReportNet服務,刪除CognosReportNet(可根據服務器資源情況分別采用三種不同類型服 ummemoryinMB設置中,將其屬性設置為1408注:如果采用啟動方式,則需要對startup.bat進行修改rem"formachineswith2GB-XX:MaxPermSize=128m選擇適當的服務器機器類型,然后將第二行的’rem’注釋去掉,保存,重新啟動CognosConfigurationCognos8如果我們的服務器配置較高(2G內存Cognos8的內CognosConfiguration。修改下列CognosReportNet服務器的負載能力,同時容錯保護功能可以二、COGNOSReportStuidoGeneratedSQLFilters窗口中進行where子句過濾條件。wherewhereFact字段的出現順序為表進行排序。FrameworkusageIdentifier、Attribute、FactApplicationAfteraggregationBeforeaggregation可以調整過havingBeforeaggregationSQLwhere。SQL語句的復雜度。在查詢資源管理器的數據項(DataItem)對象中有預排序(Pre-Sort)的屬性設置,可以SQLOrderBy的關鍵字。Query中的數據項排序屬性為準。SQLOrderBy關鍵字,排序字段將自動根據數據項的屬性進行設置(如果查ProcessingQueryProcessingSQL的處理設置。CognosReportStudio會度,要盡可能的將報表的處理運算放在數據庫進行,以保證其運行速度。將該屬性設置為Databaseonly會將報表頁面生成的CognosSQL不經報表服務器處理全部轉換為數據庫能夠執SQL的處理。默FrameworkDatasourcequeryProcessing屬性。QueryOuterJoinAllowed屬性中可以為查詢設置是否允許外連接操作。由于外連接查詢,但是在校驗報表時會警告查詢存在外連接;如果將該屬性設置為Deny,則外連接查詢。默認值為Framework中Editernors下的Outerjoins屬性設置。Query的CrossProductAllowed乘積,指查詢中的數據項來自于沒有建立任何關聯關系的查詢。如果將該屬性設置為Allow,則允許向量乘積,查詢結果為查詢間建立乘積的結果;如果將該屬性設置屬性設置為Deny,則向量乘積查詢。默認值為Framework中Editernors下的Cross-Productjoins屬性設置。With在Query的UseSQLWithClause屬性中可以為查詢設置是否使用With子句。部分數據庫例如Oracle支持With關鍵字,當查詢中嵌套子查詢時,可以通過With子句的使用,減輕報表服務器對CognosSQL的處理,從而提升報表的運行性能。如果將該屬性設置為Yes,則允許使用With關鍵字,查詢中生成的NativeSQL將出現With子句;如果將該屬性設置為No,雖然使用With關鍵字默認值為Framework中Edit ernors下的UseWITHclausewhengeneratingSQL屬性設置。QueryUseLocalCache屬性中可以為查詢設置是否使用本地緩存。如果將該屬性設Yessession中,當用戶在瀏覽FrameworkEditernorsAllowusageoflocalcache屬性設置。FrameworkManagerSQLSQLSQLCognosSQL類型。如果需要編寫應用數據庫可SQLSettings頁,選擇SQLType為Native。注:如果查詢中的查詢自另一查詢,則該查詢的SQLSettings屬性設置會繼承原查詢的此項設置。ActionsSpecifyPackageFunctionList…指定報表定制中可以使用的數據Selectedfunctionsets中選到Availablefunctionsets中,避免在報表定制中,錯誤使用數據庫函數。事表之間的關聯,CognosReportNetServer會依照這里的關聯關系自動優化提交給數據庫的SQL語句。如果關聯關系中出現了環狀連接關系,可以通過別名表或是快捷鍵的方式解決環BBDAEditernors查詢性能設ReporttablelimitsSQLTABLE數量,如果超過設定值則提示錯誤,默認0,沒有限制,單位個。DataretrievallimitsSQL0,QueryexecutiontimelimitsSQL0,沒LargetextitemslimitSQL0,沒有限制,單位字。TransformerCube啟用多CPU數據源TransformerDataSource可以看到下方有一個Enablemulti-processing選項,選中它,即可實現在數據時啟用多CPU處理。多CPU處理可以在大型數據源文件時起到很明顯的性能提升對于巨型文本數通過crosstabcaching提高cube速進入:transformer-cube屬性-processing;通過開啟crosstabcaching 提高cube速度。但此方增加一定的cube體積。OLAPSQL中有很多分組和匯總導致數據庫返回數據速度比較慢時,可以嘗試去掉分組和匯總,讓OLAP服務器直接數據,使用OLAP的方式運算,大部分情況下能夠明顯的提高Cube生成速度度對分析人員有多大幫助?提高立方體粒度減小立方體大小可以說是最有效的提高速度cubecognos8cognos8D:\cognos\cer4\bin下trnsfrmr.iniEnablePCOptimizer1cognos8上的表現。在Transformer中,點開File菜單中的Preferences框,切換到Directories頁DataTemporaryFilesModeltemporaryfiles放到兩個物理硬盤上,并且確認這IDE(ATA)IDE控制SCSI 對于放置Datatemporaryfiles的硬盤,要求至少有數據量兩倍的空余磁盤空間,Modeltemporaryfiles的硬盤,要求有(模型大小+立方體大小)x2的空余Transformercerx\bin\trnsfrmr.iniMaxTransactionNum500000,可適當將其提高,比如改CubeCube三、1ORACLE1.1Table的方ORACLE采用兩種表中記錄的方式全表掃描就是順序地表中每條記錄.ORACLE采用一次讀入多個數據塊(database通過ROWID你可以采用基于ROWID的方式情況,提高表的效率,,ROWID包含了表中記錄之間的聯系.通常索引提供了快速ROWID的方法,因此那些基于索引列的查詢就可SQLSQL語句,在第一次解析之后,ORACLESQL語句存放在內存中.這SGA(systemglobalarea)的共享池(sharedbufferpool)中的內存可以被所有的數據庫用戶共享.因此,SQL語句(有時被稱為一個游標)時,如果它和之前的執行過的語句完全相同ORACLE就能很快獲得已經被解析的語句以及最好的執行路徑.ORACLESQL的執行性能并節省了內存的使用.ORACLE只對簡單的表提供高速緩沖(cachebuffering)這個功能并不適用于多init.ora中為這個區域設置合適的參數,當這個內存區域越大,就可以保留ORACLESQL語句,ORACLE會首先在這塊內存中查找相同的語句.這里需要注明的是,ORACLE對兩者采取的是一種嚴格匹配,要達成共享,SQL語句必須SELECT*FROMSELECT*fromEMP;Select*FromEmp; FROM如何Jacksal_limit privatesynonym public publicsynonym privatesynonym publicsynonym tableSQL語句能否在這兩個用戶之間共享selectmax(sal_cap)from每個用戶都有一個synonym-sal_limit,它們是不同selectcount(*)fromwork_citywheresdesc能兩個用戶相同的對象synonym- nt_detailbwherea.city_id=b.city_idjackprivatesynonym訪問nt_detail而jill是表的所有SQL語句中必須使用相同的名字的綁定變量(bindselectpin,namefrompeoplewherepin=:blk1.pin;selectpin,namefrompeoplewherepin=:blk1.pin;selectpin,namefrompeoplewherepin=:blk1.ot_ind;selectpin,namefrompeoplewherepin=EM子句中的表名,M子句中寫在最后的表基礎表drivngtable)將被最先處理.M子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表.E處理多個表時,.首先,掃描第一個表(ROM子句中最后的那個表并對記錄進行派序,然后掃描第二個表(ROM子句中最后第二個表),最后將所有從第二個表中檢索出的記錄與第一個表中合適記錄進行合并. 表TAB116,384條記錄表TAB21 TAB2(最好的方法selectcount(*)fromtab1,tab2 0.96秒TAB2作為基礎表(不佳的方法)selectcount(*)from 26.093個以上的表連接查詢,那就需要選擇交叉表(intersectiontable)作為基礎表,交叉表是指那個被其他表所的表.例如 SELECTFROMLOCATIONLEMPEWHEREE.EMP_NOBETWEEN1000AND2000ANDE.CAT_NO=C.CAT_NO SQLSELECT*FROMEMPE, ANDE.EMP_NOBETWEEN1000ANDWHEREORACLEWHERE子句,根據這個原理,表之間的連接必須寫在其WHERE條件之前,WHERE子句的末尾.例如(低效,156.3秒)SELECT…FROMEMP SAL> JOB= 25<(SELECTCOUNT(*)FROMWHERE(高效,10.6秒)SELECT…FROMEMPWHERE25<(SELECTCOUNT(*)FROMWHERE SAL> JOB=SELECT*當你想在SELECT子句中列出所有的COLUMN時,使用動態SQL列‘*’是一個方便的方法.不幸的是,這是一個非常低效的方法.實際上,ORACLE在解析的過程中,會將’*’依次轉換成所有的列名,這個工作是通過查詢數據字典完成的,這意味著將耗費的時間.7.減少數據庫的次SQL語句時,ORACLE在內部執行了許多工作:SQL語句,率,綁定變量,讀數據塊等等.由此可見,減少數據庫的次數,就能實際上減ORACLE的工作量.03420291的職員1最低效SELECTEMP_NAME,SALARY,GRADEFROMEMPWHEREEMP_NO=SELECTEMP_NAME,SALARY,GRADEFROMEMPWHEREEMP_NO=2次低效CURSORC1(E_NONUMBER)ISFROMEMPWHEREEMP_NO=E_NO;OPENFETCHC1INTO…,..,..OPENC1(291);FETCHC1INTO…,..,..;CLOSEC1;3高效SELECTA.EMP_NAME,A.SALARY,A.GRADE,B.EMP_NAME,B.SALARY,FROMEMPA,EMPBWHEREA.EMP_NO=342 B.EMP_NO=注意SQL*Plus,SQL*FormsPro*CARRAYSIZE參數,可以增加每次數據庫的檢索數據量,200.DECODE函數可以避免重復掃描相同記錄或重復連接相同的表.SELECTCOUNT(*),SUM(SAL)FROMEMPWHEREDEPT_NO=ANDENAMELIKE‘SMITH%’;SELECTCOUNT(*),SUM(SAL)FROMEMPWHEREDEPT_NO=ANDENAME DECODESELECTCOUNT(DECODE(DEPT_NO,0020,’X’,NULL))D0020_COUNT,SUM(DECODE(DEPT_NO,0020,SAL,NULL))D0020_SAL,SUM(DECODE(DEPT_NO,0030,SAL,NULL))D0030_SALFROMEMPWHEREENAMELIKE類似的,DECODEGROUPBYORDERBY子句中HAVING子句HAVING只會在檢索出所有記錄之后才對結果集進行過濾.這個處理需要排序,總計等操作.WHERE子句限制記錄的數目,那就能減少這方面的例如低效FROMLOCATIONGROUPBYHAVINGREGIONREGION!=‘SYDNEY’ANDREGION!=‘PERTH’FROMLOCATIONWHEREREGIONREGION!=‘SYDNEY’ANDREGION!=‘PERTH’GROUPBY(HAVING中的條件一般用于對一些集合函數的比較,COUNT()等等.除此而外,一般的條WHERE子句中)SQL語句中,要特別注意減少對表的查詢.FROMTABLESWHERETAB_NAME=(SELECTFROMTAB_COLUMNSWHEREVERSION=604) DB_VER=(SELECTFROMWHEREVERSION=FROMTABLES =(SELECTFROMTAB_COLUMNSWHEREVERSION=604)FROMHISTORY_TYPET,EMPE,EMP_HISTORYHWHEREH.EMPNO=E.EMPNOANDH.HIST_TYPE=T.HIST_TYPEGROUPBY通過調用下面的函數可以提高效率FUNCTIONLOOKUP_HIST_TYPE(TYPINNUMBER)RETURNVARCHAR2CURSORC1ISSELECTTYPE_DESCFROMHISTORY_TYPEWHEREHIST_TYPE=TYP;OPENFETCHC1INTOTDESC;CLOSEC1;RETURN(NVL(TDESC,’?’));FUNCTIONLOOKUP_EMP(EMPINNUMBER)RETURNVARCHAR2CURSORC1ISSELECTENAMEFROMEMPWHEREOPENFETCHC1INTOENAME;CLOSEC1;RETURN(NVL(ENAME,’?’));SELECTH.EMPNO,LOOKUP_EMP(H.EMPNO),FROMEMP_HISTORYHGROUPBYH.EMPNO,(譯者按:經常在中看到如’能不能用一個SQL寫出….’的貼子,殊不知復雜的SQL往往犧牲了執行效率.能夠掌握上面的運用函數解決問題的方法在實際工作中是非常有意義的)SQL語句中連接多個表時,Column上.這樣一來,就Column歧義引起的語法錯誤.EXISTSEXISTS(NOTEXISTS)通常將提高查詢的效率.低效SELECTFROMEMP基礎表)WHEREEMPNOANDDEPTNOIN(SELECTDEPTNOFROMDEPTWHERELOC=SELECTFROMEMP基礎表)WHEREEMPNOANDEXISTS(SELECT‘X’FROMDEPTANDLOC=‘MELB’)NOTEXISTSNOT在子查詢中,NOTIN子句將執行一個內部的排序和合并.無論在哪種情況下,NOTIN都是最低(因為它對子查詢中的表執行了一個全表遍歷).NOTIN我們可以把它改寫成外連接(OuterJoins)NOTEXISTS.例如SELECT…FROMWHEREDEPT_NONOTIN(SELECT(方法一:高效)SELECT….FROMEMPA,DEPT

FROMWHEREWHEREA.DEPT_NO=B.DEPT(+)ANDB.DEPT_NOISNULLANDB.DEPT_CAT(+)=(方法二:最高效)SELECT….FROMEMPWHERENOTEXISTS(SELECTFROMDEPTWHERED.DEPT_NO=E.DEPT_NOANDDEPT_CAT=‘A’);,EXISTSSELECTENAMEFROMEMPEWHEREEXISTS(SELECTFROMWHEREDEPT_NO=E.DEPT_NOANDDEPT_CAT=‘A’);SELECTENAMEFROMDEPTD,EMPEWHEREE.DEPT_NO=D.DEPT_NOANDDEPT_CAT=‘A’;EXISTS當提交一個包含一對多表信息(比如部門表和雇員表)的查詢時,避免在SELECTDISTINCT.EXIST替換低效SELECTDISTINCTDEPT_NO,DEPT_NAMEFROMDEPTD,EMPEWHERED.DEPT_NO=高效SELECTFROMDEPTWHEREEXISTS(SELECTFROMEMPWHEREE.DEPT_NO=EXISTS使查詢更為迅速,因為RDBMS模塊將在子查詢的條件一旦滿足后,立刻返回結SQLSELECTEXECUTIONS,DISK_READS,BUFFER_GETS,ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2)Hit_radio,ROUND(DISK_READS/EXECUTIONS,2)Reads_per_run, BUFFER_GETS>0AND(BUFFER_GETS-DISK_READS)/BUFFER_GETS<0.8ORDERBY4DESC; N分析SQL語EXINNSQL語句的工具,SQL的情況下分析語句.通過分析,ORACLE是怎么樣連接表,使用什么方式掃描表(索引掃描你需要按照從里到外,從上到下的次序解讀分析的結果.EXINN分析的結果是用縮進的格式排列的,最內部的操作將被最先解讀,如果兩個操作處于同一層中,帶有最小操作號的NESTEDLOOP是少數不按照上述規則處理的操作,NESTED通過實踐,SQLPLUSSETTRACE功能比較方便.SQL>SELECTFROMdept,3*WHEREemp.deptno=SQL>setautotracetraceonly*traceonly可以不顯示執行結果*/SQL>/14rowsselected.Executionn NESTED TABLEACCESS(FULL)OF TABLEACCESS(BYINDEXROWID)OF INDEX(UNIQUESCAN)OF'PK_DEPT' recursive dbblock consistent physical redo bytessentviaSQL*Net bytesreceivedviaSQL*Net SQL*Netroundtrips sorts sorts rows通過以上分析,可以得出實際的執行步驟是TABLEACCESS(FULL)OFINDEX(UNIQUESCAN)OF'PK_DEPT'TABLEACCESS(BYINDEXROWID)OFNESTEDLOOPS(JOINING1AND注:目前許多第的工具如TOAD和ORACLE本身提供的工具如OMS的SQLyze都EXINN工具.也許喜歡圖形化界面的朋友們可以選用它們.索引是表的一個概念部分,用來提高檢索數據的效率.實際上,ORACLE使用了一個復雜的自平B-tree結構通常,通過索引查詢數據比全表掃描要快.ORACLEUpdate語句的最佳路徑時ORACLE優化器將使用索引.同樣在聯結多個表時使用索引也可以提高效率.另一個使用索引的好處是,它提供了主鍵(primarykey)的唯一性驗證.LONGLONGRAW數據類型,你可以索引幾乎所有的列.通常,在大型表中使用索引特別有效.當然,你也會發現,在掃描小表時,使用索引同樣能提高效率.雖然使用索引能得到查詢效率的提高,但是我們也必須注意到它的代價.索引需要空間來,也需要定期,每當有記錄在表中增減或索引列被修改時,索引本身也會被修改.這INSERTDELETE,UPDATE4,5I/O.因為索引需要額外的空間和處理,那些不必要的索引反而會使查詢反應時間變慢.譯者按定期的重構索引是有必要的ALTERINDEX<INDEXNAME>REBUILDORACLE對索引有兩種模式INDEXUNIQUE大多數情況下,優化器通過WHERE子句例如LODGING:LODGINGLODGING_PKMANAGERSELECTFROMWHERELODGING=‘ROSE,上述SQL將被分成兩步執行,LODGING_PK索引將通過索引唯一掃描的方式被,獲得相對應的ROWID,通過ROWID表的方式執行下一步檢索.INDEX列中,ORACLE將不執行第二步的處理(通過ROWID訪問表).因為檢索數據保存在索引中,單單索引就可以完全滿足查詢結果.SQLINDEXUNIQUESCAN操作SELECTLODGING WHERELODGING=‘ROSE索引范圍查詢(INDEXRANGESELECTLODGING WHERELODGINGLIKEWHERE子句條件包括一系列值,ORACLELODGING_PK.由于索引范圍查詢將返回一組值,它的效率就要比索引唯一掃描SELECTLODGING WHEREMANAGER=‘BILLROWID)和下一步同過ROWID表得到LODGING列的值.由于LODGING$MANAGERSQLLODGING列,LODGING$MANAGER索引中,所以在索引范圍查詢后會執行一個通過ROWID表的操作.WHERE子句中,如果索引列所對應的值的第一個字符由通配符(WILDCARD)開始,索引將SELECTLODGING WHEREMANAGERLIKE在這種情況下,ORACLE將使用全表掃描基礎表(DrivingTable)是指被最先的表(通常以全表掃描的方式被).根據優化器的不同,SQL語句中基礎表的選擇是不一樣的.CBOCOSTBASEDOPTIMIZER),SQL語句中的每個表的物理RBO(RULEBASEDOPTIMIZER),并且所有的連接條件都有索引對應,在這種情況下,FROM子句中列在最后的那個表.舉例SELECTA.NAME,B.MANAGER WORKERA,LODGING A.LODGING=由于LODGING表的LODING列上有一個索引,而且WORKER表中沒有相比較的索引,WORKER表將被作為查詢中的基礎表.SQL語句的執行路徑可以使用分布在多個表上的多個索引時,ORACLE引并在運行時對它們的記錄進行合并,檢索出僅對全部索引有效的記錄ORACLE選擇執行路徑時,唯一性索引的等級高于非唯一性索引.當WHERE子句中索引列和常量比較才有效.如果索引列和其他表的索引類相比較.這句如果不同表中兩個想同等級的索引將被,FROM子句中表的順序將決定哪個會被率先使用.FROM子句中最后的表的索引將有最高的優先級.如果相同表中兩個想同等級的索引將被,WHERE子句中最先被的索引將有最高的優舉例DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.SELECTENAME,FROMWHEREDEPT_NO=20ANDEMP_CAT=‘A’;這里,DEPTNO索引將被最先檢索,EMP_CAT索引檢索出的記錄進行合并.執行路徑如TABLEACCESSBYROWIDONEMPINDEXRANGESCANONDEPT_IDXINDEXRANGESCANONCAT_IDXWHERE子句中有索引列ORACLE不能合并它們,ORACLE將用范圍比較.DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.SELECTENAMEFROMWHEREDEPTNO>20ANDEMP_CAT=‘A’;EMP_CAT索引被用到,DEPTNO條件進行比較.執TABLEACCESSBYROWIDONEMPINDEXRANGESCANONCAT_IDX如果兩個或以上索引具有相同的等級,ORACLE優化器使用其中的一個(它,檢索出的記錄數量少舉例SELECTENAMEFROMEMPWHEREEMPNO=ANDDEPTNO+0=10 /*DEPTNO上的索引將失效*/ANDEMP_TYPE||A’/*EMP_TYPE上的索引將失效*/這是一種相當直接的提高查詢效率的辦法.但是你必須謹慎考慮這種策略,一般來說,只有在你SQL時才能采用它.這里有一個例子關于何時采用這種策略EMPEMP_TYPEEMP_CLASS上沒有索引.SELECTENAMEFROMWHEREEMP_TYPE=‘A’ANDEMP_CLASS=‘X’;優化器會注意到EMP_TYPE上的索引并使用它.這是目前唯一的選擇.如果,一段時間以后,EMP_CLASS上,優化器必須對兩個索引進行選擇,在通常情況下,優化器將使用兩個索引并在他們的結果集合上執行排序及合并.然而如果其中一個索引(EMP_TYPE)接近于唯一性而另一個索引(EMP_CLASS)上有幾千個重復的值.排序及合并就會成為一種不必要的負擔.在這種情況下,你希望使優化器掉EMP_CLASS索引.SELECTENAMEFROMWHEREEMP_TYPE=‘A’ANDEMP_CLASS||’’=WHERE子句中,如果索引列是函數的一部分.優化器將不使用索引而使用全表掃描.SELECT…FROMDEPTWHERESAL*12>高效SELECT…FROMDEPTWHERE >在這種情況下,ORACLE將使用唯一性索引而完全忽略非唯一性索引.舉例SELECTENAMEFROMEMPWHEREEMPNO=2326ANDDEPTNO =20;EMPNOEMPNOTABLEACCESSBYROWIDONINDEXUNIQUESCANON 我們要避免在索引列上使用NOT,NOT會產生在和在索引列上使用函數相同的影響.當ORACLE”遇到”NOT,他就會停止使用索引轉而執行全表掃描.舉例低效這里,不使用索引)SELECT…FROMWHEREDEPT_CODENOT=高效這里,使用了索引)SELECT…FROMWHEREDEPT_CODE>需要注意的是,在某些時候,ORACLE優化器會自動將NOT轉化成相對應的關系操作符.NOT> NOT>=to<NOT<to>=NOT<=toDEPTNO上有一個索引,SELECT*FROMEMPWHEREDEPTNO低效SELECT*FROMEMPWHEREDEPTNO兩者的區別在于,DBMSDEPT4的記錄而后者將首先定DEPTNO=3DEPT3的記錄.UNIONOR適用于索引列通常情況下,UNIONWHEREOR將會起到較好的效果.OR將造成全表掃描.注意,以上規則只針對多個索引列有效.如果有column沒有被索引,查詢效OR而降低.在下面的例子中LOC_IDREGION上都建有索引.SELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHERELOC_ID=10SELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHEREREGION=低效SELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHERELOC_ID=10ORREGION=OR,那就需要返回記錄最少的索引列寫在最前面注意WHEREKEY1=10 ORKEY2= (返回最多記錄ORACLEWHEREKEY1=10((NOTKEY1=10)ANDKEY2=譯者按下面的測試數據參考:(a=1003返回一條記錄,b=1返回1003條記錄)SQL>select*fromunionvsor/*1sttest*/ wherea=1003orb=1003rowsselected. TABLEACCESS(BYINDEXROWID)OF INDEX(RANGESCAN)OF'UB'(NON- TABLEACCESS(BYINDEXROWID)OF INDEX(RANGESCAN)OF'UA'(NON- recursive dbblock consistent physical redo bytessentviaSQL*Netto bytesreceivedviaSQL*Netfrom SQL*Netroundtripsto/from sorts sorts rowsSQL>select*fromunionvsor/*2nd whereb =1ora=1003;1003rowsselected.Execution TABLEACCESS(BYINDEXROWID)OF INDEX(RANGESCAN)OF'UA'(NON- TABLEACCESS(BYINDEXROWID)OF INDEX(RANGESCAN)OF'UB'(NON- recursive dbblock consistent physical redo bytessentviaSQL*Net bytesreceivedviaSQL*Net SQL*Netroundtrips sorts sorts rowsSQL>select*fromunionvsor/*3rdwherea=select*fromwhereb=1003rowsselected.Executionn TABLEACCESS(BYINDEXROWID)OF INDEX(RANGESCAN)OF'UA'(NON- TABLEACCESS(BYINDEXROWID)OF INDEX(RANGESCAN)OF'UB'(NON- recursive dbblock consistent physical redo bytessentviaSQL*Netto bytesreceivedviaSQL*Netfrom SQL*Netroundtripsto/from sorts sorts rowsUNIONconsistentgetsSQL*NETIN下面的查詢可以被更有效率的語句替換低效FROMLOCATIONWHERELOC_ID=10 LOC_ID= LOC_ID=FROMWHERELOC_ININISNULLISNOT包含空值,索引中將不存在此記錄對于復合索引,如果每個列都為空,索引中同樣不存在此記錄.如果至少有一個列不為空,則記錄存在于索引中.舉例AB列上,A,B值為(123,null),ORACLEA,B值(123,null)的記錄(插入).所有的索引列都為空,ORACLE將認為整個鍵值為空而空不等于空.條具有相同鍵值的記錄,當然它們都是空因為空值不存在于索引列中,所以WHERE低效索引失效)SELECT…FROMWHEREDEPT_CODEISNOT高效索引有效SELECTFROMDEPARTMENTWHEREDEPT_CODE>=0;如果索引是建

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論