摘要:基于關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)查詢語言SQL被大量的應(yīng)用到數(shù)據(jù)庫(kù)內(nèi),利用其查詢與檢索方面的功能可以使得系統(tǒng)運(yùn)行更加的準(zhǔn)確,但是效率方面卻并不理想。數(shù)據(jù)庫(kù)性能水平高低通常需要從響應(yīng)時(shí)間與吞吐量方面出發(fā)分析。響應(yīng)時(shí)間越短、吞吐量越大,則表示數(shù)據(jù)庫(kù)功能越強(qiáng)。本文重點(diǎn)分析的是數(shù)據(jù)庫(kù)內(nèi)進(jìn)行SQL語句優(yōu)化的主要方法,提出具體優(yōu)化原則。
關(guān)鍵詞:數(shù)據(jù)庫(kù)性能;查詢;優(yōu)化;SQL語句1SQL概述
查詢優(yōu)化是關(guān)系數(shù)據(jù)庫(kù)內(nèi)極為重要的組成部分,其能夠讓各項(xiàng)關(guān)系數(shù)據(jù)庫(kù)與非過程化的SQL查詢語言發(fā)展取得非常好的效果。而針對(duì)優(yōu)化來說,其對(duì)于系統(tǒng)方面的運(yùn)行既是機(jī)遇,也是挑戰(zhàn)。挑戰(zhàn)主要就是關(guān)系系統(tǒng)為了能夠達(dá)到用戶使用的最低功能而進(jìn)行查詢優(yōu)化。因?yàn)殛P(guān)系表達(dá)式的語義級(jí)別是很高的,這樣就會(huì)讓整個(gè)關(guān)系系統(tǒng)能夠體現(xiàn)出具體的查詢語義,進(jìn)而讓查詢優(yōu)化提升總體效果。
當(dāng)前,目前所應(yīng)用的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)絕大多數(shù)都能夠通過應(yīng)用查詢語言SQL(Structured Query Language)來實(shí)現(xiàn)優(yōu)化。數(shù)據(jù)庫(kù)管理系統(tǒng)在運(yùn)行之后,可以高效獲得各項(xiàng)數(shù)據(jù)信息,了解維護(hù)效果,合理的組織進(jìn)行存儲(chǔ)數(shù)據(jù)運(yùn)行。其能夠?qū)崿F(xiàn)數(shù)據(jù)庫(kù)的管理與控制,確保數(shù)據(jù)庫(kù)運(yùn)行更加的安全、可靠,同時(shí)還能夠?qū)崿F(xiàn)數(shù)據(jù)共享。在用戶根據(jù)需要檢索相應(yīng)數(shù)據(jù)信息,能夠利用SQL語言直接將請(qǐng)求發(fā)射出去,系統(tǒng)會(huì)自動(dòng)處理該請(qǐng)求,將檢索到的數(shù)據(jù)直接發(fā)回給用戶。
數(shù)據(jù)庫(kù)操作過程中,查詢工作量是巨大的,在實(shí)際應(yīng)用中是通過SE-LECT語句在SQL語句中的代價(jià)是最大的。如果在操作中應(yīng)用了優(yōu)秀查詢策略,就能夠提高查詢的速度和質(zhì)量,縮短查詢時(shí)間,其對(duì)于查詢有著非常高的效果。人們通過在應(yīng)用SQL查詢語句時(shí)有錯(cuò)誤觀點(diǎn),就是過度的重視正確率,卻沒有關(guān)注不同的SQL查詢語句實(shí)現(xiàn)方式所存在的不同點(diǎn),這種不同點(diǎn)在復(fù)雜數(shù)據(jù)庫(kù)中應(yīng)用效果更好。
通過合理檢索方式可以提升查詢效率,但是如果SQL查詢語句缺乏合理性,就會(huì)導(dǎo)致索引功能難以實(shí)現(xiàn),因此,應(yīng)該能夠?qū)懗鯯QL查詢語句,還要提升該語句的性能,以保證檢索的效率和質(zhì)量符合人們使用需要。
2物理查詢
select*fromtab1,tab2wheretab1.id=tab2.idandtab1.col1=123and tab2.col1='abc'照這個(gè)語句的順序,先要tab1和tab2進(jìn)行笛卡爾乘積,再按照tab1.col1=123and tab2.col1='abc'進(jìn)行篩選。從這個(gè)方面出發(fā),即使是初學(xué)者也認(rèn)為該方式的查詢效率是極低的,首先應(yīng)該充分了解邏輯處理與物力處理之間的差異,邏輯處理是執(zhí)行該查詢能夠獲得怎樣的結(jié)果,而邏輯查詢的各個(gè)環(huán)節(jié)都要從該查詢?cè)谶壿媹?zhí)行者的先后順序,按照該順序得到相應(yīng)的查詢結(jié)果,這與數(shù)學(xué)中先乘除后加減的運(yùn)算順序的原理是相同的。
邏輯查詢的目的是獲取所需要的結(jié)果,而獲得該結(jié)果需要經(jīng)過怎樣的過程卻是不關(guān)心的。而物理處理是獲得該結(jié)果的同時(shí),還要確保其性能合理。下面具體分析物理處理方式。
當(dāng)一個(gè)SQL查詢語句進(jìn)入到數(shù)據(jù)庫(kù)搜索引擎之后,其主要的作用就是按照查詢計(jì)劃開展工作,此時(shí)會(huì)有兩種情況發(fā)生,其一就是緩存中無法確定具體的查詢計(jì)劃方式,然后系統(tǒng)會(huì)根據(jù)需要自動(dòng)生成另外一個(gè)計(jì)劃;其二是該查詢計(jì)劃已經(jīng)真實(shí)的存在與緩存中,然后就是根據(jù)該計(jì)劃開始進(jìn)行查詢作業(yè)。
執(zhí)行計(jì)劃在編譯生成階段,具體要經(jīng)過如下幾個(gè)步驟才能實(shí)現(xiàn):
第一步:分析,這是進(jìn)行分批處理形成分析樹的主要環(huán)節(jié),同時(shí)還應(yīng)該根據(jù)需要來檢測(cè)確定語句是否能夠達(dá)到正確性的標(biāo)準(zhǔn)。
第二步:代數(shù)化,該階段的作用就是進(jìn)行第一步分析樹的輸入,生成之后可以形成查詢處理器作為輸出內(nèi)容,進(jìn)而可以實(shí)現(xiàn)查詢優(yōu)化的效果。
第三步:查詢優(yōu)化,主要是通過查詢優(yōu)化器組件來完成該步驟。查詢階段需要明確具體的順序訪問表,然后確定具體的索引方法,經(jīng)過確定各種聯(lián)接算法來明確具體的查詢優(yōu)化器組件,但是該方式的確定并不是隨意進(jìn)行的,應(yīng)該達(dá)到前提條件才能進(jìn)行,以保證最終的結(jié)果集符合人們的查詢需要。從這一方面出發(fā),結(jié)果集必須要按照具體的邏輯處理方式來得到相應(yīng)的各個(gè)階段的結(jié)果。優(yōu)化器應(yīng)該根據(jù)需要實(shí)現(xiàn)查詢的多個(gè)變體確定,最終能夠確定成本最低的一個(gè)查詢計(jì)劃。
3???? SQL子句分析
數(shù)據(jù)庫(kù)查詢作業(yè)的設(shè)計(jì)過程中,所使用的查詢數(shù)據(jù)的樣式也是多樣化的,但是選擇哪個(gè)語句來進(jìn)行,就顯得尤為重要,這是因?yàn)槠鋾?huì)影響最終的查詢效率。因此,在帶有where條件時(shí),應(yīng)該有效的預(yù)防在WHERE句子內(nèi)的字段來開展函數(shù)或者表達(dá)式的操作,這樣就會(huì)出現(xiàn)引擎索引無法進(jìn)行而開展全表的掃描處理,造成查詢的工作效率比較差。任何的對(duì)列操作的使用都會(huì)產(chǎn)生表掃描,其主要包含計(jì)算表達(dá)式、數(shù)據(jù)庫(kù)函數(shù)等等方面,在具體的查詢操作中,將其移動(dòng)到等號(hào)右邊來進(jìn)行。
4???? SQL語句優(yōu)化原則
“20%的代碼用去了80%的時(shí)間”,這是開展程序設(shè)計(jì)中的重要定律和指導(dǎo)思想,數(shù)據(jù)庫(kù)的操作實(shí)踐中也應(yīng)該重視這一方面。查詢優(yōu)化應(yīng)該掌握具體的問題,比如數(shù)據(jù)庫(kù)的應(yīng)用程序,主要的目的就是要有效的提升SQL運(yùn)行的效率。查詢優(yōu)化最為關(guān)鍵的是從服務(wù)器內(nèi)獲得相應(yīng)數(shù)據(jù),并不是按照順序進(jìn)行全部?jī)?nèi)容讀取。
關(guān)系數(shù)據(jù)庫(kù)查詢優(yōu)化要按照如下原則來進(jìn)行:①要盡量的先進(jìn)行選擇運(yùn)算的操作,然后能夠獲得相對(duì)比較小的中間結(jié)果;②把多個(gè)選擇與投影操作要同時(shí)執(zhí)行,能夠避免分次掃描文件而導(dǎo)致效率較低;③投影操作應(yīng)該根據(jù)雙目核算的方式來進(jìn)行;④把笛卡兒積和其后的選擇運(yùn)算合并,能夠有效的縮短時(shí)間;⑤如果是文件要連接則要合理進(jìn)行排序或者索引,能夠有效對(duì)應(yīng)各個(gè)關(guān)系;⑥按照小關(guān)系運(yùn)算優(yōu)化處理的原則,減少中間結(jié)果;⑦把表內(nèi)和查詢結(jié)果沒有關(guān)系的屬性全部剔除,能夠減少中間結(jié)果的數(shù)量;⑧提取公共表達(dá)式,根據(jù)要求預(yù)先保存,可以防止出現(xiàn)重復(fù)計(jì)算,縮短時(shí)間。
上述原則的應(yīng)用能夠提升查詢速度,但是很多條件之下,要經(jīng)過多次反復(fù)試驗(yàn)才能確定最為合理的實(shí)施方案。測(cè)試是最有效的方式,可以把相同功能的不同SQL語句執(zhí)行情況進(jìn)行考察分析,但是數(shù)據(jù)庫(kù)內(nèi)數(shù)據(jù)量很少,無法通過比較實(shí)現(xiàn),應(yīng)該查看執(zhí)行計(jì)劃,就能夠把相同功能的多條SQL語句全部都輸入到系統(tǒng)內(nèi),然后再按CTRL+L查看所利用的索引表掃描次數(shù)。
5結(jié)束語
數(shù)據(jù)庫(kù)設(shè)計(jì)的水平,會(huì)直接影響管理系統(tǒng)的各項(xiàng)功能,而數(shù)據(jù)庫(kù)優(yōu)化則是進(jìn)行水平分析的重要指標(biāo)。因此,在數(shù)據(jù)庫(kù)優(yōu)化中,應(yīng)該重視各項(xiàng)措施的應(yīng)用,做好各個(gè)方面問題的考慮與分析,但是因?yàn)槠溆绊懸蛩乇容^多,所以在設(shè)計(jì)中還會(huì)存在很多矛盾。這就需要綜合使用各種數(shù)據(jù)庫(kù)設(shè)計(jì)方式,以提升數(shù)據(jù)庫(kù)的性能,達(dá)到最優(yōu)化的應(yīng)用效果,使得系統(tǒng)開發(fā)效率和質(zhì)量得以有效的提升。
參考文獻(xiàn):
[1]?? 張欣.基于SQL標(biāo)準(zhǔn)的關(guān)系數(shù)據(jù)庫(kù)查詢優(yōu)化技術(shù)研究[J].煤炭技術(shù)(12):284-286.
[2]?? 肖輝輝,段艷明.關(guān)系數(shù)據(jù)庫(kù)SQL語句的設(shè)計(jì)優(yōu)化研究[J].軟件導(dǎo)刊,2010,09(012):177-179.
[3]?? 龔成鵬.基于關(guān)系型數(shù)據(jù)庫(kù)中SQL語句優(yōu)化規(guī)則的研究[D].2019.
作者簡(jiǎn)介:
佘雅婷(1991年9月)女,漢,河南省鄭州市,當(dāng)前職務(wù):專員,當(dāng)前職稱:助理工程師,學(xué)歷:研究生.