日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
oracle索引怎么選,oracle 索引 使用

Oracle數(shù)據(jù)庫中如何選擇合適的索引類型

索引就好象一本字典的目錄。憑借字典的目錄,我們可以非常迅速的找到我們所需要的條目。數(shù)據(jù)庫也是如此。憑借Oracle數(shù)據(jù)庫的索引,相關(guān)語句可以迅速的定位記錄的位置,而不必去定位整個(gè)表。 雖然說,在表中是否創(chuàng)建索引,不會(huì)影響到Oracle數(shù)據(jù)庫的使用,也不會(huì)影響數(shù)據(jù)庫語句的使用。這就好像即使字典沒有目錄的話,用戶仍然可以使用它一樣??墒牵糇值錄]有目錄,那么可想而知,用戶要查某個(gè)條目的話,其不得不翻遍整本字典。數(shù)據(jù)庫也是如此。若沒有建立相關(guān)索引的話,則數(shù)據(jù)庫在查詢記錄的時(shí)候,不得不去查詢整個(gè)表。當(dāng)表中的記錄比較多的時(shí)候,其查詢效率就會(huì)很低。所以,合適的索引,是提高數(shù)據(jù)庫運(yùn)行效率的一個(gè)很好的工具。 不過,并不是說表上的索引越多越好。過之而不及。故在數(shù)據(jù)庫設(shè)計(jì)過程中,還是需要為表選擇一些合適的索引。寧缺勿濫,這是建立索引時(shí)的一個(gè)遵循標(biāo)準(zhǔn)。在理論上,雖然一個(gè)表可以設(shè)置無限的索引。但是,數(shù)據(jù)庫管理員需要知道,表中的索引越多,維護(hù)索引所需要的開銷也就越大。每當(dāng)數(shù)據(jù)表中記錄有增加、刪除、更新變化的時(shí)候,數(shù)據(jù)庫系統(tǒng)都需要對(duì)所有索引進(jìn)行更新。故數(shù)據(jù)庫表中的索引絕對(duì)不是多多益善。具體來說,在索引建立上,筆者對(duì)大家有如下建議。 建議一:在基數(shù)小的字段上要善于使用位圖索引。 基數(shù)是位圖索引中的一個(gè)基本的定義,它是指數(shù)據(jù)庫表中某個(gè)字段內(nèi)容中不重復(fù)的數(shù)值。如在員工信息表中的性別字段,一般就只有男跟女兩個(gè)值,所以,其基數(shù)為2;婚姻狀況字段的話,則其只有已婚、未婚、離婚三種狀態(tài),其基數(shù)就為3;民族一覽內(nèi)也是只有有限的幾個(gè)值。 對(duì)于要查詢基數(shù)小的字段,如現(xiàn)在用戶想查找所有婚姻狀況為“已婚”的“女性”時(shí),利用位圖索引可以提高查詢的效率。這主要是因?yàn)闃?biāo)準(zhǔn)索引是通過在索引中保存排序過的索引列以及對(duì)應(yīng)的ROWID來實(shí)現(xiàn)的。若我們?cè)诨鶖?shù)小的列上建立標(biāo)準(zhǔn)索引的話,則其會(huì)返回大量的記錄。 而當(dāng)我們?cè)趧?chuàng)建位圖索引的時(shí)候,在Oracle會(huì)對(duì)整個(gè)表進(jìn)行掃描,并且會(huì)為索引列的每個(gè)取值建立一個(gè)位圖。若內(nèi)容相同,則在位圖上會(huì)以一個(gè)相同的數(shù)字表示。此時(shí),若這個(gè)字段的基數(shù)比較小的話,則若需要實(shí)現(xiàn)對(duì)整個(gè)字段的查詢的話,效率就會(huì)非常的高。因?yàn)榇藭r(shí),數(shù)據(jù)庫只要位圖中數(shù)字相同的內(nèi)容找出來即可。 除了在數(shù)據(jù)表某列基數(shù)比較小的情況下,采用位圖索引外,我們往往在一些特殊的情況下,也會(huì)建議采用位圖索引。最常見的情況是,在Where限制條件中,若我們多次采用AND或者OR條件時(shí),也建議采用位圖索引。因?yàn)楫?dāng)一個(gè)查詢飲用了一些部署了位圖索引的列的時(shí)候,這些位圖可以很方便的與AND或者Or 運(yùn)算符操作結(jié)合以快速的找出用戶所需要的記錄。 但是,這里要注意,不是在條件語句中包含運(yùn)算符的時(shí)候,采用位圖索引都能夠提供比較高的效率。一般來說,只有AND 或者OR運(yùn)算符的時(shí)候,位圖索引才會(huì)比較具有優(yōu)勢(shì)。若此時(shí)用戶采用大于號(hào)或者不等于號(hào)作為條件語句中的限制條件的時(shí)候,則往往采用標(biāo)準(zhǔn)索引具有更大的優(yōu)勢(shì)。 所以,筆者在數(shù)據(jù)庫設(shè)置中,一般只有在三種情況下才采用位圖索引。一是列的基數(shù)比較小,而有可能需要根據(jù)這些字段的內(nèi)容查找相關(guān)的記錄;二是在條件語句中,用到了AND或者OR運(yùn)算符的時(shí)候。除了這兩種情況外,最好能夠采用其他適合的索引。第三種情況是,需要用到NULL作為查詢的限制條件。因?yàn)闃?biāo)準(zhǔn)查詢一般情況下,會(huì)忽略所有的NULL值列。也就是說,若需要查詢“所有沒有身份證號(hào)碼”的員工的信息的時(shí)候,標(biāo)準(zhǔn)索引并不能夠起到加速查詢速度的作用。此時(shí),就需要采用位圖索引。因?yàn)槲粓D索引會(huì)記錄相關(guān)的NULL值列信息。 建議二:創(chuàng)建索引的一些限制條件。 并不說,表或者列建立的索引越多越好。相反,索引建的越多,有時(shí)會(huì)反而會(huì)影響數(shù)據(jù)庫運(yùn)行的整體性能。所以,在建立索引的時(shí)候,仍然會(huì)有一些限制條件。 一是不要對(duì)一些記錄內(nèi)容比較少的表建立索引。在一個(gè)應(yīng)用系統(tǒng)設(shè)計(jì)的時(shí)候,如設(shè)計(jì)一個(gè)ERP系統(tǒng)的數(shù)據(jù)庫,其雖然有幾千張表。但是,并不是每張表都有大量記錄的。相反,其中有近一半左右的數(shù)據(jù)表,可能其存儲(chǔ)的數(shù)據(jù)不會(huì)超過百條。如員工登陸帳戶密碼表、企業(yè)部門信息表等等。對(duì)于這些記錄內(nèi)容比較少的表,我們建立最好不要為其建立索引。無論是表上的,還是字段上,都不要建立索引。

