自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

高級(jí)掃描提高數(shù)據(jù)庫查詢性能

運(yùn)維 數(shù)據(jù)庫運(yùn)維
數(shù)據(jù)庫查詢時(shí)數(shù)據(jù)庫重要更能之一,數(shù)據(jù)庫查詢能很大程度的提高查詢的速度,自從人類進(jìn)入到數(shù)據(jù)庫時(shí)代,很多查詢工作都得到了簡(jiǎn)化,如今,高速掃描可以提高數(shù)據(jù)庫查詢性能。

高速掃描的出現(xiàn)對(duì)數(shù)據(jù)庫查詢來說是意義重大,高速掃描實(shí)現(xiàn)了數(shù)據(jù)庫查詢的高速化發(fā)展,也使數(shù)據(jù)庫查詢性能優(yōu)化了,下面就為大家介紹高級(jí)掃描。

一、高級(jí)掃描使用舉例

  通常情況下在數(shù)據(jù)查詢的時(shí)候,數(shù)據(jù)庫會(huì)利用索引或者通過全表掃描來查找數(shù)據(jù)。但是如果需要的數(shù)據(jù)在數(shù)據(jù)庫中存儲(chǔ)不連續(xù)或者需要查找的記錄比較多時(shí),此時(shí)索引的效果就會(huì)大打折扣。在這種情況下,數(shù)據(jù)庫查詢優(yōu)化器可能會(huì)采用全表掃描來代替索引。但是眾所周知,全表掃描的效率是比較低下的。為此在SQL Server數(shù)據(jù)庫的企業(yè)版中,提出了一個(gè)高級(jí)掃描的處理方式。簡(jiǎn)單的說,高級(jí)掃描可以讓多項(xiàng)查詢?nèi)蝿?wù)共享完全表掃描。筆者先給大家舉一個(gè)例子,然后再跟大家談?wù)勲[藏在其背后的秘密。

  如在上圖中,一個(gè)表中的記錄比較多有40000頁。用戶甲需要查詢這個(gè)表中的記錄,假設(shè)其采用了全表掃描。當(dāng)數(shù)據(jù)庫查詢到20000頁的時(shí)候,用戶乙也需要這個(gè)表中的數(shù)據(jù),那么又觸發(fā)了一個(gè)全表掃描。此時(shí)如果沒有采用高級(jí)掃描技術(shù)的話,則用戶乙的SQL語句必須要等到用戶甲的執(zhí)行完畢后才會(huì)執(zhí)行。而如果采用了高級(jí)掃描技術(shù)的話,則數(shù)據(jù)庫在從20000頁開始的全表掃描中,會(huì)把掃描的結(jié)果分成兩個(gè)副本,分別給用戶甲與乙。然后當(dāng)?shù)?0000頁的時(shí)候,用戶丙也參與進(jìn)來了。同理數(shù)據(jù)庫引擎會(huì)把從30000頁開始的掃描結(jié)果分為三個(gè)副本,分別給三個(gè)用戶。當(dāng)整個(gè)表掃描完成之后,數(shù)據(jù)庫引擎就會(huì)把結(jié)果返回給用戶甲。然后再從頭開始掃描,當(dāng)掃描到20000頁的時(shí)候,就會(huì)把上次掃描的20000頁到400000頁的結(jié)果合并起來然后返回給用戶乙。掃描到300000頁的時(shí)候就會(huì)把與上次掃描到的結(jié)果合并起來返回給用戶丙。

  可見如果在不同高級(jí)掃描功能的話,則不同用戶在不同時(shí)刻的查詢請(qǐng)求,可能需要對(duì)某個(gè)表進(jìn)行全表掃描三次。而在上面這個(gè)案例中,則知需要對(duì)這個(gè)表掃描2次都不到。為此當(dāng)多個(gè)對(duì)同一個(gè)表進(jìn)行全表掃描時(shí),高級(jí)掃描工具可以明顯提高數(shù)據(jù)庫的運(yùn)行性能。

