王永剛 王秀霞
摘 要:數(shù)據(jù)庫最大的特點(diǎn)是查詢的便捷性,幾乎所有的數(shù)據(jù)庫操作都是在查詢的基礎(chǔ)上進(jìn)行的。查詢優(yōu)化提高了數(shù)據(jù)庫的查詢速度,也給數(shù)據(jù)的維護(hù)帶來了方便。本文對(duì) 數(shù)據(jù)庫查詢與統(tǒng)計(jì)進(jìn)行分析。
關(guān)鍵詞:數(shù)據(jù)庫;查詢;統(tǒng)計(jì)
引言
數(shù)據(jù)庫性能問題一直是決策者及技術(shù)人員共同關(guān)注的焦點(diǎn),影響數(shù)據(jù)庫性能的一個(gè)重要因素就是SQL查詢語句的效率。SQL 是結(jié)構(gòu)化查詢語言(Structured Query Language)的縮寫,SQL語言的功能包括數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制等部分,主要應(yīng)用于關(guān)系數(shù)據(jù)庫,實(shí)現(xiàn)了關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)檢索。
一、數(shù)據(jù)庫查詢優(yōu)化技術(shù)概述
1.1 自動(dòng)查詢優(yōu)化技術(shù)
SQL server的自動(dòng)查詢優(yōu)化技術(shù)由基于開銷的查詢優(yōu)化器來進(jìn)行的,當(dāng)提交一個(gè)SQL語句時(shí),這個(gè)語句只是表明想要從數(shù)據(jù)庫中得到什么樣的結(jié)果,對(duì)于怎么樣得到結(jié)果,SQL語句不會(huì)涉及。給予開銷的查詢優(yōu)化器以CPU的使用率和磁盤I/O作為判斷依據(jù)來為每個(gè)可能的執(zhí)行規(guī)劃賦予開銷值,然后優(yōu)化器會(huì)選擇開銷值最小的執(zhí)行規(guī)劃來執(zhí)行。
1.2 索引技術(shù)
在SQL server數(shù)據(jù)庫中,索引是一個(gè)物理性的數(shù)據(jù)庫結(jié)果,是單獨(dú)存在的,在檢索數(shù)據(jù)的時(shí)候,對(duì)磁盤的讀寫都需要占用很大的開銷,如果缺少了索引,就必須要對(duì)磁盤進(jìn)行識(shí)別。有了索引的幫助,查詢數(shù)據(jù)只需要索引頁面就行,索引能夠很大程度上提高查詢檢索速度。因此,要擁有查詢方便快捷的數(shù)據(jù)庫,索引是必不可少的。
1.3影響查詢效率的因素
SQL server數(shù)據(jù)庫系統(tǒng)在處理查詢計(jì)劃時(shí),首先要系統(tǒng)對(duì)詞法和語法進(jìn)行檢查,檢查完之后將其遞交給SQL server的查詢優(yōu)化器,優(yōu)化器會(huì)對(duì)數(shù)據(jù)是否存在和有效進(jìn)行索引,再進(jìn)行掃描、檢索和連接,這個(gè)計(jì)劃的執(zhí)行是在同一時(shí)間進(jìn)行的,通過分析來對(duì)計(jì)劃的執(zhí)行進(jìn)行評(píng)價(jià),通過開銷最小的計(jì)劃來實(shí)現(xiàn),然后預(yù)編譯模塊會(huì)對(duì)語句進(jìn)行處理,最后生成了查詢規(guī)劃,查詢規(guī)劃會(huì)在恰當(dāng)?shù)臅r(shí)間提交給系統(tǒng),系統(tǒng)會(huì)將執(zhí)行結(jié)果反饋給客戶。在SQL server數(shù)據(jù)庫中影響查詢效率的因素主要有五點(diǎn):第一,當(dāng)沒有索引或者索引無法使用的時(shí)候。因?yàn)樗饕軌蚶@開全表掃描,能夠有效提高查詢速度。第二,在進(jìn)行查詢工作的時(shí)候,缺少計(jì)算列的時(shí)候是無法進(jìn)行優(yōu)化查詢的。第三,查詢出來的數(shù)據(jù)量很大的時(shí)候也會(huì)影響查詢效率。第四,返回了不必要的行和列。第五,如果查詢的時(shí)候語句選擇不合理,就無法進(jìn)行優(yōu)化。語句選擇不合理的情況主要有查詢條件中的操作不合適,多個(gè)選擇條件進(jìn)行查詢時(shí),條件的次序不是最優(yōu)。
二、數(shù)據(jù)庫的查詢與統(tǒng)計(jì)優(yōu)化方法
2.1 建立索引
并不是所有的數(shù)據(jù)庫都有索引,因?yàn)楹芏鄶?shù)據(jù)庫不需要使用索引,索引是否應(yīng)該存在有一些爭(zhēng)議,究其原因,主要是數(shù)據(jù)庫系統(tǒng)當(dāng)中添加索引之后,再對(duì)數(shù)據(jù)庫進(jìn)行查詢的時(shí)候,就無法對(duì)數(shù)據(jù)庫中的所有內(nèi)容進(jìn)行掃描和查詢,只能在索引范圍之內(nèi)進(jìn)行查詢了?;谶@樣一種情況,從性能角度來說,目標(biāo)表記錄的總數(shù)是固定的,因此,只有當(dāng)查詢結(jié)果比較少的時(shí)候,索引才會(huì)有較高的查詢效率,如果查詢結(jié)果很多,那么索引會(huì)導(dǎo)致查詢效率降低,這也是索引的存在有爭(zhēng)議的原因。在實(shí)際情況中,數(shù)據(jù)庫系統(tǒng)要根據(jù)應(yīng)用目的和實(shí)際狀況進(jìn)行合理配置,那些記錄數(shù)較多的數(shù)據(jù)庫應(yīng)該要建立索引,從而有效提高查詢效率。
2.2 SQL 查詢語句的優(yōu)化策略
一個(gè)數(shù)據(jù)庫系統(tǒng)的反應(yīng)速度的快慢,最為直接的表現(xiàn)就是優(yōu)化器的計(jì)算方法。另外,優(yōu)化器的測(cè)量和查詢表中的其他內(nèi)容和服務(wù)存在關(guān)聯(lián)。由此可見,讓優(yōu)化器選擇恰當(dāng)?shù)乃饕捅磉_(dá)的連接手段是十分重要的。
2.3 避免全表掃描
一般情況下,數(shù)據(jù)庫在進(jìn)行查詢或者select語句的處理過程中,會(huì)掃描全表,在執(zhí)行的時(shí)候,如果出現(xiàn)數(shù)據(jù)更新和數(shù)據(jù)刪除的情況也會(huì)掃描全表。如果添加索引的話,能夠讓數(shù)據(jù)訪問的速度得到提升。而要建立科學(xué)合理的索引,那就必須要充分了解數(shù)據(jù),然后在實(shí)踐中不斷進(jìn)行優(yōu)化。
2.4 合理使用索引
索引在數(shù)據(jù)庫中占有重要的地位,其對(duì)查詢速度的提高有著十分明顯的效果。但是創(chuàng)建和使用索引的時(shí)候,索引都必須跟系統(tǒng)的查詢需求一致。
2.5 選擇恰當(dāng)?shù)牟僮鞣岣卟樵冃?/p>
應(yīng)該要盡可能的少用(NOT)IN,而使用(NOT)EXISTS,此外,還要盡量避免使用OR運(yùn)算符,>和<可以用>=和<=來代替,同時(shí),對(duì)于諸如IS NULL和 IS NOT NULL等操作也要盡量避免,另外,還要注意LIKE操作符的正確使用。
2.6 避免使用SELECT進(jìn)行查詢
在使用SQL語句的時(shí)候,一定要特別注意書寫細(xì)節(jié),避免使用SELECT來進(jìn)行查詢,在進(jìn)行篩選的時(shí)候,盡量避免使用表達(dá)式,而要用常量來代替,而且如果表中數(shù)據(jù)量很大的話,要特別注意WHERE子句中的篩選條件的順序,因?yàn)檫@會(huì)直接影響查詢效率。
2.7 SQL語句對(duì)索引的利用
在實(shí)際的應(yīng)用中,聚集索引的效率要比非聚集索引要高,聚集索引能夠?qū)?shù)據(jù)在物理順序上進(jìn)行排列,計(jì)算在其中存在一些重復(fù)值,但是仍然集中在一起,這就能夠?qū)⒉樵兎秶i定在一個(gè)較小范圍之內(nèi),可以有效提高掃描速度。
2.8 合理使用臨時(shí)表
針對(duì)那些數(shù)據(jù)量很大,但是數(shù)據(jù)變化不是很多的數(shù)據(jù)庫表,可以將子集排序,同時(shí)創(chuàng)建臨時(shí)表,這就有效防止了多重排序操作,提高了查詢速度。
2.9 建立視圖
建立視圖可以幫助人們更方便的進(jìn)行數(shù)據(jù)查詢等操作,因?yàn)橐晥D可以讓人們重點(diǎn)關(guān)注他們想要了解和感興趣的數(shù)據(jù)和信息。在建立視圖的時(shí)候一定要控制視圖的規(guī)模,如果視圖的規(guī)模比基本表要小,那么,查詢速度會(huì)大大提高。
三、 SQL查詢安全監(jiān)控系統(tǒng)
SQL數(shù)據(jù)庫系統(tǒng)的安全性也是人們關(guān)注的焦點(diǎn),如果發(fā)現(xiàn)用戶進(jìn)行非法操作,系統(tǒng)就會(huì)自行進(jìn)行處理。在監(jiān)控攻擊行為的時(shí)候,系統(tǒng)會(huì)對(duì)非法用戶發(fā)出警告,同時(shí)還會(huì)對(duì)相關(guān)信息進(jìn)行記錄,在必要的情況下,還可能會(huì)阻斷網(wǎng)絡(luò)。在SQL系統(tǒng)中,有信息獲取、分析機(jī)和控制臺(tái)三個(gè)子系統(tǒng),這三個(gè)系統(tǒng)之間會(huì)存在交互工作。
3.1 主機(jī)來實(shí)現(xiàn)報(bào)警
開啟探頭之后,可以獨(dú)立監(jiān)控?cái)?shù)據(jù)庫,給予數(shù)據(jù)庫中的相關(guān)信息,把信息根據(jù)一定的規(guī)則進(jìn)行分析,通過分析,判斷數(shù)據(jù)庫是否存在安全隱患,并且確定是否需要發(fā)出危險(xiǎn)警報(bào)。如果某臺(tái)的計(jì)算機(jī)在進(jìn)行非法操作的時(shí)候,系統(tǒng)會(huì)記錄該計(jì)算機(jī)的IP地址,并且按照上述步驟進(jìn)行操作,控制臺(tái)一旦收到危險(xiǎn)警報(bào),就會(huì)根據(jù)指令來執(zhí)行阻斷指令。分析機(jī)把阻斷指令傳遞給探頭,探頭會(huì)調(diào)用SQL server數(shù)據(jù)庫系統(tǒng)中的API函數(shù),從而對(duì)進(jìn)行非法操作的計(jì)算機(jī)的操作行為進(jìn)行攔截,保證數(shù)據(jù)庫中的數(shù)據(jù)和信息不會(huì)被泄漏、丟失和破壞。
3.2 下發(fā)命令
當(dāng)控制臺(tái)發(fā)出指令之后,指令會(huì)傳遞給分析機(jī)和信息獲取部分,最后會(huì)通過對(duì)模塊的響應(yīng)來實(shí)現(xiàn)指令的操作。
3.3 傳送相關(guān)數(shù)據(jù)
探頭、分析機(jī)和控制臺(tái)三者之間的數(shù)據(jù)傳遞都是通過端口來進(jìn)行的,要有效傳送數(shù)據(jù)和信息,這些信息的格式是要統(tǒng)一的,如果不是統(tǒng)一的標(biāo)準(zhǔn)格式,信息無法傳遞和接收。
四、結(jié)束語
數(shù)據(jù)庫系統(tǒng)是一個(gè)很龐大的系統(tǒng),在應(yīng)用過程中,數(shù)據(jù)庫的運(yùn)行速度和運(yùn)行效率是十分重要的,有些數(shù)據(jù)庫運(yùn)行速度慢、運(yùn)行效率低,嚴(yán)重影響了數(shù)據(jù)庫的性能。因此,在設(shè)計(jì)和開發(fā)數(shù)據(jù)庫的時(shí)候,一定要將數(shù)據(jù)庫的運(yùn)行速度和效率放到重要位置。
參考文獻(xiàn):
[1]朱敏英.數(shù)據(jù)庫SQL查詢語句優(yōu)化研究[J].信息與電腦(理論版),2013(06):117-119.
[2]苗雯娟.MS SQL Server數(shù)據(jù)庫查詢優(yōu)化技巧研究[J].企業(yè)導(dǎo)報(bào),2012(16):274.