您好,登錄后才能下訂單哦!
SQL性能優(yōu)化提升的方法有哪些?這個問題可能是我們?nèi)粘W習或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
? 簡單的性能優(yōu)化
Sql的性能優(yōu)化是數(shù)據(jù)庫工程師在實際工作中必須面對的重要課題之一。對于某些數(shù)據(jù)庫工程師來說,它幾乎唯一的命題。實際上,像WEB服務這樣需要快速響應的應用場景中,SQL的性能直接決定了系統(tǒng)是否可以使用。這里主要介紹一些使用SQL執(zhí)行速度更快,消耗內(nèi)存更少的優(yōu)化技巧,今天的文章只介紹其中的一種,后續(xù)會繼續(xù)更新一些其它的優(yōu)化方式。
嚴格地優(yōu)化查詢性能時,必須要了解所使用的數(shù)據(jù)庫的功能特點。此外,查詢速度慢并不只是因為SQL語句本身,還可能是因為內(nèi)存分配不佳,文件結(jié)構(gòu)不合理等其他原因。因此這里介紹的優(yōu)化SQL的方法未必能解決所有的性能問題,但是確實很多時候的查詢性能不好的原因還是SQL的寫法不合理。
? 使用高效的查詢
在SQL中,很多時候不同代碼能夠得到相同的結(jié)果。從理論上來說,得到相同結(jié)果的不同代碼應該有相同的性能,但遺憾的是,查詢優(yōu)化器生成的執(zhí)行計劃很大程度要受到代碼外部結(jié)構(gòu)的影響。因此如果想優(yōu)化查詢性能,必須知道如何寫代碼才能使優(yōu)化器的執(zhí)行效率更高。
參數(shù)是子查詢時,使用EXISTS代替IN
IN謂詞非常方便,而且代碼容易理解,所以使用的頻率很高。但是方便的同時,IN謂詞卻有成為性能優(yōu)化的瓶頸的危險。如果代碼中大量用到IN謂詞,那么一般只對它們進行優(yōu)化就能大幅度地提升性能。
如果IN的參數(shù)是“1,2,3”這樣的數(shù)值列表,一般還不需要特別注意。但是如果參數(shù)是子查詢,那么就需要注意了。
大多數(shù)情況,[NOT]IN和[NOT]EXISTS返回的結(jié)果是相同的。但是兩者用于子查詢時,EXISTS的速度會更快一些。
下面來看個例子:
我們試著從Class_A表中查出同時存在于Class_B表中的員工。下面兩條SQL語句返回的結(jié)果是一樣的,但是使用EXISTS的SQL語句更快一些。
兩個結(jié)果都如下所示:
使用EXISTS時更快的原因有以下兩個。
a) 如果連接列(id)上建立了索引,那么查詢Class_B時不用查詢實際的表,只需查索引就可以了。
b) 如果使用EXISTS,那么只要查到一行數(shù)據(jù)滿足條件就會終止查詢,不用像使用IN時一樣掃描全表。在這一點上NOT EXISTS也一樣。
當IN的參數(shù)是子查詢時,數(shù)據(jù)庫首先會執(zhí)行子查詢,然后將結(jié)果存儲在一張臨時的工作表里(內(nèi)聯(lián)視圖),然后掃描整個視圖。很多情況下這種做法都非常耗費資源。使用EXISTS的話,數(shù)據(jù)庫不會生成臨時的工作表。
但是從代碼的可讀性上來看,IN要比EXISTS好。使用IN時的代碼看起來更一目了然,易于理解。因此,如果確信使用IN也能快速獲取結(jié)果,就沒有必要非得改成EXISTS了。
而且,最近有很多數(shù)據(jù)庫也嘗試著改善了IN的性能。也許未來的某一天,無論哪個數(shù)據(jù)庫上,IN都能具體和EXISTS一樣的性能。
參數(shù)是子查詢時,使用連接代替IN
要想改善IN的性能,除了使用EXISTS,還可以使用連接。前面的查詢語句就可以像下面這樣“扁平化”。
這種寫法至少能用到一張表的“id”列上的索引。而且,因為沒有了子查詢,所以數(shù)據(jù)庫也不會生成中間表。我們很難說與EXISTS相比哪個更好,但是如果沒有索引,那么與連接相比,可能EXISTS會略勝一籌。而且從很多查詢可以看出,有些情況下使用EXISTS比使用連接更合適。
感謝各位的閱讀!看完上述內(nèi)容,你們對SQL性能優(yōu)化提升的方法有哪些大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關文章內(nèi)容,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。