前言

在我们进行数据分析的时候,首要的目标是根据业务逻辑,通过编写SQL代码得到我们想要的结果,这是毋庸置疑的。一般情况下,由于我们分析的数据量比较少,体会不出SQL语句各种写法的性能优劣,对SQL代码的优化往往没那么重要。但是随着数据库中数据的增加,尤其是当一个系统需要对海量的数据进行持续性的分析时,SQL的运行效率就成为系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍甚至更多,可见对于数据分析,不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性和效率。接下来,将介绍几种常用的SQL优化技巧。

WHERE下多个过滤条件的排列顺序

我们在使用WHERE关键字进行条件筛选时,经常会包含多个筛选条件,使用AND进行连接。数据库在对WHERE关键字进行解析时,采用自下而上的顺序进行,即从最后一个过滤条件向前解析。根据这个原理,那些可以过滤掉最大数量记录的条件应该写在WHERE子句的末尾,以减少数据库需要遍历的数据量。例如,我们要从全网3天的KPI数据中筛选出一个站一天的数据。显然,先筛选基站能尽快滤掉更多的数据。因此,我们应把基站筛选放在后面,写成:

重复记录的处理

在我们进行关联操作时,关联条件字段的异常重复数据是影响运行效率和数据质量的一个重要因素。比如我们要根据enb_id字段关联的两张表,这两张表中各有一千条数据的enb_id值为1(这是很常见的错误)。关联后,重复字段的条目数就变为1000*1000。如果重复字段再多,数据量的指数级增长将极大影响运行效率。因此我们需要对数据进行去重处理。以下介绍一种最高效的删除重复记录的方法:

当然,要在熟悉业务逻辑的情况下进行去重,以免误删正常的重复数据。

WHEREHAVINGON的比较

WHEREHAVING关键字都可以对查询结果进行筛选,两者的区别是WHERE的作用时间是在计算之前就完成的,而having是在计算后才起作用的。HAVING只会在检索出所有记录之后才对结果集进行过滤。 这个处理需要排序,总计等操作。显然WHERE能在计算之前滤掉更多数据,效率更高。因此在不涉及计算的筛选中,应尽量使用WHERE。只有对计算之后的字段进行筛选时才考虑使用HAVING

ON关键字实际上也是对数据进行筛选,只不过是在多表关联时使用。需要注意的是,在我们常用的操作中,表关联是最耗时的操作之一。尤其是两张大表的关联。因此我们应尽量在关联之前对数据进行汇总和筛选,以减少关联的数据量,提高运行效率。例如以下两段代码:

SQL-1:

SQL-2:

第一条SQL的逻辑是先将两表进行关联,再从关联结果中筛选出符合条件的数据。而第二条SQL的逻辑是先从一张表中筛选出需要的数据,再进行关联得到结果。显然第二条SQL需要进行关联的数据量更少,效率更高,尤其是WHERE条件可以滤掉大量数据的情况下。

灵活使用EXISTS关键字

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行连接.在这种情况下,通常我们会考虑使用IN关键字,如:

在这种情况下,使用EXISTSNOT EXISTS通常是查询效率更高的方法。在子查询中,NOT IN子句将执行一个内部的排序和合并。无论在哪种情况下,NOT IN都是最低效的,因为它对子查询中的表执行了一个全表遍历。为了避免使用NOT IN ,我们可以把它改写成外连接或NOT EXISTS。例如,上面的代码我们可以改写为:

同时,巧妙地使用EXIST还可以更高效地在查询一对多表信息时实现DISTINCT效果。例如,我们要从工参中查询KPI中出现的小区都属于哪些地市。如果使用DISTINCT,实现方法如下:

DISTINCT是一种很低效的查询方式,应尽量避免使用。我们可以充分利用工参中enb_id唯一的特点使用EXIST更高效地实现同样效果。代码如下:

UNION ALLUNION

UNIONUNION ALL都有合并数据的效果,但也有细微的区别。UNION ALL只是简单的合并,将重复输出两个结果集合中相同记录,而UNION会去除重复记录。实际上,UNION就是先将两个集合以UNION ALL的方式合并,然后在输出最终结果前进行排序去重。因此UNION效率更低。当我们不需要对结果去重的时候,应尽量使用UNION ALL

表关联的优化

前面我们分析过,表关联是最耗时间的常用操作之一。因此,表关联优化的一个重要原则就是在关联之前尽量减少两张表格的数据量。看以下两段SQL:

SQL-1:

SQL-2:

思考表连接的的SQL执行顺序,前者两张表JOIN后马上筛选部分结果再与另一张表JOIN,后者先将三张表JOIN后再筛选。所以很明显前者效率比后者高。还有另外一种写法:

第三条和第一条SQL一样效率不错。从逻辑上看,似乎SQL会先将表JOIN后再筛选,但实际结果是先筛选再JOIN。因为SQL SERVER会内部分析,产生一个最优的执行计划,自动处理。而如果按照第二种写法使用JOIN ON的话,就好像是使用强制命令,告诉数据库,就是要按你的方式处理结果,数据库只好服从。

但是有一点需要注意,上面的三种写法使用的都是内关联,三种方法的结果是一样的,只是效率不同。如果使用外关联,结果就有区别了。比如使用LEFT JOIN,第一种写法中,将单表的过滤条件写在ON后面,左表中不符合条件的数据也会被保留,无法起到过滤的作用。而第二种写法先关联再筛选,会滤掉不符合条件的数据。这点需要特别注意,以免发生逻辑上的错误。

后记