二、高級(jí)掃描實(shí)現(xiàn)的秘密

  可見高級(jí)掃描其主要就是通過共享全表掃描技術(shù)來實(shí)現(xiàn)的。也就是說,當(dāng)SQL語句的執(zhí)行計(jì)劃需要掃描表中的數(shù)據(jù)頁(即全表掃描),并且數(shù)據(jù)庫引擎檢測(cè)到其他查詢執(zhí)行計(jì)劃正在掃描這個(gè)表中的時(shí)候(如上例中用戶乙、丙參與進(jìn)來),則數(shù)據(jù)庫引擎就會(huì)在第二個(gè)掃描的當(dāng)前位置將第二個(gè)掃描插入到第一個(gè)掃描中(此時(shí)數(shù)據(jù)庫引擎會(huì)會(huì)把掃描的結(jié)果產(chǎn)生一個(gè)副本)。數(shù)據(jù)庫引起會(huì)一次讀取一頁,并加每一頁的行傳遞給多個(gè)執(zhí)行計(jì)劃,一直到當(dāng)前掃描結(jié)束。

  此時(shí),第一個(gè)掃描(用戶甲)已經(jīng)完全結(jié)束,數(shù)據(jù)庫引擎就會(huì)把掃描的結(jié)果傳遞給用戶甲的進(jìn)程。但是此時(shí)數(shù)據(jù)庫乙還不能夠把結(jié)果返回給用戶乙,因?yàn)樵谟脩艏组_始查詢到用戶乙遞交SQL語句中間,可能會(huì)有用戶對(duì)前面幾頁的數(shù)據(jù)進(jìn)行修改。為此數(shù)據(jù)庫引擎需要對(duì)先前的頁進(jìn)行重新掃描,以防止數(shù)據(jù)的誤讀。為此第二個(gè)查詢計(jì)劃必須發(fā)起第二個(gè)全表掃描,檢索第二個(gè)執(zhí)行計(jì)劃加入第一次掃描正在進(jìn)行的掃描之前讀取的數(shù)據(jù)頁。即第二個(gè)執(zhí)行計(jì)劃的掃描將繞回到第一個(gè)數(shù)據(jù)頁,并從這里開始掃描,直到其加入到第一個(gè)掃描時(shí)的位置。然后數(shù)據(jù)庫引擎會(huì)把掃描到的結(jié)果返回給第二個(gè)查詢計(jì)劃,依次類推。在實(shí)際工作中,可以按這種方式組合任意數(shù)量的掃描。其實(shí)這種掃描很想走馬燈,為此我們又把高級(jí)掃描戲稱為全表掃描。可見在這種情況下,如果多個(gè)用戶在一次全表掃描的過程中查詢同一個(gè)表,則可以減少全表掃描的次數(shù)。如果在沒有高級(jí)掃描的情況下,像上面的用戶甲、乙、丙都必須要爭(zhēng)用緩沖區(qū)空間并因此導(dǎo)致硬盤或者內(nèi)存的爭(zhēng)用等等。然后數(shù)據(jù)庫引擎會(huì)分別為每一個(gè)用戶讀取依次相同的頁,而不是每次讀取的結(jié)果有多個(gè)用戶共享。顯然跟高級(jí)掃描比起來,這種處理方式其效率會(huì)低很多。

