亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Oracle索引在數(shù)據(jù)查詢中的應(yīng)用

        2017-12-31 23:53:29夏忠球俞國(guó)紅
        無線互聯(lián)科技 2017年20期
        關(guān)鍵詞:排序數(shù)據(jù)庫(kù)優(yōu)化

        夏忠球,俞國(guó)紅

        (蘇州健雄職業(yè)技術(shù)學(xué)院,江蘇 蘇州 215411)

        Oracle索引在數(shù)據(jù)查詢中的應(yīng)用

        夏忠球,俞國(guó)紅

        (蘇州健雄職業(yè)技術(shù)學(xué)院,江蘇 蘇州 215411)

        文章以O(shè)racle數(shù)據(jù)庫(kù)生產(chǎn)實(shí)踐中的數(shù)據(jù)掃描為主要研究?jī)?nèi)容,結(jié)合索引技術(shù)等相關(guān)知識(shí),提出了合理使用索引技術(shù),避免執(zhí)行全表掃描的設(shè)計(jì)總體思路,通過實(shí)際的需求分析,介紹了基于索引的SQL語(yǔ)句優(yōu)化方法,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的高效查詢。

        索引;索引掃描;Oracle

        隨著大數(shù)據(jù)的廣泛應(yīng)用,數(shù)據(jù)高效查詢已經(jīng)在生產(chǎn)實(shí)踐中成為新的研究熱點(diǎn)。數(shù)據(jù)量大的時(shí)候,常出現(xiàn)軟件性能的問題,需要反復(fù)修改結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language,SQL)語(yǔ)句,調(diào)試性能以達(dá)到最優(yōu)。利用數(shù)據(jù)索引技術(shù),正確使用數(shù)據(jù)庫(kù)的索引,解決海量數(shù)據(jù)查詢處理難的問題,不僅可實(shí)現(xiàn)高效的查詢,而且提高磁盤IO的讀寫效率。

        1 Oracle數(shù)據(jù)掃描技術(shù)

        1.1 索引概述

        索引是數(shù)據(jù)庫(kù)中的對(duì)象,類似書的目錄結(jié)構(gòu),Oracle的索引創(chuàng)建在數(shù)據(jù)表的列。索引作為一種獨(dú)立的數(shù)據(jù)結(jié)構(gòu),需要占用存儲(chǔ)空間。索引最大的作用是加快查詢速度,其直接指向包含所查詢值的行的位置,并存儲(chǔ)了表中某一列的所有值。一個(gè)索引是基于數(shù)據(jù)表中的某一列而創(chuàng)建的,并且這列是排過序的。索引使用的數(shù)據(jù)結(jié)構(gòu)有兩種:MsSQL使用的是B+Tree結(jié)構(gòu),而Oracle及Sysbase使用的是B-Tree結(jié)構(gòu)。

        索引使用默認(rèn)的鍵值排序來取代全表掃描,提高查詢效率。那什么是全表掃描呢?全表掃描就是獲取表中所有數(shù)據(jù)塊,再根據(jù)條件進(jìn)行過濾。在數(shù)據(jù)庫(kù)中,對(duì)沒有索引的表進(jìn)行查詢,搜尋表中每一條記錄,直到找到所有符合給定條件的記錄的過程,稱為全表掃描。

        1.2 數(shù)據(jù)庫(kù)索引的工作原理

        Oracle使用ROWID列來建立內(nèi)部索引。那什么是ROWID呢?ROWID為數(shù)據(jù)表中行的唯一標(biāo)識(shí),是一個(gè)偽列,可以用在SELECT中,但不可以用INSERT,UPDATE來修改該值。每個(gè)表Oracle都存在一個(gè)偽列ROWID,這個(gè)偽列可以用SELECT查看,但是不可以用INSERT和UPDATE,DELETE命令來修改刪除操作。

        數(shù)據(jù)庫(kù)執(zhí)行查詢時(shí),首先會(huì)檢查表中的列有沒有創(chuàng)建索引,如果該列有索引,數(shù)據(jù)庫(kù)還要判斷是否應(yīng)該使用索引檢索要查找的值。

        查詢數(shù)據(jù)庫(kù)的結(jié)果集時(shí),當(dāng)讀取的數(shù)據(jù)比重大,占表數(shù)據(jù)20%~70%時(shí),最好使用全掃描。一般超過10%的數(shù)據(jù)要讀取就會(huì)選擇全表掃描。

        訪問數(shù)據(jù)有兩種基本的數(shù)據(jù)訪問途徑:全表掃描和索引掃描。索引掃描每次有IO操作,一次是對(duì)索引塊,一次是對(duì)數(shù)據(jù)塊。

        1.3 數(shù)據(jù)庫(kù)索引使用的場(chǎng)合

        是否使用索引,由Oracle優(yōu)化器決定。Oracle的優(yōu)化器有3種:RULE(基于規(guī)則)優(yōu)化器、COST(基于成本)優(yōu)化器、CHOOSE(選擇性)優(yōu)化器。缺省情況下,Oracle采用CHOOSE優(yōu)化器,因?yàn)樵搩?yōu)化器默認(rèn)選擇的是全表掃描,所以應(yīng)該盡量避免使用CHOOSE優(yōu)化器,而直接采用基于規(guī)則或者基于成本的優(yōu)化器。

        1.4 索引的種類

        根據(jù)數(shù)據(jù)存儲(chǔ)方式的類型,可分為B-Tree索引、反向索引、位圖索引3類。

        根據(jù)創(chuàng)建索引所在列的數(shù)量,可分為單列索引和組合索引,組合索引又稱為復(fù)合索引。單列索引:基于單個(gè)列創(chuàng)建的B-Tree索引,是Oracle默認(rèn)的索引類型。復(fù)合索引:基于兩列或多列創(chuàng)建的索引,就是復(fù)合索引。復(fù)合索引引導(dǎo)列的選擇:(1)前綴性,條件中最常使用到的字段作引導(dǎo)列;(2)選擇性,選擇性高的字段作引導(dǎo)列。

        2 Oracle組合索引的創(chuàng)建

        建立組合索引需要遵循的原則:(1)引導(dǎo)列要選擇過濾條件的列作為引導(dǎo)列,比如where c.yyy='yyy'或者c.yyy〉或者c.yyy〈。引導(dǎo)列的選擇性越高越好,因?yàn)檫x擇性越高,掃描的leaf block就越少,效率就越高。(2)盡量把join列放到組合索引最后面,排序時(shí)應(yīng)按照組合索引中各列的順序進(jìn)行排序,即使索引中只有一個(gè)列時(shí)也要排序。

        3 Oracle掃描的優(yōu)化

        3.1 使用索引掃描

        索引掃描,因?yàn)橛辛怂饕@個(gè)有序的數(shù)據(jù)結(jié)構(gòu)作支持,只訪問需要的索引塊和數(shù)據(jù)塊,而不是訪問整張表,所以會(huì)比全表掃描的效率高。

        例如,select count(*)from table1,主鍵索引掃描,要優(yōu)于全表掃描。因?yàn)橹麈I索引中,已經(jīng)包含所有記錄的主鍵。

        下列3種情況,會(huì)使用索引掃描。

        (1)沒有謂語(yǔ),但select列表中,其中一列有索引。

        (2)謂語(yǔ)中包含一個(gè)位于索引中非引導(dǎo)列中的條件。

        (3)數(shù)據(jù)可以通過一個(gè)排過序的索引來獲取并且會(huì)省略單獨(dú)的排序步驟。

        3.2 使用全表掃描

        試想,對(duì)一張擁有百萬(wàn)級(jí)數(shù)據(jù)的表進(jìn)行全表掃描,其掃描的性能會(huì)非常差。那么哪些情況適合使用全表掃描呢?下列3種情況,會(huì)使用全表掃描。

        (1)表包含的數(shù)據(jù)行很小,使用索引占用的存儲(chǔ)空間比表占用的空間反而還要大。

        (2)訪問的數(shù)據(jù)占全表數(shù)據(jù)的百分比大(一般超過70%),通過索引訪問的總成本大于全表掃描的成本。

        (3)表包含的數(shù)據(jù)未進(jìn)行排序。

        3.3 會(huì)引起全表掃描的幾種SQL查詢語(yǔ)句

        3.3.1 SQL中使用了模糊查詢

        原因:like由于是模糊查詢,效率比較低,查詢條件應(yīng)該盡量避免使用like;對(duì)于全模糊查找,形如like‘%...%’,是無法使用索引的。另外,由于匹配算法的關(guān)系,模糊查詢的字段長(zhǎng)度越大,模糊查詢效率越低。

        解決辦法:首先盡量避免模糊查詢,如果因?yàn)闃I(yè)務(wù)需要一定要使用模糊查詢,則至少保證不要使用全模糊查詢,對(duì)于右模糊查詢,即like‘…%’,是會(huì)使用索引的;左模糊like‘%...’無法直接使用索引,但可以變化成like‘…%’,則可使用索引。

        3.3.2 SQL中使用了空值判斷

        原因:在數(shù)據(jù)庫(kù)中,如果不知道某行記錄的某列具體數(shù)據(jù),通常會(huì)使用NULL來表示,NULL是空值的含義。查詢條件中含有is null的select語(yǔ)句執(zhí)行慢,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)引擎放棄使用索引而進(jìn)行全表掃描。

        解決方法:可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:select id from t where num=0。

        3.3.3 SQL中使用了不等于操作符

        原因:SQL中,不等于操作符會(huì)限制索引,引發(fā)全表掃描。在索引使用過程中,被索引的表數(shù)據(jù)存儲(chǔ)在索引的葉結(jié)點(diǎn)中,索引只能查找索引中存在的數(shù)據(jù)。如果where條件中引用了不等于運(yùn)算符(〈〉,!=),即使比較的字段上有索引,索引也無法發(fā)揮作用。

        解決方法:把不等于操作符改成or,可以使用索引,避免全表掃描。例如,把columnA〈〉’bbb’,改寫成columnA〈’bbb’or columnA〉’bbb’,就可以使用索引了。

        3.3.4 or語(yǔ)句使用不當(dāng)

        or語(yǔ)句使用不當(dāng)會(huì)引起全表掃描。原因:where子句中比較的兩個(gè)條件,一個(gè)條件有索引,另外一個(gè)條件沒索引,使用or連接兩個(gè)條件則會(huì)引起全表掃描。

        4 Oracle索引使用的注意點(diǎn)

        4.1 預(yù)防索引陷阱

        一張表中如果有上百萬(wàn)條數(shù)據(jù),對(duì)某個(gè)字段加了索引,但是查詢性能并沒有提高,可能就是Oracle索引失效造成的。Oracle索引的目標(biāo)是避免全表掃描,提高查詢效率,但有些時(shí)候卻適得其反,SQL優(yōu)化會(huì)觸發(fā)索引陷阱,造成索引失效。

        在Oracle創(chuàng)建索引的實(shí)際操作中會(huì)出現(xiàn)的限制條件,如果在數(shù)據(jù)查詢中違反了索引限制條件,那么添加的索引不會(huì)執(zhí)行,Oracle仍然會(huì)自動(dòng)選擇執(zhí)行全表掃描,反而可能由于數(shù)據(jù)庫(kù)維護(hù)索引的系統(tǒng)開銷造成查詢性能更差。

        4.2 索引創(chuàng)建策略

        索引創(chuàng)建策略主要包含5條建議:對(duì)于取值范圍很小的字段(比如性別字段)應(yīng)當(dāng)建立位圖索引;為索引設(shè)置合適的PCTFREE值,即指定數(shù)據(jù)塊中必需保留的最小空間的比例;存儲(chǔ)索引的表空間最好單獨(dú)設(shè)定導(dǎo)入數(shù)據(jù)后再創(chuàng)建索引;不需要為很小的表創(chuàng)建索引;限制表中的索引的數(shù)目。

        [1]鄧小培,孫洪濤.Oracle的索引[J].科技信息,2010(13):66.

        [2]李素奇.關(guān)于SQL索引建立規(guī)則與優(yōu)化的探討[J].科技展望,2014(19):1-2.

        [3]曾明霏,劉強(qiáng).基于SQL和表設(shè)計(jì)的Oracle數(shù)據(jù)庫(kù)開發(fā)審計(jì)研究[J].軟件導(dǎo)刊,2016(12):136-138.

        [4]杭聰,黃連月,黃鑫.數(shù)據(jù)庫(kù)SQL審查與性能優(yōu)化技術(shù)研究與應(yīng)用[J].電力信息與通信技術(shù),2016(4):146-153.

        [5]李永亮.Oracle數(shù)據(jù)庫(kù)中數(shù)據(jù)訪問優(yōu)化方法[J].科技視界,2015(15):66.

        Application of Oracle index in data query

        Xia Zhongqiu, Yu Guohong
        (Suzhou Chien-shiung Institute of Technology, Suzhou 215411, China)

        Taking the data scanning of Oracle database in the practical production as the main research content, combining with the index technology and other related knowledge, this paper puts forward the rational use of indexing technology to avoid the overall design idea of performing full table scans, through the actual demand analysis, introduces the SQL statement optimization method based on index to realize the efficient query of database.

        index; index scan; Oracle

        2015年江蘇省現(xiàn)代教育技術(shù)課題;項(xiàng)目名稱:高職移動(dòng)交互式數(shù)字教材的開發(fā)與應(yīng)用研究;項(xiàng)目編號(hào):2015-R-26864。

        夏忠球(1964— ),男,江蘇太倉(cāng)人,工程師,學(xué)士;研究方向:網(wǎng)絡(luò)安全,數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用。

        猜你喜歡
        排序數(shù)據(jù)庫(kù)優(yōu)化
        超限高層建筑結(jié)構(gòu)設(shè)計(jì)與優(yōu)化思考
        排序不等式
        民用建筑防煙排煙設(shè)計(jì)優(yōu)化探討
        關(guān)于優(yōu)化消防安全告知承諾的一些思考
        一道優(yōu)化題的幾何解法
        恐怖排序
        節(jié)日排序
        刻舟求劍
        兒童繪本(2018年5期)2018-04-12 16:45:32
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        色哟哟亚洲色精一区二区| 日韩女人毛片在线播放| 亚洲不卡av不卡一区二区| 日韩精品国产精品亚洲毛片| 97久久婷婷五月综合色d啪蜜芽| 日躁夜躁狠狠躁2001| 國产AV天堂| 在线精品亚洲一区二区三区| 成人性生交大片免费入口| 日日婷婷夜日日天干| 欧美精品中文| 男女男生精精品视频网站| 日韩精品中文一区二区三区在线 | 97久久综合精品国产丝袜长腿| 亚洲一区精品无码| 国内精品少妇久久精品| 日本中文字幕有码在线播放| 2018天天躁夜夜躁狠狠躁| 蜜桃视频一区二区三区在线观看| 久久久久久国产精品免费网站 | 亚洲AV无码久久精品国产老人| 国产精品日本一区二区三区在线| 天天做天天爱夜夜爽毛片毛片| 久久久精品人妻一区二区三区四区| 人妻丝袜av中文系列先锋影音| 亚洲成av人片天堂网九九| 少妇又色又爽又刺激的视频| 蜜桃免费一区二区三区| 国产精品久久久久9999吃药| 国内揄拍国内精品| 久久中文字幕av第二页| 国产黄色av一区二区三区| 少妇无码av无码专区线| 精品国产性色av网站| 国产尤物自拍视频在线观看 | 无码爆乳护士让我爽| 乱码一二三入区口| av毛片一区二区少妇颜射| 亚洲中文字幕人妻久久| 久久水蜜桃亚洲av无码精品麻豆| 日日爽日日操|