本文主要介紹sqlserver優(yōu)化的幾種方法(sqlserver語(yǔ)句優(yōu)化工具),下面一起看看sqlserver優(yōu)化的幾種方法(sqlserver語(yǔ)句優(yōu)化工具)相關(guān)資訊。
許多人不知道。;我不知道sql語(yǔ)句在sql server中是如何執(zhí)行的。他們擔(dān)心sql語(yǔ)句會(huì)被sql server誤解:select * from table name = 張三 和tid 10000和實(shí)施:從表1中選擇* tid 10000人= 張三有些人不 我不知道兩個(gè)以上的語(yǔ)句的執(zhí)行效率是一樣的,因?yàn)槿绻麖囊粋€(gè)新的角度來(lái)看一個(gè)簡(jiǎn)單的語(yǔ)句,這兩個(gè)語(yǔ)句是不同的。如果tid是一個(gè)聚合指數(shù),那就簡(jiǎn)單的從10000后的短句來(lái)看;從綜合查找表中,我看到了幾個(gè)名字= 張三 ,然后根據(jù)tid 10000條件提出了限制搜索結(jié)果。其實(shí)這種擔(dān)心是多余的。sql server中有一個(gè)查詢分析優(yōu)化器,可以計(jì)算where子句中的搜索條件,確定哪些索引可以減少表掃描的掃描空間,即可以實(shí)現(xiàn)自動(dòng)優(yōu)化。雖然查詢優(yōu)化器可以根據(jù)where子句自動(dòng)進(jìn)行查詢優(yōu)化,但還是需要了解查詢優(yōu)化器的工作原理。如果沒(méi)有,有時(shí)候查詢優(yōu)化器不會(huì)按照你的本意快速查詢。在查詢分析階段,查詢優(yōu)化器在查詢的每個(gè)階段以及確定是否要限制需要掃描的數(shù)據(jù)量時(shí)似乎都很有用。如果一個(gè)階段可以作為一個(gè)掃描參數(shù)(sarg),它被稱為可優(yōu)化的,所需的數(shù)據(jù)可以快速傳遞,以獲得一個(gè)索引。特區(qū)的定義是一個(gè)運(yùn)算,它限制了搜索,因?yàn)樗ǔV傅氖且粋€(gè)值范圍內(nèi)的匹配。兩個(gè)或兩個(gè)以上的條件和連接形式如下:列名運(yùn)算符或運(yùn)算符列名可以出現(xiàn)在運(yùn)算符的一側(cè),常量或變量出現(xiàn)在運(yùn)算符的另一側(cè):name = price 5000 5000 5000如果表達(dá)式不滿足sarg形式,則不能限制搜索范圍。也就是說(shuō),sql server必須判斷每個(gè)條件的每一行是否滿足所有條件。在where子句中,以不滿足sarg的形式表示索引是沒(méi)有用的。在介紹特區(qū)后,我們將總結(jié)利用sarg的經(jīng)驗(yàn)和在實(shí)踐中遇到的一些數(shù)據(jù)得出不同的結(jié)論:1 .你是否喜歡宣布它屬于sarg取決于通配符的類型-如:name like ——張%。這是蒲的。是像,不是溥像。原因是通配符%對(duì)字符串開(kāi)放,所以不能使用索引。或?qū)?dǎo)致全表掃描name =和price 5000 logo和name = 張浦,三個(gè)還是價(jià)格。grid 5000不適合特區(qū)使用或?qū)?dǎo)致全表掃描。3.sarg表造成的不理想的非經(jīng)營(yíng)和職能的財(cái)務(wù)報(bào)表不符合sarg報(bào)表,包括非經(jīng)營(yíng)報(bào)表,如最典型的形式:沒(méi)有!=,,不存在,不存在!我不 除了功能以外,我不喜歡它。下面舉幾個(gè)例子,不符合sarg形式:abs (price) 2500 2但是我們不推薦這種方法,因?yàn)橛袝r(shí)候sqlserver并不能保證這種轉(zhuǎn)換完全等價(jià)于原始表達(dá)式。4.按照or語(yǔ)句uff1a select * from table 1,tid(2,3)-select * from table 1,tid = 2或tid = 3也將導(dǎo)致掃描整個(gè)表。如果其中一個(gè)被tid索引,該索引也將失敗。5。用的越少越好,執(zhí)行效率為6,存在且相同。很多信息表明,存在比存在更有效,應(yīng)該盡量用不存在來(lái)代替。但事實(shí)上,我 我試圖找出這兩種效率之間的相似之處。因?yàn)樽硬樵?,我們嘗試使用pubs數(shù)據(jù)庫(kù),并帶來(lái)了sql服務(wù)器。在運(yùn)行之前,我們可以打開(kāi)my/sql server狀態(tài)的統(tǒng)計(jì):(1)選擇標(biāo)題,從標(biāo)題中選擇title_id的價(jià)格(銷(xiāo)售選擇title_id)。這句話的結(jié)果如下:表 銷(xiāo)售。掃描計(jì)數(shù)為18,邏輯讀取為56次,物理讀取為0次,0次。表 標(biāo)題.掃描計(jì)數(shù)1,邏輯讀取2次,物理讀取0次,0次。(2)從標(biāo)題和價(jià)格存在的銷(xiāo)售中選擇標(biāo)題(從銷(xiāo)售中選擇*)。title_id = titles.title_id和quantity 30)第二句的結(jié)果如下:table 銷(xiāo)售。掃描計(jì)數(shù)為18,邏輯讀取為56次,物理讀取為0次,0次。表 標(biāo)題.掃描計(jì)數(shù)1,邏輯讀取2次,物理讀取0次,0次。我們可以看到同樣的執(zhí)行效率。7。函數(shù)charindex用于通配符%,它喜歡執(zhí)行效率。前面我們講過(guò),如果前面加了通配符%會(huì)造成全表掃描,所以它的執(zhí)行效率很低。但是有數(shù)據(jù)顯示,這個(gè)函數(shù)的charindex速度會(huì)大大提高,而不是圖像速度。選擇gid,title,fariqi,reader from tgongwen,其中charind測(cè)試之后,作者發(fā)現(xiàn)如果查詢兩邊的列相同,聯(lián)合執(zhí)行的速度要差很多。雖然聯(lián)合掃描是索引,還是掃描全是表。選擇gid,fariqi,neibuyonghu,readers,標(biāo)題來(lái)自fariqi = 2004年9月16日;或者fariqi = 時(shí)間:6423毫秒。掃描計(jì)數(shù)2次,邏輯讀取14726次,物理讀取1次,前7176次。選擇gid,fariqi,neibuyonghu,readers,來(lái)自tgongwen,fariqi = 2004-9-16.聯(lián)盟選擇gid,fariqi,neibuyonghu,readers,from tgongwen,fariqi = 2004-2-5,標(biāo)題時(shí)間:11640毫秒。掃描計(jì)數(shù)8次,邏輯讀取14806次,物理讀取108次,第一次1144次。9.應(yīng)根據(jù)多少字段提取以及避免選擇的原則。讓 讓我們做一個(gè)實(shí)驗(yàn)。選擇前10000個(gè)gid,fariqi,reader,從tgongwen到gid desc標(biāo)題使用時(shí)間:4673毫秒,選擇前10000個(gè)gid,fariqi從tgongwen到gid desc標(biāo)題使用時(shí)間:1376毫秒,選擇前10000個(gè)gid,fariqi從tgongwen到gid desc使用時(shí)間:80毫秒,因此,每一個(gè)小字段都是晉升的速度取決于你放棄的領(lǐng)域的大小。10,count (*)不會(huì)比count (field)慢。在某些數(shù)據(jù)中,統(tǒng)計(jì)所有列的效率明顯不如世界名:select count(* ) tgongwen使用時(shí)間:1500毫秒select count(gid)tgongwen使用時(shí)間:1483毫秒select count(fariqi)tgongwen使用時(shí)間:3140毫秒select count (title) tgongwen使用時(shí)間:52050毫秒從上面可以看出,如果我們使用counting (*)和counting (primary key),速度非常相似,當(dāng)數(shù)字(*)比除了主鍵、站點(diǎn)和我覺(jué)得如果用sql server來(lái)統(tǒng)計(jì)(*),可以自動(dòng)找到最小的字段來(lái)收集。當(dāng)然,如果你寫(xiě)直接計(jì)算(主鍵),它會(huì)來(lái)得更直接。11.通過(guò)聚合索引列來(lái)獲得最高效率。讓 s see: (gid為主鍵,fariqi為聚集索引列):從tgongwen中選擇前10000個(gè)gid,fariqi,reader,title時(shí)間:196毫秒。掃描計(jì)數(shù)一次,邏輯讀取289次,物理讀取一次,第一次1527次。選取gid,fariqi,readers前10000名,從tgongwen到gidaasc標(biāo)題時(shí)間:4720ms。掃描計(jì)數(shù)1次,邏輯讀取41956次,物理讀取0次,第1287次。選取前10000名gid、fariqi、readers,從tgongwen到gid desc標(biāo)題時(shí)間:4736毫秒。掃描計(jì)數(shù)一次,邏輯讀取55350次,物理讀取10次,第一次775次。選取前10000名gid,fariqi,readers,從tgongwen到fariqi asc標(biāo)題時(shí)間:173毫秒。掃描計(jì)數(shù)1次,邏輯讀取290次,物理讀取0次,第一次0次。選擇前10000名gid,fariqi,reader,按tgongwen fariqi desc標(biāo)題時(shí)間:156毫秒。掃描計(jì)數(shù)1次,邏輯讀取289次,物理讀取0次,第一次0次。從上面可以看出,排序的速度和邏輯讀取的次數(shù)與聚集索引列的順序相當(dāng),但這些速度比非聚集索引列快得多。同時(shí),按照一個(gè)場(chǎng)來(lái)排序時(shí)間,無(wú)論是正還是負(fù),都是很基本的。十二個(gè)。高效top其實(shí)在查詢提取大型數(shù)據(jù)集時(shí),影響數(shù)據(jù)庫(kù)響應(yīng)時(shí)間最大的因素不是數(shù)據(jù)搜索,而是物理i/o操作:選擇top 10 * from(選擇top 10000 gid,fariqi,title from tgo。從理論上來(lái)說(shuō),ngwen是《內(nèi)比都》中g(shù)id asc的順序= office)使得整句的執(zhí)行時(shí)間比該子句的執(zhí)行時(shí)間長(zhǎng),但事實(shí)卻相反。因?yàn)?,在條款的執(zhí)行中,返回10000條記錄,全句只返回10條語(yǔ)句,所以影響數(shù)據(jù)庫(kù)響應(yīng)時(shí)間最重要的因素就是物理i/o操作。限制物理i/o操作最有效的方法之一是使用熱關(guān)鍵字,熱關(guān)鍵字是系統(tǒng)優(yōu)化和從sql server提取數(shù)據(jù)之前的百分比或百分比。經(jīng)過(guò)實(shí)際應(yīng)用,筆者發(fā)現(xiàn)以上是很有效的,但是這句話是否在另一個(gè)大型數(shù)據(jù)庫(kù)oracle,c中找到并不可惜,但是可以用其他方法解決(比如rownumber)。在oracle的分頁(yè)過(guò)程中,我們會(huì)討論未來(lái)幾千萬(wàn)的橫向數(shù)據(jù),我們會(huì)使用最高的關(guān)鍵詞。到目前為止,我們已經(jīng)討論了如何從大容量數(shù)據(jù)庫(kù)中快速查詢所需數(shù)據(jù)。在實(shí)際應(yīng)用中,必須考慮各種硬因素,如網(wǎng)絡(luò)性能、服務(wù)器性能、操作系統(tǒng)性能、網(wǎng)卡、交換機(jī)等。
了解更多sqlserver優(yōu)化的幾種方法(sqlserver語(yǔ)句優(yōu)化工具)相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。