三、高級(jí)掃描的弊端與解決方式

  雖然高級(jí)掃描會(huì)提高數(shù)據(jù)庫的查詢性能,但是這種處理機(jī)制也會(huì)有一個(gè)弊端,即會(huì)導(dǎo)致查詢結(jié)果記錄順序的混亂。如上面這個(gè)例子中,如果三個(gè)用戶采用的都是同一個(gè)查詢語句的話,則其最后返回的結(jié)果雖然記錄的內(nèi)容是相同的,但是顯示的記錄順序是不同的(假設(shè)沒有采用排序語句)。這可能會(huì)給用戶一種誤解,以為各自查到的是不同的內(nèi)容。為什么會(huì)產(chǎn)生這種情況呢?為了說們這個(gè)問題的原因,筆者就對(duì)表中的內(nèi)容進(jìn)行簡(jiǎn)化。假設(shè)某一張表中有三條記錄,序號(hào)分別為1、2、3。

  現(xiàn)在用戶甲需要查詢這個(gè)表中的內(nèi)容,進(jìn)行了一次全表掃描。當(dāng)?shù)谝粭l記錄查詢完畢之后,用戶乙也需要查詢這個(gè)表。從這次開始的后續(xù)查詢中,數(shù)據(jù)庫引擎會(huì)把結(jié)果同時(shí)發(fā)送給用戶甲與乙兩個(gè)查詢計(jì)劃。也就是說,用戶乙此時(shí)掃描的第一個(gè)結(jié)果是序號(hào)為2的記錄。然后用戶丙又插了進(jìn)來,那么這個(gè)時(shí)候數(shù)據(jù)庫引擎返回給用戶丙執(zhí)行計(jì)劃的第一條記錄就是序號(hào)為3的記錄了。第一次掃描完畢后,再重新進(jìn)行第二次掃描,然后把序號(hào)為1的記錄返回給用戶乙。最后用戶甲顯示的記錄順序?yàn)?、2、3;而用戶乙顯示的記錄順序?yàn)?、3、1;用戶丙顯示的記錄順序?yàn)?、2、1。當(dāng)記錄比較少的時(shí)候,用戶還可以一目了然的指導(dǎo)查詢結(jié)果是相同的,只是順序顛倒了而已。但是如果記錄比較多的情況下,則用戶丙很可能會(huì)誤認(rèn)為其找到的記錄跟甲是不同的。因?yàn)轫樞蚧靵y,所以不能夠清楚的判斷所查找的記錄是否相同。

  為此在實(shí)際工作中,需要克服這個(gè)弊端。最簡(jiǎn)單的方式就是采用order by語句對(duì)查詢的結(jié)果進(jìn)行掃描。但是眾所周知,對(duì)記錄進(jìn)行排序會(huì)增加數(shù)據(jù)庫額外的開銷,會(huì)抵消高級(jí)掃描所帶來的性能提升的效果。故通常情況下對(duì)于可能需要用到高級(jí)掃描的SQL語句,不會(huì)采用order by等排序語句,除非用戶非常明確的有這方面的需要,才會(huì)把這個(gè)語句加入進(jìn)去。另外需要注意的是,有些匯總語句,如Group By等也會(huì)對(duì)記錄進(jìn)行自動(dòng)排序,這也會(huì)增加額外的負(fù)擔(dān)。但是一般來說,即使是需要對(duì)查詢結(jié)果進(jìn)行排序,那么排序過程中的開銷相比多次全表掃描的開銷來說,還是要小的多。也就是說,在高級(jí)掃描后進(jìn)行排序來解決這個(gè)記錄顯示順序不一致的情況,仍然是可行的。