最后需要说明一点,如今数据库的类型越来越多,数据库的优化器也越来越智能。很多情况下,数据库的优化器会根据数据情况自动对SQL进行优化。比如,Impala数据库中可使用COMPUTE STATS语句收集表的统计信息,这样在对表进行操作的时候,数据库的优化器就可以自动进行SQL优化。再比如,针对表关联中多表排列顺序的问题,在基于规则的时代,查询效率是和表的连接顺序相关的,小表在左、大表在右的执行效率会高一些。但是现在基本上是基于代价的时代,所以大小表的顺序和效率无关,数据库优化器会自动去进行效率优化。但是,理解数据库内部的代码编译逻辑是数据工程师的基本素质,即使很多时候优化器会帮助我们进行代码优化,使我们减少很多思考,但是良好编程习惯的养成无论在任何时候都能使我们在工作中更加得心应手。

sql server 数据分析优化实战(一)——SQL语句优化相关推荐

  1. sql server 查看死锁,以及执行语句

    sql server 查看死锁,以及执行语句 第二秒 select t1.resource_type [资源锁定类型], DB_NAME(resource_database_id) as 数据库名, ...

  2. oracle bcp out,SQL Server利用bcp命令把SQL语句结果生成文本文件

    这篇文章主要为大家详细介绍了SQL Server利用bcp命令把SQL语句结果生成文本文件,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧!在SQL ...

  3. Sql Server RowNumber和表变量分页性能优化小计

    直接让代码了,对比看看就了解了 当然,这种情况比较适合提取字段较多的情况,要酌情而定 性能较差的: WITH #temp AS ( Select column1,column2,column3,col ...

  4. SQL Server数据分析面试题(202008)

    这是某公司的一份SQL Server数据分析面试题,总共有4道题,此处挑选了其中的3道,另外1道比较简单,就不列出来了. 第一题: 题目:写一个SQL函数,能将一串字符串按指定的分隔符拆分成行.比如给 ...

  5. Sql Server数据库事务介绍(二)---Sql语句,SqlTransaction和TransactionScope的使用方法

    本节主要介绍Sql语句,SqlTransaction和TransactionScope这三种使用事务的方法. 本节的所有例子都在sql server 2008和vs 2008环境下运行通过,如果没有s ...

  6. SQL SERVER 占用资源高的SQL语句

    SQL SERVER 占用资源高的SQL语句 原创曹振华 最后发布于2019-12-03 19:45:05 阅读数 16  收藏 展开 --SQL SERVER 占用资源高的SQL语句: --查询占用 ...

  7. SQL Server 2014 Win7 Win10 安装详解 SQL Server 2017 2019 Linux及SQL TSQL ETL实用案例

    SQL Server 2014安装图解与问题分析 简介 SQL Server2014 是Microsoft 公司推出的关系    型数据库管理系统.它用于大规模联机事务处理(OLTP).数据  仓库和 ...

  8. 一名小小的SQL Server DBA想谈一下SQL Server的能力

    一名小小的SQL Server DBA想谈一下SQL Server的能力 百度上暂时还没有搜索到相关的个人写的比较有价值的文章,至少在中文网络的世界里面没有 但是在微软的网站有这样一篇文章:<比 ...

  9. sql server 锁定_关于锁定SQL Server的全部

    sql server 锁定 .SQLCode { font-size: 13px; font-weight: bold; font-family: monospace;; white-space: p ...

  10. SQL Server 执行计划(8) - 使用 SQL 执行计划进行查询性能调优

    在本系列的前几篇文章(见底部索引)中,我们介绍了SQL 执行计划的多个方面,我们讨论了执行计划是如何在内部生成的,不同类型的计划,主要组件和运算符以及如何阅读和分析使用不同工具生成的计划.在本文中,我 ...

最新文章

  1. 什么是‘YTowOnt9‘?
  2. 前端传值后端接收不到_web前端和后端哪个好
  3. 爬取过程中出现验证码_PCBA贴片的过程中为什么出现白点或白斑
  4. WinSCP默认使用root用户登录的方法
  5. 使用Python进行科学计算:NumPy入门
  6. java(5)——数据类型中的字符型和布尔类型
  7. [源码和文档分享]基于C语言的语法高亮设计与实现
  8. android布局的属性,android
  9. Struts1.x在MyEclipse中的环境搭建和配置
  10. LINUX 下 配置MySQL数据库集群
  11. 跨境商家为什么要建自己的独立站?
  12. StringBuffer和StringBuilder总结
  13. 单片机c语言 课程设计报告,单片机课程设计心得体会精选
  14. 信息安全从业者考试认证大全(转自FreeBuf.COM 作者:522952110)
  15. 项目管理PMP:项目绩效考核管理制度(全岗位流程图66页)
  16. 【Windows】无法访问指定设备,路径或文件,您可能没有合适的权限访问这个项目
  17. Qt Quick 和qml介绍
  18. rtthread之工作队列
  19. 最新好玩的神乐七奈桌面宠物+附带BGM音效
  20. python模拟生成真实的电话号码 / 姓名

热门文章

  1. Linux常用命令(二十四) - chown
  2. h1z1服务器配置文件,H1Z1欧洲枪神配置文件 H1Z1欧洲枪神游戏什么配置
  3. php echo中文乱码问题
  4. (zhuan) Some Talks about Dual Learning
  5. 想剑网三妹子最多服务器,224人一起捏刘亦菲?剑网三妹子刚进游戏,就整了个花木兰出来...
  6. 给div添加disabled属性
  7. python数据存储方式_python各数据存储方法
  8. word段落居中的快捷键_段落快捷键是什么-段落居中对齐快捷键-段落左对齐的快捷键...
  9. 马航失联客机新进展:马方承认隐瞒信息
  10. SAP HANA XS创建XSJOB后台执行