SQL查询执行计划 - 查询优化和操作符篇

  介绍

  在本文中,我们将学习SQL查询优化技术。 有多种方法可以编写结构化查询语言(sql)获得相同的结果。 但是,但是当考虑到性能时,开发人员应该知道哪个查询在最短的执行时间内获得结果最好。 提高Sql查询性能的过程称为Sql查询调优或Sql查询优化,这不是单一的工具或技术。它是一组实践,利用了广泛的技术、工具和过程。

  下面的饼状图显示了与性能相关的最基本组件。

  

  我们将逐一讨论所有这些组件。

  让我们开始吧。

  执行计划

  执行计划是查询优化过程的重要组成部分之一。执行计划是Sql Server提供的一种帮助工具,开发人员使用它来识别薄弱环节。较弱的区域是查询的一部分,需要更多的时间,可以改进。这部分有助于采取进一步的行动。我们可以说,这是一个决策的步骤。在这里,您可以决定查询是否需要进一步改进。

  执行计划分为以下三种:

  预估执行计划实际执行计划缓存执行计划

  索引技术

  适当的索引是提高查询性能的最佳方法之一。在sql表中搜索没有索引的内容,就像通过阅读整本书来搜索一本书中的关键字一样。索引就像是寻找东西的线索。sql中有两种类型的索引,即聚集索引和非聚集索引。

  

  您可以在以下链接中找到索引的详细描述。

  查询设计

  在写查询的时候,我们应该记住的是。

  避免Select *

  当我们需要表的所有字段数据时,仅应使用select *语句。例如,如果我们只需要一个表的两个字段的信息,并且正在编写select *语句以获取那些结果,那么这不是一个成教好主意,因为数据库引擎将进入系统表并读取所有列的元数据。 得到结果。读取系统表时,结果性能会受到影响。检索不必要的数据只会增加网络流量。您可能会发现两个查询的执行计划之间存在差异。

  检查DISTINCT和GROUP BY子句

  这两个子句都用于获取唯一记录,但是GROUP BY通常与聚合函数一起使用。根据查询和情况,一个可以给出比另一个更好的结果。因此,在编写查询检查查询执行计划,以获得最好的结果。但这并不意味着DISTINCT可以被替换为GROUP,反之亦然。

  HAVING和WHERE子句

  不要使用HAVING子句来过滤数据。HAVING子句仅适用于聚合函数。 这意味着您需要根据汇总函数的结果过滤记录。

  Exists, Joins, In

  大多数情况下,IN和EXISTS给我们相同的性能结果。但是在某些情况下,IN和Exists可能会给出不同的性能结果。当一个查询中有许多表时,最好使用连接来链接它们并获取数据。

  重要的几点:

  当子查询结果非常大时,EXISTS子句比IN子句更快。然而,当子查询结果非常小时,IN子句的速度要快于EXISTS。当我们用IN子句编写子查询时,sql数据库首先处理子查询,然后处理整个查询。避免在大数据的情况下进行子查询。在这种情况下使用连接。

  让我们用一个简单的例子来看看这三个子句之间的区别,

  使用IN、EXISTS和join子句编写查询以获得相同的结果,并与统计时间一起执行并区分差异。

  

  在上面的示例中,您将看到Exists通过IN和JOIN可以提供更好的性能。 在处理需求时,我们应该牢记所有三个选项,因为我们可以从任何一个选项中获得相同的结果。因此,下次选择最佳选项以获得更好的性能。

  现在,我们来讨论一个建议改进查询的工具。

  数据库引擎优化顾问(Database Engine Tuning Advisor)

  数据库引擎优化顾问是Sql Server Management Studio附带的一个特性。任何开发人员,无论是新手还是有经验的开发人员,都可以使用这个工具来获得通过结构更改来提高sql server查询性能的建议。您可以从工具栏中的工具选项中获得此工具。

  

  当您单击此选项时,服务器将询问您的登录凭据。提供凭证后,将打开以下窗口:

  

  您可以选择整个数据库,也可以选择一个表。 在此示例中,我将选择一个完整的数据库以及Plan Cache工作负载。 单击开始分析。

  现在将显示“进度”选项卡。 在这里您可以看到进度。 分析完成后,其他两个选项卡将分别显示“建议”和“报告”。

  在建议窗口中,您可以找到改进建议。

  

  在Reports选项卡中,您可以找到该工具生成的报告。

  

  同样,您也可以通过选择具有数据库名称的脚本文件工作负载进行工作负载分析来优化单个脚本文件。这里我的目的是让开发人员知道,我们已经在sql server中使用了这种特性。

  总结

  我们讨论了可以用来提高sql server查询性能的工具和技术。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值