四、影響高級(jí)掃描效果的因素

  如上的分析中,在一個(gè)查詢計(jì)劃的執(zhí)行過程中,如果越多的查詢計(jì)劃插入到其中來,那么這個(gè)高級(jí)掃描技術(shù)的效果就越佳。相反,如果一個(gè)查詢計(jì)劃完成后,仍然沒有用戶加入到這個(gè)查詢計(jì)劃中,那么這個(gè)高級(jí)掃描的功能就根本沒有發(fā)揮出來。此時(shí)查詢就只是一個(gè)簡(jiǎn)單的全表掃描。為此對(duì)這個(gè)高級(jí)掃描的效果,直接跟用戶的參與度相關(guān)。如果在一個(gè)比較短的時(shí)間間隔內(nèi),比較多的用戶發(fā)起了對(duì)一個(gè)表的查詢,那么高級(jí)掃描的效果才能夠體現(xiàn)出來。為此數(shù)據(jù)庫管理員需要知道,并不是在任何時(shí)候數(shù)據(jù)庫系統(tǒng)上實(shí)現(xiàn)高級(jí)掃描就可以實(shí)現(xiàn)比較高的數(shù)據(jù)庫性能。而是需要跟數(shù)據(jù)庫的實(shí)際應(yīng)用以及員工的作業(yè)有關(guān)。

  為此企業(yè)如果比較多的用戶需要對(duì)某張表進(jìn)行查詢的時(shí)候,那么就需要考慮是否能夠采用高級(jí)掃描。如在一個(gè)ERP系統(tǒng)中,其產(chǎn)品信息有幾百萬條。有多個(gè)用戶需要查詢這個(gè)產(chǎn)品信息表中的內(nèi)容,需要把查票信息導(dǎo)出來以作他用。此時(shí)各個(gè)部門的用戶如果在前后時(shí)間間隔不是很大的情況下,對(duì)這個(gè)表發(fā)起查詢作業(yè)。那么此時(shí)就可以利用高級(jí)掃描工具來共享掃描對(duì)結(jié)果,減少全表掃描此時(shí),提高掃描結(jié)果。

  除了用戶人數(shù)之外,還需要注意的是記錄的內(nèi)容多少也跟這個(gè)高級(jí)掃描的效果有關(guān)。如高紀(jì)錄比較到,則這個(gè)全表掃描的時(shí)間就比較長(zhǎng)。而執(zhí)行計(jì)劃長(zhǎng)了,則在這個(gè)執(zhí)行計(jì)劃的執(zhí)行過程中參與的用戶可能會(huì)越多。那無疑也可以提高高級(jí)掃描的效果。此時(shí)可以起到一個(gè)累加的效果,用戶總的等待時(shí)間會(huì)隨著參與到這個(gè)查詢計(jì)劃中來的用戶數(shù)量而減少。人數(shù)越多,用戶總的等待時(shí)間比全表掃描需要花費(fèi)的時(shí)間少的會(huì)更多。

以上就是我要為大家介紹的全部?jī)?nèi)容,希望能夠幫到大家,以后有什么好的東西會(huì)繼續(xù)跟大家分享。

【編輯推薦】

  1. 改善SQL Server數(shù)據(jù)庫查詢速度慢的技巧
  2. MySQL數(shù)據(jù)庫查詢優(yōu)化的3方案詳解
  3. 數(shù)據(jù)庫查詢的分頁優(yōu)化技巧
  4. 數(shù)據(jù)庫查詢初始化參數(shù)的方法
責(zé)任編輯:迎迎 來源: IT專家網(wǎng)
相關(guān)推薦

2010-05-10 15:50:39

Oracle數(shù)據(jù)庫性能

2022-12-05 08:00:00

數(shù)據(jù)庫向量化數(shù)據(jù)庫性能

2021-01-31 17:50:41

數(shù)據(jù)庫查詢程序員

2010-05-31 14:50:49

MySQL數(shù)據(jù)庫性能

2010-04-27 16:41:07

Oracle性能

2011-04-18 09:03:36

數(shù)據(jù)庫查詢

2022-06-28 15:00:28

數(shù)據(jù)庫性能操作系統(tǒng)

2013-03-13 10:56:42

高云數(shù)據(jù)庫數(shù)據(jù)庫算法

2011-04-02 09:33:08

MySQL數(shù)據(jù)庫查詢效率

2010-04-07 17:45:22

Oracle位圖索引

2011-04-02 09:33:13

MySQL數(shù)據(jù)庫查詢效率

2011-04-02 09:23:19

MySQL數(shù)據(jù)庫查詢效率

2011-04-13 09:19:05

Oracle數(shù)據(jù)庫系統(tǒng)性能

2023-07-12 08:55:16

PawSQL數(shù)據(jù)庫

2017-09-26 10:51:55

提高數(shù)據(jù)庫性能

2011-03-17 17:50:39

SQL Server數(shù)

2009-05-11 14:19:55

Oracle性能優(yōu)化數(shù)據(jù)庫

2015-04-22 14:41:04

云遷移Redis緩存數(shù)據(jù)模型調(diào)整

2011-08-03 18:01:54

MySQL數(shù)據(jù)庫提高查詢速度

2022-10-27 08:00:00

數(shù)據(jù)庫分片數(shù)據(jù)庫系統(tǒng)分層分區(qū)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)