暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

优化 SQL 查询的 9 种方法

原创 张猛 2022-10-23
6324

SQL 查询优化非常重要的工作,就像必须要管理好数据库系统的任何其他组件一样。如果不对数据查询进行优化,数据库的性能将受到影响。在许多情况下,可能会阻止用户快速访问必要的信息。本文将讨论各种 SQL 查询优化技术,这些技术可用于提高查询性能并降低成本。

1zxME__QMp5IT3aErP6GQXg.png

照片出处 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
最后修改时间:2022-11-01 16:21:36
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论