創(chuàng)新互聯(lián)建站為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、APP應(yīng)用開發(fā)、微信平臺(tái)小程序開發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。 

大俠,問一下,ORACLE如何選擇使用索引?

會(huì)用到單獨(dú)的索引

組合索引對(duì)查詢字段的順序是有很高的要求的

select * from table where first_result='XXX' and ne_id=1111

或者

select * from table where first_result='XXX'

只有上述2種情況才會(huì)用到這個(gè)組合索引, 第一個(gè)字段必須用到

oracle 數(shù)據(jù)庫如何建立索引 如何用索引?

創(chuàng)建索引語法:

CREATE [UNIQUE] | [BITMAP] INDEX index_name

--unique表示唯一索引

ON table_name([column1 [ASC|DESC],column2

--bitmap,創(chuàng)建位圖索引

[ASC|DESC],…] | [express])[TABLESPACE tablespace_name][PCTFREE n1]

--指定索引在數(shù)據(jù)塊中空閑空間

[STORAGE (INITIAL n2)][NOLOGGING]

--表示創(chuàng)建和重建索引時(shí)允許對(duì)表做DML操作,默認(rèn)情況下不應(yīng)該使用

[NOLINE][NOSORT];

--表示創(chuàng)建索引時(shí)不進(jìn)行排序,默認(rèn)不適用,如果數(shù)據(jù)已經(jīng)是按照該索引順序排列的可以使用

擴(kuò)展資料:

