• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    MS SQL Server數(shù)據(jù)庫查詢優(yōu)化技巧研究

    2012-04-29 00:00:00苗雯娟
    企業(yè)導(dǎo)報 2012年16期

    【摘 要】本文主要是對MS SQL Server數(shù)據(jù)庫查詢優(yōu)化技巧進(jìn)行了說明和分析,對索引使用、查詢條件以及數(shù)據(jù)表的設(shè)計等進(jìn)行了闡述。

    【關(guān)鍵詞】數(shù)據(jù)庫;查詢;優(yōu)化技巧

    一、建立索引能夠提高查詢效率

    在應(yīng)用數(shù)據(jù)庫的過程當(dāng)中是否應(yīng)用索引查詢是一個具有爭議性的話題,這主要是因為對數(shù)據(jù)庫某列添加索引以后,在利用該索引對整個數(shù)據(jù)庫進(jìn)行查詢的時候就只會在索引范圍之內(nèi)進(jìn)行掃描,而不利用該索引對整個數(shù)據(jù)庫進(jìn)行查詢時所進(jìn)行的就是全表的掃描。在這樣一種狀況下,從性能的角度來看的話,目標(biāo)表記錄的總數(shù)是固定的,因此在查詢結(jié)果比較少的時候索引查詢的效率才會相對比較高,查詢結(jié)果較多的時候索引查詢的效率反而會比較低,正是因為這樣,索引查詢的應(yīng)用與否才會成為一個具有爭議性的問題。但在實際的應(yīng)用過程當(dāng)中,各種不同軟件的應(yīng)用目的不一,通常來說,記錄數(shù)較少的表查詢結(jié)果與記錄數(shù)的比值偏大,甚至能夠出現(xiàn)100%查詢,但記錄數(shù)少的表查詢結(jié)果與記錄數(shù)的比值則偏小,由此認(rèn)為,至少應(yīng)當(dāng)對一些記錄數(shù)比較多的數(shù)據(jù)庫建立索引查詢來實現(xiàn)查詢效率的提高。

    二、數(shù)據(jù)表設(shè)計對查詢性能的影響分析

    (1)空值比較。在對數(shù)據(jù)表進(jìn)行定義的過程當(dāng)中會涉及到數(shù)據(jù)列的空值問題,這主要是因為在實際的應(yīng)用過程當(dāng)中無疑會出現(xiàn)允許空值的狀況,但在定義數(shù)據(jù)表時如果允許空值設(shè)置的話就會出現(xiàn)is 1的查詢條件。一旦is 1查詢條件出現(xiàn)后續(xù)的查詢過程就是對全表進(jìn)行的掃描而不是索引掃描,具體來說,int當(dāng)中采用一些特殊的數(shù)字來作為默認(rèn)值,而字符串當(dāng)中則采用空串來作為默認(rèn)值。(2)字符類型比較。MS SQL

    Server2005當(dāng)中共有六類字符串?dāng)?shù)據(jù)類型,包括:varbinary、binary、nvarchar、nchar、varchar、char。在這六個字符串?dāng)?shù)據(jù)類型當(dāng)中,binary、nchar、char是固定長度的字符串,varbinary、nvarchar、varchar則是可變長度的字符串,在應(yīng)用的過程當(dāng)中不同類型也是可以互換使用的,因此要注意對其進(jìn)行區(qū)分。

    三、條件表達(dá)式性能優(yōu)缺點分析

    在進(jìn)行數(shù)據(jù)查詢的過程當(dāng)中,查詢結(jié)果在查詢語句中的表達(dá)方式有多種,且不同表達(dá)方式所得到的查詢效率有高有底,這也就是說,在進(jìn)行條件表達(dá)式的編寫時也需要根據(jù)查詢結(jié)果的特點進(jìn)行選擇和應(yīng)用,下面主要是結(jié)合常用的幾種情況進(jìn)行說明和分析。(1)!=或<>情況。我們在實際的查詢過程當(dāng)中應(yīng)當(dāng)盡可能的去避免不等條件的應(yīng)用,這主要是因為一旦在查詢過程當(dāng)中使用不等條件就意味著后續(xù)查詢過程只能夠通過全面掃描來完成,索引掃描在其中是難以發(fā)揮作用的。通常情況下采用的是大于或小于的表達(dá)式來對不等條件進(jìn)行表示。(2)Like情況。Like情況主要是應(yīng)用于字符串的模糊查詢,其具體的查詢表達(dá)形式同樣有多種:like a%、like%a和like a%a ,在這其中,只有l(wèi)ikea%既能應(yīng)用于索引掃描又能應(yīng)用于全表掃描,like%a和likea%a只能進(jìn)行全表掃描,正是因為這樣,我們在進(jìn)行選擇和使用的時候就盡可能的避免后兩種表達(dá)方式。但是,在一些目標(biāo)列中字段過長的時候,檢索方式會選擇為全文檢索,在這樣一種情況下則還是選擇like%a和likea%a更為合適。(3)in、not in 情況。在進(jìn)行查詢語言的設(shè)計時,in的用法包括兩種,一種是后接條件集合,一種是后接子查詢,下文中將對這樣兩種情況分別進(jìn)行說明和分析。in后接條件集合,如果其數(shù)據(jù)量不大或者其對應(yīng)條件無索引時,可以直接予以使用而不需要對其進(jìn)行優(yōu)化,相反,如果數(shù)據(jù)量較大或者其對應(yīng)條件有索引時,就建議將所有的條件都集合起來,并為每一個條件都單獨寫sql語句,采用union或者是union all將所有的查詢結(jié)果進(jìn)行連接。在這里進(jìn)一步說明union和union all之間的區(qū)別,union能夠?qū)Σ樵兘Y(jié)果進(jìn)行有效的排序,并去除重復(fù)項,而union all則無此功能,在實際的應(yīng)用過程當(dāng)中就可以根據(jù)需要排序與否來進(jìn)行選擇和使用。In后接子查詢時,目標(biāo)表記錄數(shù)量如果明顯比子查詢表記錄數(shù)少的話就需要采用exists來代替in,必要的時候還可以在子查詢當(dāng)中建立索引。但需要注意的是,在一些能夠直接使用連接查詢方式的語句當(dāng)中就盡可能的不要使用in,這主要是因為in語句相當(dāng)于hash連接,其性能相對而言要低的多。Not in在任何狀況下應(yīng)用都不會使用索引,因此認(rèn)為在一些數(shù)據(jù)量大的數(shù)據(jù)庫當(dāng)中盡量不要使用,而not exists的子查詢則是可以應(yīng)用索引掃描的,因此有必要的時候就可以直接采用not exists加索引來對其進(jìn)行優(yōu)化。

    通過上文的說明和分析就可以看到,在進(jìn)行數(shù)據(jù)庫查詢時往往是沒有既定的方式和規(guī)則的,需要我們以查詢效率為目的來進(jìn)行創(chuàng)新、設(shè)計和嘗試。

    參 考 文 獻(xiàn)

    [1]王珊,薩師炫.?dāng)?shù)據(jù)庫系統(tǒng)概述(第四版)[M].北京:高等教育出版社,2006

    [2]李輝,王至邀.一種多條件分頁查詢優(yōu)化方法的設(shè)計[J].計算機工程.2010(2)

    积石山| 西城区| 白水县| 赣州市| 开平市| 宜良县| 永兴县| 隆子县| 招远市| 达日县| 临颍县| 襄城县| 长丰县| 宽甸| 珲春市| 五家渠市| 阿拉尔市| 葵青区| 广河县| 永兴县| 子洲县| 昌平区| 岚皋县| 紫阳县| 长沙市| 东港市| 南郑县| 会理县| SHOW| 柳河县| 惠水县| 建水县| 拉孜县| 灌南县| 浦城县| 东海县| 眉山市| 成安县| 百色市| 宣威市| 密云县|