sql性能问题怎么排查_被公司优化还能回去吗

sql性能问题怎么排查_被公司优化还能回去吗之前写过一篇博客“SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析”,里面介绍了OR可能会引起全表扫描或索引扫描的各种案例,以及如何优化查询条件中含有OR的SQL语句的几种方法,其实还有一

之前写过一篇博客SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析,里面介绍了OR可能会引起全表扫描或索引扫描的各种案例,以及如何优化查询条件中含有OR的SQL语句的几种方法,其实还有一些方法可以用来优化这种问题,这里简单介绍一下。

 

如下所示,下面的SQL语句之所有出现这种写法,是因为程序的查询界面,可能有多个输入性的查询条件,往往用户只填了一个或部分查询条件(业务情况,应该不用详细介绍,大家都能明白),但是程序里面没有通过判断查询条件生成不同的SQL语句,而是用一个SQL搞定,不管用户没有填写JobNo这个查询条件,下面这种写法:WHERE ISNULL(@JobNo, “”) = “”  OR JobNo = @JobNo都能满足条件,实现逻辑功能。

 

DECLARE @GenerateDateStart DATETIME ,

代码100分

代码100分    @GenerateDateEnd DATETIME ,

    @JobNo NVARCHAR(200) ,

代码100分    @GkNo NVARCHAR(200);

SET @JobNo = "PT19B030";

SET @GkNo = "PV19-1-8050"; 

 

  SELECT    *

  FROM      [dbo].[GEW_UnitConsumption] AS A

            LEFT JOIN dbo.UnitConsumption_Relation AS B ON B.UsableFlag = "Y"

                                                           AND A.GewUnitConsumptionId = B.RootUnitConsumptionID

  WHERE     ( ISNULL(@JobNo, "") = ""

              OR A.JobNo = @JobNo

            )

            AND ( ISNULL(@GkNo, "") = ""

                  OR A.GkNo = @GkNo

                );

 

其实,如果根据查询条件动态生成SQL语句,的确能避免查询条件中出现OR的情形,但是动态SQL语句没有上面语句简单和通熟易懂,尤其是查询条件较多的情况下。只能说各有利弊。这里暂且不讨论那种策略的优劣。

 

 

clip_image001

 

下面介绍一种技巧,如何避免OR引起的索引扫描或全表扫描问题。我们可以使用CASE WHEN改写一下这个SQL语句,就能避免OR引起的执行计划不走索引查找(Index Seek)的情况,如下所示:

 

DECLARE @GenerateDateStart DATETIME ,

    @GenerateDateEnd DATETIME ,

    @JobNo NVARCHAR(200) ,

    @GkNo NVARCHAR(200);

SET @JobNo = "PT19B030";

SET @GkNo = "PV19-1-8050"; 

 

 

SELECT  *

FROM    [dbo].[GEW_UnitConsumption] AS A

        LEFT JOIN dbo.UnitConsumption_Relation AS B ON B.UsableFlag = "Y"

                                                       AND A.GewUnitConsumptionId = B.RootUnitConsumptionID

WHERE   CASE WHEN ISNULL(@JobNo, "") = "" THEN A.JobNo

             ELSE @JobNo

        END = JobNo

        AND CASE WHEN ISNULL(@GkNo, "") = "" THEN A.GkNo

                 ELSE GkNo

            END = @GkNo;

 

clip_image002

 

测试对比发现性能改善非常明显,当然这种优化技巧也是有局限性的,并不能解决所有OR引起的性能问题(没有银弹!)。如下所示,对于下面这种情况,这种技巧也是无能为力!

 

 

SELECT * FROM TEST1 WHERE A=12 OR B=500

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10816.html

(0)
上一篇 2022-12-21
下一篇 2022-12-21

相关推荐

  • mysql5.7.26安装教程图解_保姆式教育

    mysql5.7.26安装教程图解_保姆式教育现在要是说mysql是什么东西,就不礼貌了 虽然有的同学没有进行系统的深入学习,但应该也有个基本概念 【不了解也没关系,后续会进行mysql专栏讲解】简单来说,存储数据的 学习mysql,就要先安装它

    2023-06-16
    152
  • Python中return和break语句在循环中的差异

    Python中return和break语句在循环中的差异在Python中,return语句的作用是结束函数的执行,并返回一个值。如果在循环中使用return语句,当满足某个条件时,函数就会立即结束并返回值。以下是一个简单的示例:

    2024-01-01
    111
  • 如何在PyCharm中配置解释器

    如何在PyCharm中配置解释器Python是一种简单易学的编程语言,它在许多领域都有着广泛的应用,因此,Python编译器也很流行。当前最流行的Python编译器是PyCharm,它是由JetBrains公司开发的一款跨平台的集成开发环境(IDE),对Python语言开发非常友好。

    2024-06-21
    41
  • SQL Pretty Printer 一款值得你拥有的MSSQL格式化插件

    SQL Pretty Printer 一款值得你拥有的MSSQL格式化插件各位码农小伙伴们,在使用MSSQL编辑器时候是否觉得没有一款格式化工具,写出来的代码很不美观,在团队中,做code review时候,每个人风格不一,对比不够直接呢? 我给大家推荐一款SQL Pret

    2023-02-22
    138
  • 数据中台技术架构方案v2.5_nginx模块开发与架构解析

    数据中台技术架构方案v2.5_nginx模块开发与架构解析回顾一下,第一篇文章 "大白话 六问数据中台!你想知道的都在这了!" 。把数据中台是什么?为什么?有什么价值?说的明明白白。 数据中台是企业级能力复用平台,目标是让数据持续用起来,

    2023-03-01
    154
  • PyCharm一年收费

    PyCharm一年收费PyCharm是一个流行的Python集成开发环境(IDE),由捷克软件公司JetBrains开发和维护。虽然开源版本是免费的,但其专业版版本需要付费使用。其中,一年的收费是一个比较常见的选项。本文将围绕这个话题,对PyCharm一年收费做详细的阐述。

    2024-07-26
    35
  • Druid入门(1)—— 快速入门实时分析利器-Druid_0.17[通俗易懂]

    Druid入门(1)—— 快速入门实时分析利器-Druid_0.17[通俗易懂]一、安装准备 本次安装的版本是截止2020.1.30最新的版本0.17.0 软件要求 需要 Java 8(8u92 +) 以上的版本,否则会有问题 Linux,Mac OS X或其他类似Unix的操作

    2023-01-27
    141
  • openGauss 2.0.0 版本正式发布「终于解决」

    openGauss 2.0.0 版本正式发布「终于解决」3月31日,openGauss 2.0.0 版本正式上线!openGauss 2.0.0 是openGauss社区发布的第一个Release版本。2.0.0版本与之前版本保持兼容的同时,也新增了众多…

    2023-04-12
    183

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注