1、如果有兩個(gè)或者以上的索引,其中有一個(gè)唯一性索引,而其他是非唯一,這種情況下oracle將使用唯一性索引而完全忽略非唯一性索引

2、至少要包含組合索引的第一列(即如果索引建立在多個(gè)列上,只有它的第一個(gè)列被where子句引用時(shí),優(yōu)化器才會(huì)使用該索引)

3、小表不要簡(jiǎn)歷索引

4、對(duì)于基數(shù)大的列適合建立B樹索引,對(duì)于基數(shù)小的列適合簡(jiǎn)歷位圖索引

5、列中有很多空值,但經(jīng)常查詢?cè)摿猩戏强沼涗洉r(shí)應(yīng)該建立索引

6、經(jīng)常進(jìn)行連接查詢的列應(yīng)該創(chuàng)建索引

7、使用create index時(shí)要將最常查詢的列放在最前面

8、LONG(可變長(zhǎng)字符串?dāng)?shù)據(jù),最長(zhǎng)2G)和LONG RAW(可變長(zhǎng)二進(jìn)制數(shù)據(jù),最長(zhǎng)2G)列不能創(chuàng)建索引

9、限制表中索引的數(shù)量(創(chuàng)建索引耗費(fèi)時(shí)間,并且隨數(shù)據(jù)量的增大而增大;索引會(huì)占用物理空間;當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度)

如何選擇和優(yōu)化Oracle索引

Oracle 建立索引及SQL優(yōu)化

Oracle 建立索引及SQL優(yōu)化

數(shù)據(jù)庫索引:

索引有單列索引

復(fù)合索引之說

如何某表的某個(gè)字段有主鍵約束和唯一性約束,則Oracle 則會(huì)自動(dòng)在相應(yīng)的約束列上建議唯一索引。數(shù)據(jù)庫索引主要進(jìn)行提高訪問速度。

建設(shè)原則:

1、索引應(yīng)該經(jīng)常建在Where 子句經(jīng)常用到的列上。如果某個(gè)大表經(jīng)常使用某個(gè)字段進(jìn)行查詢,并且檢索行數(shù)小于總表行數(shù)的5%。則應(yīng)該考慮。

2、對(duì)于兩表連接的字段,應(yīng)該建立索引。如果經(jīng)常在某表的一個(gè)字段進(jìn)行Order By 則也經(jīng)過進(jìn)行索引。

3、不應(yīng)該在小表上建設(shè)索引。

優(yōu)缺點(diǎn):

1、索引主要進(jìn)行提高數(shù)據(jù)的查詢速度。 當(dāng)進(jìn)行DML時(shí),會(huì)更新索引。因此索引越多,則DML越慢,其需要維護(hù)索引。 因此在創(chuàng)建索引及DML需要權(quán)衡。

創(chuàng)建索引:

單一索引:Create Index Index-Name On Table_Name(Column_Name);

復(fù)合索引: Create Index i_deptno_job on emp(deptno,job); —在emp表的deptno、job列建立索引。

select * from emp where deptno=66 and job='sals' -走索引。

select * from emp where deptno=66 OR job='sals' -將進(jìn)行全表掃描。不走索引

select * from emp where deptno=66 -走索引。

select * from emp where job='sals' -進(jìn)行全表掃描、不走索引。

如果在where 子句中有OR 操作符或單獨(dú)引用Job 列(索引列的后面列) 則將不會(huì)走索引,將會(huì)進(jìn)行全表掃描。

Sql 優(yōu)化:

當(dāng)Oracle數(shù)據(jù)庫拿到SQL語句時(shí),其會(huì)根據(jù)查詢優(yōu)化器分析該語句,并根據(jù)分析結(jié)果生成查詢執(zhí)行計(jì)劃。

也就是說,數(shù)據(jù)庫是執(zhí)行的查詢計(jì)劃,而不是Sql語句。

查詢優(yōu)化器有rule-based-optimizer(基于規(guī)則的查詢優(yōu)化器) 和Cost-Based-optimizer(基于成本的查詢優(yōu)化器)。

其中基于規(guī)則的查詢優(yōu)化器在10g版本中消失。

