在系統開發初期,數據量較小時,SQL寫法好壞對性能影響不明顯。但隨著業務增長,數據量激增,系統響應速度成為核心瓶頸。優質SQL與劣質SQL在海量數據下的速度差距可達百倍以上,因此編寫高性能SQL是提升系統可用性的關鍵。
Oracle等數據庫主要依賴索引加速查詢。優化器根據索引制定執行計劃,但不合理的WHERE子句會導致優化器放棄索引,轉而採用全表掃描。理解優化器「拒絕索引」的原則,是編寫高效SQL的基礎。
包含NULL值的列不會被納入索引。即使建立了複合索引,只要其中一列含NULL,該行就會被排除在索引之外。任何在WHERE中使用IS NULL或IS NOT NULL的查詢,優化器都不會使用索引。
即使連接後的值為常量,優化器也不會使用索引。例如:
SELECT * FROM employee
WHERE first_name || last_name = 'Bill Clinton';
正確做法是拆分條件:
WHERE first_name = 'Bill' AND last_name = 'Clinton';
這樣才能利用到單列或複合索引。