SQL 查詢優化非常重要的工作,就像必須要管理好數據庫系統的任何其他組件一樣。如果不對數據查詢進行優化,數據庫的性能將受到影響。在許多情況下,可能會阻止用戶快速訪問必要的信息。本文將討論各種 SQL 查詢優化技術,這些技術可用于提高查詢性能并降低成本。

照片出處 Hiroshi Kimura on Unsplash
方法 1. 在 select 語句中使用列名(column name) 而不是 *
如果只想選擇一定數量的列,則應在 select 語句中使用列名而不是 *。盡管這樣寫起來更簡單,但數據庫需要更多時間來處理查詢。通過限制所選列數,可以減小結果表的大小、降低網絡流量并提高整體查詢性能。
例如:
Original Query :
Select * from sales;
Improved Query :
Select product_id from sales;
方法 2. 使用WHERE來定義過濾器代替使用HAVING
SQL 優化查詢將僅從數據庫中檢索必要的記錄。根據 SQL 操作順序,HAVING 語句是在 WHERE 語句之后計算。如果目標是基于條件篩選查詢,則 WHERE 語句更有效。
例如:
Original query:
SELECT customer_id,count(customer_id)
FROM sales
GROUP BY customer_id
HAVING customer_id != '16' AND customer_id != '2';
Improved query:
SELECT customer_id,count(customer_id)
FROM sales
WHERE customer_id != '16'
AND customer_id !='2'
GROUP BY customer_id;
方法 3. 避免不必要的使用distinct
使用 Distinct 語句是刪除重復項的便捷方法。它的工作原理是在查詢中創建組。但是,要實現這一目標,需要大量的計算能力。此外,數據可能在一定程度上被不準確地分類。解決方案是選擇更多字段來生成不同的結果,而不是使用“SELECT DISTINCT”。
例如:
Original Query:
SELECT DISTINCT FirstName, LastName, State
FROM Teachers;
Improved Query
SELECT FirstName, LastName, Address, State,CourseName,Timings
FROM Teachers;
方法 4. 使用 JOIN 代替SUBQUERY
與子查詢相比,使用 join 的優點是它的執行速度更快。與子查詢不同,子查詢將執行所有查詢并加載所有數據以執行處理,JOIN允許數據庫管理系統構建更適合的執行計劃,并且可以預測應加載哪些數據進行處理以節省時間開支。
例如:
Original query:
SELECT *
FROM products p
WHERE p.product_id =
(SELECT s.product_id
FROM sales s
WHERE s.customer_id = 2468
AND s.quantity_sold = 12 );
Improved query:
SELECT p.*
FROM products p, sales s
WHERE p.product_id = s.product_id
AND s.customer_id = 2468
AND s.quantity_sold = 12;
方法 5. 在查詢索引列中使用 謂詞IN
對于索引檢索,可以使用 IN 列表謂詞,并且優化程序可以對 IN 列表進行排序以匹配索引的排序順序,以便更有效地進行檢索。請記住,IN 列表只能包含常量,即在單個查詢塊執行期間保持不變的內容,如外部引用。
例如:
Original query:
SELECT *
FROM sales
WHERE product_id = 4
OR product_id = 7;
Improved query:
SELECT *
FROM sales
WHERE product_id IN (4, 7);
方法 6. 當使用涉及具有一對多關系的表的表聯接時,請使用 EXISTS 而不是 DISTINCT。
DISTINCT的工作原理是在查詢中創建組,這需要大量的計算。您可以將子查詢與 EXISTS 關鍵字一起使用,以避免返回整個表。
例如:
Original query:
SELECT DISTINCT c.country_id, c.country_name
FROM countries c, customers e
WHERE e.country_id = c.country_id;
Improved query:
SELECT c.country_id, c.country_name
FROM countries c
WHERE EXISTS (SELECT * FROM customers e
WHERE e.country_id = c.country_id);
方法 7. 盡可能使用Union ALL 而不是Union
Union ALL 的執行速度比Union 快,因為在 UNION 中,無論重復項是否存在,都會被刪除。“Union ALL”顯示帶有重復項的數據。
例如:
Original query:
SELECT customer_id
FROM sales
UNION
SELECT customer_id
FROM customers;
Improved query:
SELECT customer_id
FROM sales
UNION ALL
SELECT customer_id
FROM customers;
方法 8. 避免在 JOIN 查詢中使用 OR
如果在JOIN查詢時使用 OR,則查詢的速度會減慢 2 倍。
例如:
Original query:
SELECT *
FROM costs c
INNER JOIN products p ON c.unit_price =
p.product_min_price OR c.unit_price = p.product_list_price;
Improved query:
SELECT *
FROM costs c
INNER JOIN products p ON c.unit_price =
p.product_min_price
UNION ALL
SELECT *
FROM costs c
INNER JOIN products p ON c.unit_price =
p.product_list_price;
方法 9. 避免在運算符右側使用聚合函數
避免在運算符右側使用聚合函數將極大地優化 SQL 查詢。
例如:
Original query:
SELECT *
FROM sales
WHERE EXTRACT (YEAR FROM TO_DATE (time_id, ‘DD-
MON-YYYY’)) = 2021 AND EXTRACT (MONTH FROM
TO_DATE (time_id, ‘DD-MON-YYYY’)) = 2002;
Improved query:
SELECT * FROM sales
WHERE TRUNC (time_id) BETWEEN
TRUNC(TO_DATE(‘12/01/2001’, ’mm/dd/yyyy’)) AND
TRUNC (TO_DATE (‘12/30/2001’,’mm/dd/yyyy’));
結論
查詢優化是DBA、數據分析師和應用程序設計人員執行的常規操作,用于微調數據庫系統的整體性能。遵循這些簡單的方法將有助于優化 sql 查詢,希望本文對您有所幫助。
原文標題:9 Ways to Optimize SQL Queries
原文作者:Diksha Mohnani
原文地址:https://medium.com/geekculture/9-ways-to-optimize-sql-queries-f62680d6f59a




