SQL语言最佳实践

数据分析学习社
数据分析学习社
数据分析学习社
348
文章
0
评论
2021-06-1110:08:36 评论 927 1572字
摘要

SQL是一种非常灵活的语言,提供了多种方法在数据库上执行所需的任务。在编程中,性能瓶颈大多来自数据库操作和响应。以上这些建议,可能有效地帮助加快性能,消除不必要的延时,并可避免长期积累的数据库问题

1. 绝对避免使用 SELECT *

SELECT * 查询会返回所有列的记录。这样的查询会有很多问题:

  • 很多情况不需要检索所有的字段,使用 SELECT * 会消耗过多的带宽;

  • 在考虑到修改表结构的前题并存在脏数据的情况,SELECT * 出现意想不到的结果;

  • SELECT * 比 SELECT [字段] 要慢,因为后者可以使用列索引;

  • SELECT * 返回的列顺序不可控。

因此,要求查询时逐个列表需要查询的字段。包括查询全部字段,也需要将字段逐个写出来,并按照需要的方式排序字段的先后次序。

2. 区分使用 WHERE 和 HAVING

SQL 中 WHERE 和 HAVING 从语法上可以在一定范围内混着用,但两个词的语义截然不同,在实际编程时,需要按语义分开使用。

  • WHERE 用于全部CRUD,HAVING只用于查询 SELECT;

  • WHERE 用在聚合操作之前过滤数据,HAVING 用在聚合之后;

  • HAVING 子句中可以使用聚合函数,如SUM、MIN、MAX、COUNT,而 WHERE 子句不能使用聚合函数,除非该子句是 HAVING 子句中包含的子查询的一部分。

3. 表连接查询使用 INNER JOIN

JOIN 是使用非常多的SQL查询之一,允许用户从多个表中选择数据。WHERE 也可以连接两个表并获取聚合数据,但开发中禁止使用。

一个主要的原因是 WHERE 返回的是 CROSS JOIN,返回的记录数是两个表记录的乘积。例如两个表A和B,各有1000条数据,用 WHERE 子句,将会返回一个 1000 x 1000 = 1000000条记录的 CROSS JOIN,然后再从这个数据集里提取满足条件的数据。这在性能上不可接受。

而上面的例子,在 INNER JOIN 时仅返回 1000 条记录,然后从这个数据集中提取满足条件的数据。

虽然有些数据库会在内部将 JOIN 查询中的 WHERE 转换为 INNER JOIN,但规则要求显式使用 INNER JOIN,而不是 WHERE。

4. 使用 EXISTS 和 NOT EXISTS 代替 IN 和 NOT IN

在检索某个值在表中存在与否时,EXISTS 子句的执行进程会在找到值后停卡,而 IN 子句会在找到值后继续扫描所有的值。

NOT EXISTS 和 NOT IN 的执行也一样。

这个规则也是性能原因。

5. 使用 = 代替 LIKE

两个方式都可以用来匹配字符串,但 LIKE 用于匹配通配符,而 = 用来进行精确匹配。

在 SQL 中,= 操作符可以使用索引,会比 LIKE 更快。

6. 使用 LIMIT 子句限制检索结果数量

查询数据时,尽可能使用 LIMIT 子句,来限制查询结果数量。大多数情况下,查询没有必要返回所有行。限制查询返回的数量,也可以提高查询性能。

7. 查询多表时使用表别名

多表查询时,使用表别名,避免混淆,并防止数据库在搜索列表所属的表时解析列名。这不会增加工作量,但很有效。

8. 避免使用 "sp_" 作为存储过程的名称前缀

原则上,避免使用存储过程。

如果必须使用存储过程,那必须禁止使用 sp_ 作为前缀的存储过程名称。SQL Server 中,会首先在主数据库中查询名称以 sp_ 开头的存储过程,然后再搜索其它地方。因此,避免 sp_ 打头的存储过程名称可以节省大量时间,SQL Server将直接检查 DBO 作为存储过程的所有者,而不是在主数据库中查找存储过程。

9. 采用规范的查询代码风格

这算是一个建议,但是,使用良好规范的代码风格是必要的:

  • 完整的注释。需要帮助其它团队成员理解查询的目的,并提醒开发者做的是什么;

  • 使用明显的命名约定。数据库、表名、字段名,包括临时表和变量名都应该是可读和清楚的;

  • 尽可能缩进查询语句。通过缩进来确保清晰的代码外观,并提高查询的可读性。

 

End.

作者:老王Plus的老王

转载如果涉及作品问题请联们第一时间删除(微信lovedata0520

更多文章前往首页浏览http://www.itongji.cn/

  • 我的微信公众号
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: