久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何讓SQL再快一點兒

169次閱讀
沒有評論

共計 2325 個字符,預計需要花費 6 分鐘才能閱讀完成。

這篇文章將為大家詳細講解有關如何讓 SQL 再快一點兒,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

SQL 即結構化查詢語言 (Structured Query Language),是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用于存取數據以及查詢、更新和管理關系型數據庫系統。

從接觸編程到現在一直從事和數據庫相關的工作,SQL 是我使用時間最長的程序語言,沒有之一。

關于 SQL 優化的文章網上很多,很具體,寫的很不錯,這里不再贅述。這篇文章將會結合平時工作中遇到的問題和經驗心得來闡述如何做好 SQL 優化,其中有錯誤和不足的地方,還請大家糾正補充。

對于數據庫優化有兩個層面,一是 SQL 優化,屬于業務層優化;一是數據庫設計、表空間規劃、緩存等屬于管理層面的優化,我們這里只討論 SQL 優化這個層面。

接受挑戰

不要被運行效率低下或者復雜的 SQL 嚇倒,要勇于接收它的挑戰,問題很明確就是要把這個 SQL 優化快一點,解決方法肯定比遇到的問題多。

越是運行慢,越是復雜的 SQL 優化的空間就越大。

分析場景

數據處理大致可以分成兩大類:聯機事務處理 OLTP(on-line transaction processing)、聯機分析處理 OLAP(On-Line Analytical Processing)。OLTP 是傳統的關系型數據庫的主要應用,主要是基本的、日常的事務處理,例如銀行交易。OLAP 是數據倉庫系統的主要應用,支持復雜的分析操作,側重決策支持,并且提供直觀易懂的查詢結果。 

OLTP 系統強調數據庫內存效率,強調內存各種指標的命令率,強調綁定變量,強調并發操作,對于 SQL 的執行效率有很高的要求;

OLAP 系統則強調數據分析,強調 SQL 執行時機,強調磁盤 I /O,強調分區等。

OLTP 要求事務一致性和快速執行,SQL 執行時間一般以毫秒或者秒為單位;OLAP 對事務一致性要求不高,SQL 執行時間以分鐘或者小時為單位。因此,不同的業務場景,SQL 優化的方法也是不同的。

定位 SQL 優化點

由于數據庫產品、參數配置甚至同一款產品的不同發行版本都會導致同一條 SQL 出現不同的運行效率。隨著業務數據的增長,原本運行良好的 SQL 也會出現瓶頸。

變化再多也有規律可循,SQL 運行效率低根本的問題就是 SQL 表關聯太多、SQL 邏輯太復雜、表數據量太大、未使用索引等,這些就是我們要優化的點。

拿到運行效率低的 SQL 以后,要分析一下該條 SQL 用到哪些表?哪些索引?表中的數據量是多少?對整個 SQL 運行的基礎環境有一個清晰的認識。

優化 SQL 最常用的輔助工具就是數據庫本身提供的“執行計劃”,如何開啟、使用執行計劃分析和優化 SQL,可點擊文章最后左下角「閱讀原文」查看之前整理的一篇關于《數據庫 SQL 執行計劃應用初探》的文章。

進行 SQL 優化

定位到 SQL 執行效率低下的原因以后,要想辦法優化它,下面是一些通用的處理思路,可以參考一二。

索引;索引是關系型數據庫中 SQL 優化的利器,設計良好的索引以及在 SQL 中正確應用索引基本上能解決大部分的 SQL 優化問題。可以通過執行計劃分析 SQL 中索引的應用情況。

變通;3+ 6 與 4 + 5 的結果都是 9,做事的方式并不是唯一的,可能一種 SQL 寫法效率很低,然而你換一個思路試試其他的寫法,效率會有很大的提升,這個需要不斷的嘗試和摸索。

舉個栗子,以 Oracle 為例查詢公司男性與女性員工的薪資總和

select  

(select sum(salary) from employee where sex= 男 )   男性薪資總和,

(select sum(salary) from employee where sex= 女 )   女性薪資總和

from dual

更好的寫法應該是

select

sum(case when sex= 男 then salary else 0 end) 男性薪資總和,

sum(case when sex= 女 then salary else 0 end) 女性薪資總和

from employee

我剛入門 SQL 時,就是采用了第一種寫法,邏輯最簡單明了,但是一個 employee 表卻被掃描了兩次(在沒有索引的情況下),隨著數據量的增加,這條 SQL 必然出現效率低的問題,第二種寫法就會優化很多,效率更高。這是一個簡單不能再簡單的變通了(當然是現在看來,當時可能想不到)。

分解;把復雜的一條 SQL 可以拆解為多條簡單 SQL 分步驟執行,可能你會覺得分步驟執行做了很多額外的工作,但是每條簡單的 SQL 執行的會非???,整體上提升了 SQL 執行效率。

SQL 分解最常用的就是創建中間表,中間表只保存需要的字段和數據行,同時增加必要的索引,可大大提升 SQL 的執行效率。

環境;SQL 優化要在同一個環境中進行,不同的環境中 SQL 執行路徑可能是不同的,優化的方法也是不同的。盡量排除環境因素對 SQL 優化的影響。

經驗;經驗很重要,但是避免陷入經驗主義。你可能在 Oracle 中有著非常豐富的 SQL 優化經驗,但是在 DB2 數據庫中可能就不靈了,不要糾結,這很正常。在我從 Oracle 數據庫轉向 DB2 數據庫時就出現了很多問題,在 Oracle 中積累的經驗轉移到 DB2 中行不通,只能另辟蹊徑。

SQL 優化需要經驗,但是不能太依賴經驗,要不斷調整自己的思路。每款數據庫產品都有自己的特點,要了解它們,然后去不斷應用。好在大部分的經驗是通用的,只是略加調整即可,不要太大壓力。

把平時優化 SQL 的技巧和方法總結下來,在真實的 SQL 優化場景中反復使用和調整,逐漸形成自己的一套優化經驗。

關于“如何讓 SQL 再快一點兒”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-15發表,共計2325字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 东乌珠穆沁旗| 长泰县| 石嘴山市| 五河县| 德化县| 青龙| 瓮安县| 交口县| 通州区| 仲巴县| 红桥区| 鱼台县| 平顶山市| 新昌县| 榆树市| 肃宁县| 盐边县| 金平| 广汉市| 宿州市| 南岸区| 黄骅市| 南汇区| 兴隆县| 盐城市| 呼伦贝尔市| 新平| 项城市| 乐至县| 天峨县| 商都县| 青海省| 岚皋县| 富顺县| 呼图壁县| 扬中市| 荆州市| 洪泽县| 塘沽区| 正定县| 泸州市|