【DB筆試面試569】在Oracle中,SQL如何優化?SQL優化的關注點有哪些?
- 2019 年 10 月 10 日
- 筆記
♣
題目部分
在Oracle中,SQL如何優化?SQL優化的關注點有哪些?
♣
答案部分
隨著資料庫中數據量的增長,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中一個很重要的方面就是SQL語句的優化。對於大量數據,劣質SQL語句和優質SQL語句之間的速度差別可以達到上千倍。對於一個系統不是簡單地能實現其功能就可以了,而是要寫出高品質的SQL語句,提高系統的可用性。
在多數情況下,Oracle使用索引來更快地遍歷表,優化器主要根據定義的索引來提高性能。如果在SQL語句的WHERE子句中寫的SQL條件不合理,那麼就會造成優化器捨去索引而使用全表掃描,一般這種SQL語句的性能都是非常差的。在編寫SQL語句時,應清楚優化器根據何種原則來使用索引,這有助於寫出高性能的SQL語句。
SQL的優化主要涉及如下幾個方面的內容:
(1)索引問題。是否可以使用組合索引;限制條件、連接條件的列是否有索引;能否使用到索引,避免全表掃描。一般情況下,盡量使用索引,因為索引在很多情況下可以提高查詢效率。排序欄位有正確的索引,驅動表的限制條件有索引,被驅動表的連接條件有索引。
(2)相關的統計資訊缺失或者不準確。查看SQL的執行計劃是不是最優,然後結合統計資訊查看執行計劃是否正確。
(3)直方圖使用錯誤,參考【3.2.6.6 什麼是直方圖(Histogram)?】。
(4)SQL本身的效率問題,例如使用綁定變數,批量DML採用BULK等,這個就考驗寫SQL的基本功了。
(5)數據量大小。如果就是幾百條數據,那麼就沒有所謂效率之分,一般情況下怎麼寫效率都不低。如果數據量很大,那麼就得考慮是否要分頁或排序。
(6)綁定變數:大多數情況綁定變數能提高查詢效率,但也有降低效率的情況。
(7)批量和並行的考慮。
(8)業務需求需要正確理解,實現業務的邏輯需要正確,減少一些重複計算。有可能是設計的不合理、業務需求的不合理,而問題SQL並非根本原因。
(9)查詢特別頻繁的結果是否可以快取,比如Oracle的/*+ result_cache */。
(10)分析表的連接方式。若是NL連接,則根據業務或表的數據品質情況,分析能否減少驅動表的結果集。
(11)是否可以固定執行計劃。
(12)大表是否存在高水位。
(13)在創建表的時候,應盡量建立主鍵,可以根據實際需要調整數據表的PCTFREE參數。
SQL優化的一般性原則如下所示:
l 目標:
減少伺服器的資源消耗(主要是磁碟I/O)。
l 設計方面:
① 盡量依賴Oracle的優化器,並為其提供條件。
② 建立合適的索引,注意索引的雙重效應,還有列的選擇性。
l 編碼方面:
參考【1.2.5.2 SQL優化在寫法上有哪些常用的方法?】。
本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。