薛亞
摘要:數(shù)據(jù)庫最大的特點(diǎn)是查詢的便捷性,幾乎所有的數(shù)據(jù)庫操作都是在查詢的基礎(chǔ)上進(jìn)行的。查詢優(yōu)化提高了數(shù)據(jù)庫的查詢速度,也給數(shù)據(jù)的維護(hù)帶來了方便。
關(guān)鍵詞:SQL server;數(shù)據(jù)庫;查詢優(yōu)化
中圖分類號(hào):TP315 文獻(xiàn)標(biāo)識(shí)碼:A
Query Optimization of SQL Server Database
XUE Ya
(Changzhou Technical Institute of Tourism & Commerce,Changzhou 213032,China)
Abstract:Query convenience is the biggest characteristic of databse.Almost all database operations are performed on the basis of the query.Database query optimization can improves the query speed and bring convenicence to maintenance of datadbase.
Keywords:SQL server;database;query optimization
1 引言(Introduction)
在計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)技術(shù)飛速發(fā)展的今天,互聯(lián)網(wǎng)已經(jīng)遍布了世界的各個(gè)角落,應(yīng)用在各行各業(yè)當(dāng)中,其中,數(shù)據(jù)庫技術(shù)始終占有重要地位[1,2]。SQL server數(shù)據(jù)庫系統(tǒng)是由微軟公司推出的一種關(guān)系型數(shù)據(jù)庫系統(tǒng),是可擴(kuò)展性強(qiáng)、高性能和為分布式客戶機(jī)/服務(wù)器計(jì)算機(jī)所設(shè)計(jì)的數(shù)據(jù)庫管理系統(tǒng)。SQL server數(shù)據(jù)庫系統(tǒng)的應(yīng)用十分廣泛。
SQL server數(shù)據(jù)庫系統(tǒng)要正常的運(yùn)行,就必須對(duì)其進(jìn)行日常的維護(hù),在維護(hù)數(shù)據(jù)庫系統(tǒng)時(shí),必須要制定詳細(xì)的維護(hù)計(jì)劃,因?yàn)榫S護(hù)任務(wù)中最為重要的目標(biāo)是降低系統(tǒng)發(fā)生故障的時(shí)間。SQL server數(shù)據(jù)庫的維護(hù)工作非常重要,應(yīng)該要引起數(shù)據(jù)庫管理人員的充分重視,因?yàn)镾QL server數(shù)據(jù)庫系統(tǒng)的維護(hù)范圍非常廣泛,包括操作系統(tǒng)的維護(hù)、SQL server數(shù)據(jù)庫系統(tǒng)的優(yōu)化等。
2數(shù)據(jù)庫查詢優(yōu)化技術(shù)概述(Introduce technology
of database query optimization)
在SQL server數(shù)據(jù)庫系統(tǒng)中,每一次進(jìn)行查詢,數(shù)據(jù)庫內(nèi)核都需要使用優(yōu)化器優(yōu)化向SQL提交的數(shù)據(jù)操作。在優(yōu)化過程當(dāng)中,首先SQL要對(duì)句子能夠進(jìn)行優(yōu)化作出判斷,如果發(fā)現(xiàn)無法進(jìn)行優(yōu)化,那么就要掃描整個(gè)表格,如果可以進(jìn)行優(yōu)化,那么就會(huì)通過優(yōu)化器來執(zhí)行索引的選擇。通過索引來判斷能夠使用的索引,并且評(píng)定每個(gè)句子的開銷。下面對(duì)SQL server查詢優(yōu)化技術(shù)進(jìn)行一下簡(jiǎn)單概述:
2.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í)行。
2.2 索引技術(shù)
在SQL server數(shù)據(jù)庫中,索引是一個(gè)物理性的數(shù)據(jù)庫結(jié)果,是單獨(dú)存在的,在檢索數(shù)據(jù)的時(shí)候,對(duì)磁盤的讀寫都需要占用很大的開銷,如果缺少了索引,就必須要對(duì)磁盤進(jìn)行識(shí)別。有了索引的幫助,查詢數(shù)據(jù)只需要索引頁面就行,索引能夠很大程度上提高查詢檢索速度。因此,要擁有查詢方便快捷的數(shù)據(jù)庫,索引是必不可少的。
2.3 存儲(chǔ)過程的使用
目前,client/server應(yīng)用程序已經(jīng)被廣泛使用。在網(wǎng)絡(luò)中,SQL查詢性能的一個(gè)很重要的體現(xiàn)就是如何最大程度上使用資源而減少流量。使用存儲(chǔ),目的是減少流量,提高速度。
2.4 使用面向?qū)ο蟮姆椒▉韺?shí)現(xiàn)SQL server查詢優(yōu)化
所謂的面向?qū)ο蟮牟樵兎椒?,把?duì)象作為中心點(diǎn),以類和繼承作為構(gòu)造機(jī)制,從而更好的設(shè)計(jì)和構(gòu)建相應(yīng)的軟件系統(tǒng)。
2.5 影響查詢效率的因素
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)。
3 SQL server數(shù)據(jù)庫的查詢優(yōu)化方法(The method
of SQL server database query optimization)
3.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)該要建立索引,從而有效提高查詢效率。
3.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á)的連接手段是十分重要的。
3.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)化。
3.4 合理使用索引
索引在數(shù)據(jù)庫中占有重要的地位,其對(duì)查詢速度的提高有著十分明顯的效果[3]。但是創(chuàng)建和使用索引的時(shí)候,索引都必須跟系統(tǒng)的查詢需求一致。
3.5 選擇恰當(dāng)?shù)牟僮鞣?,提高查詢效?/p>
應(yīng)該要盡可能的少用(NOT)IN,而使用(NOT)EXISTS,此外,還要盡量避免使用OR運(yùn)算符,>和<可以用>=和<=來代替,同時(shí),對(duì)于諸如IS NULL和 IS NOT NULL等操作也要盡量避免,另外,還要注意LIKE操作符的正確使用。
3.6 避免使用SELECT進(jìn)行查詢
endprint
在使用SQL語句的時(shí)候,一定要特別注意書寫細(xì)節(jié),避免使用SELECT來進(jìn)行查詢,在進(jìn)行篩選的時(shí)候,盡量避免使用表達(dá)式,而要用常量來代替,而且如果表中數(shù)據(jù)量很大的話,要特別注意WHERE子句中的篩選條件的順序,因?yàn)檫@會(huì)直接影響查詢效率。
3.7 SQL語句對(duì)索引的利用
在實(shí)際的應(yīng)用中,聚集索引的效率要比非聚集索引要高,聚集索引能夠?qū)?shù)據(jù)在物理順序上進(jìn)行排列,計(jì)算在其中存在一些重復(fù)值,但是仍然集中在一起,這就能夠?qū)⒉樵兎秶i定在一個(gè)較小范圍之內(nèi),可以有效提高掃描速度。
3.8 合理使用臨時(shí)表
針對(duì)那些數(shù)據(jù)量很大,但是數(shù)據(jù)變化不是很多的數(shù)據(jù)庫表,可以將子集排序,同時(shí)創(chuàng)建臨時(shí)表,這就有效防止了多重排序操作,提高了查詢速度。
3.9 建立視圖
建立視圖可以幫助人們更方便的進(jìn)行數(shù)據(jù)查詢等操作,因?yàn)橐晥D可以讓人們重點(diǎn)關(guān)注他們想要了解和感興趣的數(shù)據(jù)和信息。在建立視圖的時(shí)候一定要控制視圖的規(guī)模,如果視圖的規(guī)模比基本表要小,那么,查詢速度會(huì)大大提高。
4 SQL查詢安全監(jiān)控系統(tǒng)(The SQL query safety
monitoring system)
SQL數(shù)據(jù)庫系統(tǒng)的安全性也是人們關(guān)注的焦點(diǎn)[4-6],如果發(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ì)存在交互工作。
4.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ì)被泄漏、丟失和破壞。
4.2 下發(fā)命令
當(dāng)控制臺(tái)發(fā)出指令之后,指令會(huì)傳遞給分析機(jī)和信息獲取部分,最后會(huì)通過對(duì)模塊的響應(yīng)來實(shí)現(xiàn)指令的操作。
4.3 傳送相關(guān)數(shù)據(jù)
探頭、分析機(jī)和控制臺(tái)三者之間的數(shù)據(jù)傳遞都是通過端口來進(jìn)行的,要有效傳送數(shù)據(jù)和信息,這些信息的格式是要統(tǒng)一的,如果不是統(tǒng)一的標(biāo)準(zhǔn)格式,信息無法傳遞和接收。
5 結(jié)論(Conclusion)
SQL server數(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)行速度和效率放到重要位置。要有效提高數(shù)據(jù)庫的使用效率和查詢效率,就必須對(duì)數(shù)據(jù)庫進(jìn)行全面的分析,了解數(shù)據(jù)庫的缺陷,優(yōu)化語句設(shè)計(jì),從而發(fā)現(xiàn)語句查詢優(yōu)化的關(guān)鍵。進(jìn)行數(shù)據(jù)庫查詢優(yōu)化是一項(xiàng)復(fù)雜的工作,需要從整體的角度來綜合處理,要從各個(gè)方面分析影響查詢優(yōu)化的因素,依據(jù)實(shí)際情況來優(yōu)化SQL語句。科學(xué)合理的設(shè)計(jì)數(shù)據(jù)庫是數(shù)據(jù)庫運(yùn)行良好的基礎(chǔ),在此基礎(chǔ)上,對(duì)數(shù)據(jù)庫進(jìn)行優(yōu)化能夠提高查詢效率,從而滿足用戶的需求。
參考文獻(xiàn)(References)
[1] 劉芬.關(guān)于SQL數(shù)據(jù)庫的性能優(yōu)化問題的研究[J].軟件,2012,33(6):139-141.
[2] 楊潤(rùn)秋,張慶敏,張愷翊.基于防火墻技術(shù)對(duì)網(wǎng)絡(luò)安全防護(hù)的認(rèn)識(shí)[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2013(15):137;139.
[3] 李麗宏,趙娜.卡爾曼濾波在動(dòng)態(tài)汽車衡稱量中的應(yīng)用[J].軟件,2012,33(3):25-28.
[4] 李輝,王至邀.一種多條件分頁查詢優(yōu)化方法的設(shè)計(jì)[J].計(jì)算機(jī)工程,2010(2):23-24.
[5] 王力,王成良.基于免疫遺傳算法的關(guān)系型數(shù)據(jù)庫查詢優(yōu)化技術(shù)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2008,18(1):72-75.
[6] 石劍平,蔡光程.SQL Server 2005查詢優(yōu)化技術(shù)的研究與實(shí)現(xiàn)[J].信息系統(tǒng)工程,2010,23(5):78-79.
作者簡(jiǎn)介:
薛 亞(1979-),女,碩士,講師.研究領(lǐng)域:計(jì)算機(jī)軟件及應(yīng)用.
endprint