• SQL Server性能优化


    摘要:最近,讨论到数据库的优化问题,查看了很多网上的文章,说得都不是很全,有些经过测试还有错误,所以抽点空余时间写下这篇随笔,希望能对你有所帮助。

    1、数据准备

    首先要准备数据来进行测试,这里我们准备了两张员工表,Employee表220888条数据,Employee_B 199条数据

     

    2、SQL Server性能优化之SQL语句总结

    1、SELECT

      尽量避免使用SELECT *  应根据需求在SELECT中指定列 SELECT item1,item2,如图

      

      在select中指定所需要的列,将带来的好处: 
      (1)减少内存耗费和网络的带宽 
      (2)更安全 
      (3)给查询优化器机会从索引读取所有需要的列

    2、COUNT(*)、COUNT(1)和COUNT([列])

       (1)COUNT(*)和COUN(1)的区别:

        COUNT(*)和COUNT(1)两者没有太大的区别,执行结果都是一样的,根据当时的业务场景,选择适用的Count,相对来说Count(1)的执行时间比较少。如图

     

      (2)COUNT(*)和COUNT([列])的区别:

         COUNT(*)  返回组中的项数。包括 NULL 值和重复项。

         COUNT([列]) 返回非空值的数量

    3、LIKE

       应尽量避免'%Item%'的方式,除非必要,否则不要在关键字前加%,如下图

      

    4、IN 、NOT IN、EXISTS、NOT EXISTS

      1、IN 和 EXISTS区别:

        IN 是把外表和内表作hash 连接,而EXISTS是对外表作loop循环,每次loop循环再对内表进行查询。EXISTS 和 IN 在执行时效率基本一致,执行时间相差不大(执行10次有时EXISTS快有时IN快,经测试:数据量小的表为主表速度会快很多,如果数据量一致,根据个人爱好选择)。如下图

      2、NOT IN 和 NOT EXISTS区别:

        NOT IN 在查询时主子查询都进行全表扫描,且没有用到索引;NOT EXISTS 的子查询会使用表中索引,所以无论主子结果集的大小 。所以NOT EXISTS执行效率都要比NOT IN高,如下图

       

        

    5、IS NULL、IS NOT NULL

      (1)应尽量避免在 WHERE子句中对字段进行 NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描,如下图

       

      (2)尽可能不要给数据库留NULL,备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。如下图(使用了索引)

       

    6、!=、<>

       在where子句中使用 != 或 <>操作符,索引将被放弃使用,会进行全表查询。如下图

       

    作者:JamelAr
    个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    http和https的区别与联系
    HTTP请求/响应报文结构
    Java并发包中Lock的实现原理
    Java多线程基础——Lock类
    深入理解Java并发之synchronized实现原理
    ConcurrentHashMap 的实现原理
    【Java集合学习】HashMap源码之“拉链法”散列冲突的解决
    趣谈Java变量的可见性问题
    Java中CAS详解
    LockSupport的park和unpark的基本使用,以及对线程中断的响应性
  • 原文地址:https://www.cnblogs.com/JamelAr/p/10856988.html
Copyright © 2020-2023  润新知