sql語言藝術

查詢的識別

 

查詢的識別

總結:易識別的語句有助於定位性能問題。

儘量給語句添加註釋或使用oracle自帶的函數來標明應用的信息。

 

保持數據庫連接穩定

總結:數據庫連接和交互好似萬里長城——長度越長,傳遞消息越耗時。

減少數據庫的連接次數,使用數據庫連接池。

 

戰略優先於戰術

總結:考慮解決方案的細節之前,先站得遠一些,把握大局。

可以從業務的角度思考,想想數據的來源與去處是不是有其他路徑可尋。

 

先定義問題,再解決問題

總結:先打基礎,再趕時髦:擺弄新工具之前,先把手藝學好。

儘量減少使用新技術,這些往往沒有經過時間的檢驗,雖然有可能解決當前的問題,但是在未來可能存在隱患。

 

直接操作實際數據

總結:暫時工作表意味着以不太合理的方式存儲更多信息。

減少使用臨時表,儘量直接操作實際表。

 

用SQL處理集合

總結:幾千個語句,藉助遊標(cursor)不斷循環,很慢。換成幾個語句,處理同樣的數據,

還是較慢。換成一個語句,解決上述問題,最好。

 

動作豐富的SQL語句

總結:儘可能多地把事情交給數據庫優化器來處理。

避免使用過程邏輯,寫多個sql,業務需求儘量寫成一個sql,這樣數據庫優化器可以進行優化。

 

充分利用每次數據庫訪問

總結:在合理範圍內,利用每次數據庫訪問完成儘量多的工作。

儘量一次查詢所有的字段。

 

接近DBMS核心

總結:代碼喜歡SQL內核——離核心越近,它就運行得越快。

儘量使用數據庫自帶函數實現業務邏輯,而不要使用過程塊語句去封裝實現相應邏輯。

 

只做必須做的

總結:沒必要編程實現那些數據庫隱含實現的功能。

 

SQL語句反映業務邏輯

總結:檢查數據庫活動,看它是否與當時正進行的業務活動保持合理的一致性。

 

把邏輯放到查詢中

總結:只要有可能,應儘量把條件邏輯放到SQL語句中,而不是SQL的宿主語言中。

 

一次完成多個更新

總結:有可能的話,用一個語句處理多個更新;儘量減少對同一個表的重複訪問。

 

慎用自定義函數

自定義函數的方式阻礙了基於開銷的優化器(cost-based optimizer,CBO)對整個查詢的優化效果。

總結:優化器對自定義函數的代碼無能爲力。

 

簡潔的SQL

總結:SQL是聲明性語言(declarative language),所以設法使你的代碼超越業務過程的規格說明。

 

SQL的進攻式編程

總結:以概論爲基礎進行編程。假設最可能的結果;不是的確必要,不要採用異常捕捉的處理方式。

 

精明地使用異常(Exceptions)

總結:異常處理會迫使我們採用過程式邏輯。應始終使用聲明式SQL,儘量預測可能的異常情況。

 

SQL的本質

 

SQL與數據庫

總結:千萬別把SQL查詢的執行過程中真正的關係操作和附加的展現層(presentation layer)功能混爲一談。

 

SQL與優化器

總結:爲了取得好的優化效果,應將大部分工作安排在關係層。

 

優化器的有效範圍

總結:如果是若干個小查詢,優化器將個個優化;如果是一個大的查詢,優化器會將它作爲一個整體優化。

 

掌握SQL藝術的五大要素

 

獲得結果集所需訪問的數據量

定義結果集所需的查詢條件

結果集的大小

獲得結果集所涉及的表的數量

多少用戶會同時修改這些數據

 

複雜查詢與複雜視圖

總結:表明簡單的查詢背後,可能隱藏着複雜的視圖。

總結:當視圖返回不必要的元素時,別把視圖內嵌在查詢中,而是應將視圖分解,將其組成部

分加到查詢主體中。

 

過濾

過濾條件的含義

總結:查詢條件是有差異的,有的好,有的差。

 

過濾條件的好壞

總結:保證SQL 語句返回正確結果,只是建立最佳SQL語句的第一步。

 

大數據量查詢

總結:儘早過濾掉不需要的數據。

 

取出數據在表中的比例

總結:當查詢的結果集很大時,索引未必必要。

 

無論是單純爲了查詢、還是更新或刪除記錄,過濾數據會遇到的最典型情況有九種:

小結果集,源表較少,查詢條件直接針對源表

小結果集,查詢條件涉及源表之外的表

小結果集,多個寬泛條件,結果取交集

小結果集,一個源表,查詢條件寬泛且涉及多個源表之外的表

大結果集

結果集來自基於一個表的自連接

結果集以聚合函數爲基礎獲得

結果集通過簡單搜索或基於日期的範圍搜索獲得

結果集和別的數據存在與否有關

 

小結果集,直接條件

 

查詢的效率與索引的使用

總結:優秀的查詢未必來自優秀的程序。

 

數據散佈

總結:並非所有明確的條件都適合加索引。特別是,頻繁更新的字段會增加索引維護的成本。

 

條件的“可索引性”

總結:如果必須進行全表掃描,表上的索引就沒用了。

 

總結:內嵌查詢可以簡化查詢,但若使用不慎,可能造成重複處理。

 

小結果集,間接條件

總結:如果要使用子查詢,在選擇關聯子查詢、還是非關聯子查詢的問題上,應仔細考慮。

 

多個寬泛條件的交集

總結:爲現存的查詢增加搜索條件,可能徹底改變先前的構想:修改過的查詢成了新查詢。

 

多個間接寬泛條件的交集

總結:記住,你應該詳細說明所有強迫DBMS 做的事。

 

總結:混亂的查詢會讓優化器困惑。結構清晰的查詢及合理的連接建議,通常足以幫助優化器提升性能。

 

大結果集

 

基於一個表的自連接

總結:要理解優化器如何看待你的系統,就必須理解你的數據和數據分佈方式。

 

通過聚合獲得結果集

總結:聚合操作的數據應儘量少。

 

後面主要是提供了一些sql編寫技巧。

 

----摘自《SQL語言藝術》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章