<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 60,comments - 71,trackbacks - 0

    索引使用的注意點

    1)      合理使用索引

    索引是數據庫中重要的數據結構,它的根本目的就是為了提高查詢效率。現在大多數的數據庫產品都采用 IBM 最先提出的 ISAM 索引結構。索引的使用要恰到好處,其使用原則如下:

    ●在經常進行連接,但是沒有指定為外鍵的列上建立索引,而不經常連接的字段則由優化器自動生成索引。

    ●在頻繁進行排序或分組(即進行 group by order by 操作)的列上建立索引。

    ●在條件表達式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。比如在雇員表的“性別”列上只有“男”與“女”兩個不同值,因此就無必要建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重降低更新速度。

    ●如果待排序的列有多個,可以在這些列上建立復合索引( compound index )。

    ●使用系統工具。如 Informix 數據庫有一個 tbcheck 工具,可以在可疑的索引上進行檢查。在一些數據庫服務器上,索引可能失效或者因為頻繁操作而使得讀取效率降低,如果一個使用索引的查詢不明不白地慢下來,可以試著用 tbcheck 工具檢查索引的完整性,必要時進行修復。另外,當數據庫表更新大量數據后,刪除并重建索引可以提高查詢速度。

    2)      避免或簡化排序

    應當簡化或避免對大型表進行重復的排序。當能夠利用索引自動以適當的次序產生輸出時,優化器就避免了排序的步驟。以下是一些影響因素:

    ●索引中不包括一個或幾個待排序的列;

    group by order by 子句中列的次序與索引的次序不一樣;

    ●排序的列來自不同的表。

    為了避免不必要的排序,就要正確地增建索引,合理地合并數據庫表(盡管有時可能影響表的規范化,但相對于效率的提高是值得的)。如果排序不可避免,那么應當試圖簡化它,如縮小排序的列的范圍等。

    3)      消除對大型表行數據的順序存取

    在嵌套查詢中,對表的順序存取對查詢效率可能產生致命的影響。比如采用順序存取策略,一個嵌套 3 層的查詢,如果每層都查詢 1000 行,那么這個查詢就要查詢 10 億行數據。避免這種情況的主要方法就是對連接的列進行索引。例如,兩個表:學生表(學號、姓名、年齡……)和選課表(學號、課程號、成績)。如果兩個表要做連接,就要在“學號”這個連接字段上建立索引。

    還可以使用并集來避免順序存取。盡管在所有的檢查列上都有索引,但某些形式的 where 子句強迫優化器使用順序存取。下面的查詢將強迫對 orders 表執行順序操作:

    SELECT FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

    雖然在 customer_num order_num 上建有索引,但是在上面的語句中優化器還是使用順序存取路徑掃描整個表。因為這個語句要檢索的是分離的行的集合,所以應該改為如下語句:

    SELECT FROM orders WHERE customer_num=104 AND order_num>1001

    UNION

    SELECT FROM orders WHERE order_num=1008

    這樣就能利用索引路徑處理查詢。

    4)      避免相關子查詢

    一個列的標簽同時在主查詢和 where 子句中的查詢中出現,那么很可能當主查詢中的列值改變之后,子查詢必須重新查詢一次。查詢嵌套層次越多,效率越低,因此應當盡量避免子查詢。如果子查詢不可避免,那么要在子查詢中過濾掉盡可能多的行。

    5)      避免困難的正規表達式

    MATCHES LIKE 關鍵字支持通配符匹配,技術上叫正規表達式。但這種匹配特別耗費時間。例如: SELECT FROM customer WHERE zipcode LIKE 98_ _ _

    即使在 zipcode 字段上建立了索引,在這種情況下也還是采用順序掃描的方式。如果把語句改為 SELECT FROM customer WHERE zipcode > 98000 ”,在執行查詢時就會利用索引來查詢,顯然會大大提高速度。

    另外,還要避免非開始的子串。例如語句: SELECT FROM customer WHERE zipcode[2 3] > 80 ”,在 where 子句中采用了非開始子串,因而這個語句也不會使用索引。

    6)      使用臨時表加速查詢

    把表的一個子集進行排序并創建臨時表,有時能加速查詢。它有助于避免多重排序操作,而且在其他方面還能簡化優化器的工作。例如:

    SELECT cust.name rcvbles.balance ,…… other columns

    FROM cust rcvbles

    WHERE cust.customer_id = rcvlbes.customer_id

    AND rcvblls.balance>0

    AND cust.postcode>“98000”

    ORDER BY cust.name

    如果這個查詢要被執行多次而不止一次,可以把所有未付款的客戶找出來放在一個臨時文件中,并按客戶的名字進行排序:

    SELECT cust.name rcvbles.balance ,…… other columns

    FROM cust rcvbles

    WHERE cust.customer_id = rcvlbes.customer_id

    AND rcvblls.balance>0

    ORDER BY cust.name

    INTO TEMP cust_with_balance

    然后以下面的方式在臨時表中查詢:

    SELECT FROM cust_with_balance

    WHERE postcode>“98000”

    臨時表中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁盤 I/O ,所以查詢工作量可以得到大幅減少。

    注意:臨時表創建后不會反映主表的修改。在主表中數據頻繁修改的情況下,注意不要丟失數據。

    7)      用排序來取代非順序存取

    非順序磁盤存取是最慢的操作,表現在磁盤存取臂的來回移動。 SQL 語句隱藏了這一情況,使得我們在寫應用程序時很容易寫出要求存取大量非順序頁的查詢。

    有些時候,用數據庫的排序能力來替代非順序的存取能改進查詢。

     

    優化SQL語句

     

    優化就是選擇最有效的方法來執行 SQL 語句。 Oracle 優化器選擇它認為最有效的方法來執行 SQL 語句。  

    1)      IS NULL IS NOT NULL

    如果某列存在 NULL 值,即使對該列建立索引也不會提高性能。

    2)      為不同的工作編寫不同的SQL語句塊。

    為完成不同的工作編寫一大塊 SQL 程序不是好方法。它往往導致每個任務的結果不優

    化。若要 SQL 完成不同的工作,一般應編寫不同的語句塊比編寫一個要好。

    3)      IN 和EXISTS

    Select name from employee where name not in (select name from student);

    Select name from employee where not exists (select name from student);

    第一句 SQL 語句的執行效率不如第二句。

    通過使用 EXISTS Oracle 會首先檢查主查詢,然后運行子查詢直到它找到第一個匹配

    項,這就節省了時間。 Oracle 在執行 IN 子查詢時,首先執行子查詢,并將獲得的結果

    列表存放在一個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起,待

    子查詢執行完畢,存放在臨時表中以后再執行主查詢。這也就是使用 EXISTS 比使用 IN

    通常查詢速度快的原因。

    4)      NOT 運算符

    Select * from employee where salary<>1000;

    Select * from employee where salary<1000 or salary>1000;

    第一句 SQL 語句的執行效率不如第二句,因為第二句 SQL 語句可以使用索引。

    5)      Order By 語句

    Order By 語句的執行效率很低,因為它要排序。應避免在 Order By 字句中使用表達式。

    6)      列的連接

    select * from employee where name||department=’ZYZBIOINFO’;

    select * from employee where name=’ZYZ’ and department=’BIOINFO’;

    這兩個查詢,第二句比第一句會快,因為對于有連接運算符’ || ’的查詢 ,Oracle 優化器是不

    會使用索引的。

    7)      通配符‘%’當通配符出現在搜索詞首時,Oracle優化器不使用索引。

    Select * from employee where name like ‘%Z%’;

    Select * from employee where name like ‘Z%’;

    第二句的執行效率會比第一句快,但查詢結果集可能會不同。

    8)      應盡量避免混合類型的表達式。

    假設字段 studentno VARCHAR2 類型

    有語句 select * from student where studentno>123;

    Oracle 會有一個隱含的類型轉換。隱含的類型轉換可能會使 Oracle 優化器忽略索引。

    這時應使用顯式的類型轉換 select * from student where studentno=to_char(123)

    9)      DISTINCT

       DISTINCT 總是建立一個排序,所以查詢速度也慢。
    posted on 2008-05-27 14:57 henry1451 閱讀(342) 評論(0)  編輯  收藏 所屬分類: Oracle技術
    主站蜘蛛池模板: 久久综合AV免费观看| 99视频在线精品免费观看6| 亚洲校园春色小说| 成人免费看片又大又黄| 一级免费黄色大片| 亚洲一本综合久久| 曰皮全部过程视频免费国产30分钟| 一区在线免费观看| 亚洲欧洲自拍拍偷午夜色| 俄罗斯极品美女毛片免费播放| 国产成人久久AV免费| 亚洲AV电影天堂男人的天堂| 国产成A人亚洲精V品无码| 在线jyzzjyzz免费视频| 国内精品免费在线观看| 亚洲国产区男人本色| 亚洲国产精品线在线观看| 国产真人无遮挡作爱免费视频 | 亚洲国产一区在线| 浮力影院第一页小视频国产在线观看免费 | 免费v片在线观看视频网站| 西西人体大胆免费视频| 亚洲H在线播放在线观看H| 亚洲中文字幕久久精品无码喷水| 日韩精品无码区免费专区| 免费91最新地址永久入口| 国产亚洲福利一区二区免费看| 久久亚洲精品国产精品| 久久影院亚洲一区| 韩国欧洲一级毛片免费| 无码国产精品一区二区免费式直播| 怡红院免费的全部视频| 国产成人综合亚洲| 亚洲人成激情在线播放| 久久精品国产精品亚洲色婷婷| vvvv99日韩精品亚洲| 免费视频淫片aa毛片| 中文字幕人成无码免费视频| 4399影视免费观看高清直播| 精品免费视在线观看| 中文毛片无遮挡高清免费|