對(duì)于規(guī)則查詢,其最后查詢的是全表掃描。而CBO則會(huì)根據(jù)統(tǒng)計(jì)信息進(jìn)行最后的選擇。

1、先執(zhí)行From -Where -Group By-Order By

2、執(zhí)行From 字句是從右往左進(jìn)行執(zhí)行。因此必須選擇記錄條數(shù)最少的表放在右邊。這是為什么呢?

3、對(duì)于Where字句其執(zhí)行順序是從后向前執(zhí)行、因此可以過濾最大數(shù)量記錄的條件必須寫在Where子句的末尾,而對(duì)于多表之間的連接,則寫在之前。

因?yàn)檫@樣進(jìn)行連接時(shí),可以去掉大多不重復(fù)的項(xiàng)。

4. SELECT子句中避免使用(*)ORACLE在解析的過程中, 會(huì)將’*’ 依次轉(zhuǎn)換成所有的列名, 這個(gè)工作是通過查詢數(shù)據(jù)字典完成的, 這意味著將耗費(fèi)更多的時(shí)間

5、索引失效的情況:

① Not Null/Null 如果某列建立索引,當(dāng)進(jìn)行Select * from emp where depto is not null/is null。 則會(huì)是索引失效。

② 索引列上不要使用函數(shù),SELECT Col FROM tbl WHERE substr(name ,1 ,3 ) = 'ABC'?

或者SELECT Col FROM tbl WHERE name LIKE '%ABC%' 而SELECT Col FROM tbl WHERE name LIKE 'ABC%' 會(huì)使用索引。

③ 索引列上不能進(jìn)行計(jì)算SELECT Col FROM tbl WHERE col / 10 10 則會(huì)使索引失效,應(yīng)該改成

SELECT Col FROM tbl WHERE col 10 * 10

④ 索引列上不要使用NOT ( != 、 )如:SELECT Col FROM tbl WHERE col ! = 10?

應(yīng)該 改成:SELECT Col FROM tbl WHERE col 10 OR col 10 。

6、用UNION替換OR(適用于索引列)

union:是將兩個(gè)查詢的結(jié)果集進(jìn)行追加在一起,它不會(huì)引起列的變化。 由于是追加操作,需要兩個(gè)結(jié)果集的列數(shù)應(yīng)該是相關(guān)的,

并且相應(yīng)列的數(shù)據(jù)類型也應(yīng)該相當(dāng)?shù)?。union 返回兩個(gè)結(jié)果集,同時(shí)將兩個(gè)結(jié)果集重復(fù)的項(xiàng)進(jìn)行消除。 如果不進(jìn)行消除,用UNOIN ALL.

通常情況下, 用UNION替換WHERE子句中的OR將會(huì)起到較好的效果. 對(duì)索引列使用OR將造成全表掃描. 注意, 以上規(guī)則只針對(duì)多個(gè)索引列有效.?

如果有column沒有被索引, 查詢效率可能會(huì)因?yàn)槟銢]有選擇OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.

高效:

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10

UNION

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE REGION = “MELBOURNE”

低效:

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10 OR REGION = “MELBOURNE”

如果你堅(jiān)持要用OR, 那就需要返回記錄最少的索引列寫在最前面.

7. 用EXISTS替代IN、用NOT EXISTS替代NOT IN

在許多基于基礎(chǔ)表的查詢中, 為了滿足一個(gè)條件, 往往需要對(duì)另一個(gè)表進(jìn)行聯(lián)接. 在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢的效率.?

在子查詢中, NOT IN子句將執(zhí)行一個(gè)內(nèi)部的排序和合并. 無論在哪種情況下, NOT IN都是最低效的(因?yàn)樗鼘?duì)子查詢中的表執(zhí)行了一個(gè)全表遍歷).?

為了避免使用NOT IN, 我們可以把它改寫成外連接(Outer Joins)或NOT EXISTS.

例子:

高效: SELECT * FROM EMP (基礎(chǔ)表) WHERE EMPNO 0 AND EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)

低效: SELECT * FROM EMP (基礎(chǔ)表) WHERE EMPNO 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)


網(wǎng)站標(biāo)題:oracle索引怎么選,oracle 索引 使用
網(wǎng)站鏈接:http://www.dlmjj.cn/article/hspdoi.html