【正文】
的主要應(yīng)用,支持復(fù)雜的分析操作,側(cè)重決策支持,并且提供直觀易懂的查詢結(jié)果。所以,這樣的系統(tǒng)中,考核的標(biāo)準(zhǔn)往往決定于磁盤子系統(tǒng)的吞吐量。 位圖索引在我前幾篇文章中有交代,如果用在oltp環(huán)境中,可能因?yàn)樽枞秶?,很容易阻塞與死鎖,但是,在olap環(huán)境中,可能會(huì)因?yàn)槠涮赜械奶匦裕岣遫lap的查詢速度。下面的查詢就不會(huì)使用索引: select * from staff where trunc(birthdate) = 39?!∵M(jìn)一步設(shè)置為了進(jìn)一步優(yōu)化,oracle建議對(duì)小表不要建索引,那什么為小表呢,oracle一次I/O就可讀寫完整個(gè)表的表為小表,查看oracle10g一次讀寫的數(shù)據(jù)量SQL show parameter db_file_multiblock_read_count NAME TYPE VALUE db_file_multiblock_read_count integer 128可見當(dāng)表小于128k時(shí)就不要建索引了二、各種索引使用場(chǎng)合及建議B*Tree的衍生產(chǎn)物,應(yīng)用于查詢語句條件列上包含函數(shù)的情況,索引中儲(chǔ)存了經(jīng)過函數(shù)計(jì)算的索引碼值。經(jīng)常一起使用多個(gè)字段檢索記錄,組合索引比單索引更有效;。估計(jì)索引的大小和合理地設(shè)置存儲(chǔ)參數(shù),默認(rèn)為表空間大小,或initial與next設(shè)置成一樣大。1maxextentsidx_bitmidx_1。分區(qū)數(shù)量與基礎(chǔ)表相同;。createthanpartitionpartitiontable基于成本,以最快的速度返回記錄,會(huì)造成總體查詢速度的下降或消耗更多的資源,傾向索引掃描,適合OLTP系統(tǒng)all_rows模式。tg_cdr01*在索引中使用distinct子句。first_rows。等連接where(in適合于大表和小表連接;。from=andLoop才能有效地利用到該索引。如將字符型數(shù)據(jù)與數(shù)值型數(shù)據(jù)比較,ORACLE會(huì)自動(dòng)將字符型用to_number()函數(shù)進(jìn)行轉(zhuǎn)換,從而導(dǎo)致上一種現(xiàn)象的發(fā)生。我們假設(shè)典型情況,有表emp,共有一百萬行數(shù)據(jù),數(shù)據(jù)只有4種不同的值,如40?! 癝ELECTwhere已用時(shí)間: 00: 00: 00:39:08 SQLSQL set feedback onSQL set colsep |SQL set pagesize 10SQL set serveroutput onSQL set heading onSQL set timing onSQL set time on00:54:11 SQL SELECT FILE, STATUS, ENABLED FROM V$DATAFILE。START WITH子句為可選項(xiàng),用來標(biāo)識(shí)哪個(gè)節(jié)點(diǎn)作為查找樹型結(jié)構(gòu)的根節(jié)點(diǎn)。)。439。 varchar2(100),NAME VARCHAR2(100))。 2B注意:邏輯IO只有邏輯讀,沒有邏輯寫。 物理讀就是從磁盤讀取的頁數(shù)。如果數(shù)據(jù)塊上的SCN小于等于進(jìn)程本身的SCN,則直接讀取數(shù)據(jù)塊上的數(shù)據(jù);如果數(shù)據(jù)塊上的SCN大于進(jìn)程本身的SCN,則會(huì)從回滾段中找出修改前的數(shù)據(jù)塊讀取數(shù)據(jù)。如果內(nèi)存中存在相應(yīng)的讀取數(shù)據(jù),那么直接從內(nèi)存中讀取,邏輯讀的次數(shù)加1,如果不存在,則從磁盤上讀到內(nèi)存中,再從內(nèi)存中讀取,邏輯度次數(shù)加1,物理讀次數(shù)也加1。 WHERE transaction_type = 39。2008060139。 1A)。,39。,39。CONNECT BY {PRIOR列名1=列名2|列名1=PRIOR裂名2}[START WITH];其中:CONNECT BY子句說明每行數(shù)據(jù)將是按層次順序檢索,并規(guī)定將表中的數(shù)據(jù)連入樹型結(jié)構(gòu)的關(guān)系中。下面,列舉了幾個(gè)常用的set ,和他們的應(yīng)用。數(shù)值型:在索引字段上加0,例如selectORACLE掌握了充分反映實(shí)際的統(tǒng)計(jì)數(shù)據(jù),才有可能做出正確的選擇。索引列是否函數(shù)的參數(shù)。Join(HJ)和Nested改為:selectexists語句。使用use_nl。parallel。e。創(chuàng)建索引時(shí)。單個(gè)查詢并行化select訪問索引中所有數(shù)據(jù)塊,結(jié)果相當(dāng)于全表掃描,可以用索引掃描代替全表掃描,例如:Selectfirst_rowscustomer drop對(duì)于分區(qū)索引:alter(‘0106’)partition1FreeListindexdept_unique_idx創(chuàng)建位圖索引。tablespace_namepctfreerebuild重建索引,則不必刪除索引。列中的值相對(duì)比較唯一;。90019839。如果被索引的列中有很多null,就不會(huì)使用這個(gè)索引(除非索引是一個(gè)位圖索引,關(guān)于位圖索引,會(huì)在以后的blog文章里做詳細(xì)解釋)。 并行技術(shù)也是如此,一般是在大型任務(wù)的時(shí)候才使用,好比說,實(shí)際生活中,一個(gè)比較大型的工作,如翻譯一本書,你可以先安排多個(gè)人,每個(gè)人翻譯不同的章節(jié),這樣是可以提高翻譯速度,但是,你現(xiàn)在只是翻譯一頁,你也去分配不同的人翻譯不同的行,再組合起來,這個(gè)時(shí)間,你一個(gè)人或者早就翻譯完了。如分區(qū)技術(shù)可以使得一些大表的掃描變得很快(只掃描單個(gè)分區(qū)),而且方便管理。 同以上道理,物理讀乘以執(zhí)行次數(shù),則決定了存儲(chǔ)子系統(tǒng)的處理能力,在一個(gè)OLTP環(huán)境中,物理讀一般都是db file sequential read決定的,也就是單塊讀,一個(gè)典型的OLTP系統(tǒng),db file sequential read應(yīng)當(dāng)基本等于磁盤子系統(tǒng)的讀的IOPS。 OLTP系統(tǒng)最容易出現(xiàn)的瓶頸就是CPU與磁盤子系統(tǒng)。OLAP(聯(lián)機(jī)分析處理系統(tǒng))聯(lián)機(jī)分析處理 (OLAP) ,他同時(shí)提出了關(guān)于OLAP的12條準(zhǔn)則。這樣做的最大優(yōu)點(diǎn)是可以即時(shí)地處理輸入的數(shù)據(jù),及時(shí)地回答。 在ebay的數(shù)據(jù)庫設(shè)計(jì)中,有一個(gè)很重要的點(diǎn)就是,數(shù)據(jù)庫只負(fù)責(zé)存放數(shù)據(jù),業(yè)務(wù)邏輯盡量在業(yè)務(wù)層實(shí)現(xiàn),因?yàn)閿?shù)據(jù)庫擴(kuò)展是困難的,而應(yīng)用服務(wù)器擴(kuò)展是簡(jiǎn)單的。 select * from dept shere staff_num 1000 or dept_id 1000。 select * from dept where dept_id = 900198。在用SQL*Loader或import工具插入或裝載數(shù)據(jù)后,建立索引比較有效;索引正確的表和列。重建索引之前必須先刪除索引,若用alterindex_name(UPPER(ename))index語句來創(chuàng)建唯一索引,例:createprimary(MaxExtentsvlauesidx_name語句:drop任何索引都可以基于成本的優(yōu)化器??偤雎訡BO和統(tǒng)計(jì)信息而基于規(guī)則choose模式。調(diào)整SQL表訪問全表掃描。degree子句。*index_ffs(索引快速完全掃描)。=(+)。半連接查詢中使用exists,含義:即使在子查詢中返回多條重復(fù)的記錄,外部查詢也只返回一條記錄。調(diào)整notwhereORACLE的共有Sort由于系統(tǒng)數(shù)據(jù)字典表都未被分析過,可能導(dǎo)致極差的“執(zhí)行計(jì)劃”。all并行查詢將不會(huì)用到索引。=whereEMPLOYEES39。 DEFAULT 0)。339。12139。 levelA E ), transaction_date))*/在Buffer Cache中的數(shù)據(jù)塊上都會(huì)有最后一次修改數(shù)據(jù)塊時(shí)的SCN。 當(dāng)預(yù)讀的頁數(shù)提供的數(shù)據(jù)不能滿足查詢的結(jié)果時(shí),SQLServer就要發(fā)生物理讀,直接從磁盤再讀取數(shù)據(jù)頁。即時(shí)讀通常發(fā)生在對(duì)數(shù)據(jù)進(jìn)行修改、刪除操作時(shí)。 WHERE invoice_status_code 39。 source_doc_unit_of_measure, Fconnect by prior name=idorder by idid,39。,39。創(chuàng)建示例表:CREATE TABLE TBL_TEST(ID)。v_emp_no。IND_COL1)*/。對(duì)數(shù)據(jù)經(jīng)常有增、刪、改的表最好定期對(duì)表和索引進(jìn)行分析,可用SQL語句“analyze。null。dept_no排序合并連接不使用索引。exists中,是指在查詢中找到的任何記錄都不包含在結(jié)果集中的子查詢;不建議使用notsoft,use_merge。hint分區(qū)表效果明顯優(yōu)化SQL語句排序排序的操作:。serv_id。fromstatisticsfile要?jiǎng)h除索引的原因。vlauesonIndexindex字句,為與unique和primary(classno)創(chuàng)建基于函數(shù)的索引。對(duì)大表創(chuàng)建索引可以使用nologging來減少重做日志;。限制每個(gè)表索引的數(shù)量。需要讀入的數(shù)據(jù)塊越多,則 cost 越大,Oracle 也就越有可能不選擇使用 index select * from sta