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