背景 

  最近SSIS的开发过程中遇到几个问题。其中使用CTE时,遇到一个远程连接对象,结果导致严重的性能问题,为了应急我就修改了代码。

  之前我写了一篇介绍CTE的随笔包含了CTE的用法等:

http://wudataoge.blog.163.com/blog/static/80073886200961652022389/

问题

  在一个数据查询中遇到一个远程连接对象,然后使用了CTE,然后本地查询与远程对象的CTE进行了left join 。下面就是执行计划:

首先我们发现,最后一个操作符显示远程查询占了99%。

注意:

首先,远程查询使用的是CTE的表达式,我对CTE的理解有以下几点:

1.一次性视图(ADHoc View)。即必须后面跟着相应的select、insert、update等,只能用一次。

2.CTE表达式也是在内存中创建了一个表并对其操作。

3.with as 部分仅仅是一个封装定义的对象,并没有真的查询。

3.除非本身具有索引否则CTE中是没有索引和约束的。

4.没有专门的统计信息,这点与表变量很像。有可能会有错误的统计信息。

其次,连接操作符使用的是循环嵌套的操作符。这样就几何翻倍了查询的时间。

这里需要说一下NestedLoops:

本质上讲,“Nested Loops”操作符就是:为每一个记录的外部输入找到内部输入的匹配行。

技术上讲,这意味着外表聚集索引被扫描获取外部输入相关的记录,然后内表聚集索引查找每一个匹配外表索引的记录。

以上两个说法都表明了这种方式导致的性能问题。因为每一次循环都要访问一次链接服务器。当数据很大的时候极大地增加了查询时间。我这边70000+的数据执行了半小时。

解决:

既然了解了问题的情况,那我就着手解决问题。主要是两分解成两个步骤:

1.将远程链接服务器的查询结果插入临时表。

2.本地数据与临时表做left join。

对应的执行计划如下:

可以看到整个性能得到了极大的提高。修改完成后执行时间缩减到20秒以内。效率还是惊人的。

可以对比一下表变量与cte表倒是不同的特点:

  • tempdb中实际存在的表
  • 能索引
  • 有约束
  • 在当前连接中存在,退出后自动删除。
  • 有由引擎生成的数据统计。

通过两个方式的不同点可知几种情况不应当使用CTE:

1.结果集较大时不应使用。

2.查询时间较长的不要使用,比如跨服务器查询。

3.需要大的表连接的,比如行很多的各种join。尤其没有索引。

4.多次查询数据。

5.需要优化相关子查询。

这些时候使用临时表甚至表变量将会带来性能的提升。具体我就不在这里细说了有兴趣可以一起讨论下。

一些网上的错误:

1.materialize 提示 可以强制将WITH AS短语里的数据放入一个全局临时表里。sql server中根本没有这个提示。据说2014以后可能会有?

2.CTE 性能要差,根据实际情况出发,据我所知在绝大多数情况下,CTE的性能要好。尤其是对比游标(迭代)和内置函数的情况下,都会大大提高性能。

3.CTE使用了tempdb,没有仅仅使用了内存。

总结:

  通过解决实际问题,让我了解了CTE的运行机制。可以理解为一种一次性的视图。当然我们这里需要着重说明,CTE本身在性能优化上还是有很大作用的,尤其对于递归查询和内置函数的使用时都极大的较少了IO。

我猜想CTE内部原理应该与游标相似,但是极大的简化了性能,也许是优化器的功劳。最后由于仅仅使用了内存中这样也大大减少了连接瓶颈。

  这部分很多是我的个人观点,希望各位大神帮忙指摘一下。

SQL优化技巧--远程连接对象引起的CTE性能问题相关推荐

  1. sql优化技巧_使用这些查询优化技巧成为SQL向导

    sql优化技巧 成为SQL向导! (Become an SQL Wizard!) It turns out storing data by rows and columns is convenient ...

  2. mysql 判断字段为null表示 false 其它为true_日拱一卒,MySQL数据库 常用SQL优化技巧 十一式...

    本文中所提到的SQL优化技巧均是基于Mysql 索引 BTree类型 .将从以下几个方面介绍常用的SQL优化技巧: 避免在 WHERE 子句中使用 != 或 <> 操作符. 避免在 WHE ...

  3. PostgreSQL常用SQL优化技巧

    PostgreSQL的SQL优化技巧其实和大多数使用CBO优化器的数据库类似,因此一些常用的SQL优化改写技巧在PostgreSQL也是能够使用的.当然也会有一些不同的地方,今天我们来看看一些在Pos ...

  4. 常用的7个SQl优化技巧

    作为程序员经常和数据库打交道的时候还是非常频繁的,掌握住一些Sql的优化技巧还是非常有必要的.下面列出一些常用的SQl优化技巧,感兴趣的朋友可以了解一下. 1.注意通配符中Like的使用 以下写法会造 ...

  5. SQL Server 2005远程连接和外围应用配置器修复

    开通SQL Server 2005远程连接 1.1         配置远程连接 默认情况下, SQLServerExpressEdition 2005 和 SQL Server 2005 开发版不允 ...

  6. mysql io次数_MySQL_揭秘SQL优化技巧 改善数据库性能,优化目标   1、减少 IO 次数 - phpStudy...

    揭秘SQL优化技巧 改善数据库性能 优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO ...

  7. 15个常用的sql优化技巧

    原文:https://www.cnblogs.com/12lisu/p/15535940.html 作者:苏三说技术 前言 sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可 ...

  8. SQL数据库不用SQL语句能显示全表的内容_详解mysql数据库sql优化技巧总结

    概述 关于SQL优化的教程很多,但是比较杂乱.所以抽空整理了一下,也写出来跟大家分享一下.以下主要针对MySQL数据库,Oracle数据库也可以参考. 优化技巧总结 1.建索引 对查询进行优化,要尽量 ...

  9. SQL Server 2008远程连接时SQL数据库不成功怎么办

    注:复制于http://www.3lian.com/edu/2013/05-13/69677.html ; 远程连接SQL Server 2008,服务器端和客户端配置 关键设置: 第一步(SQL20 ...

最新文章

  1. SQL: ORA-00979 不是 GROUP BY 表达式 及 Group by 的用法说明
  2. 那些复杂的技术设计的开始离我们并不遥远
  3. 用python画出小人发射爱心_小人发射爱心biu简笔画表情-biu小人简笔画表情动态完整版-东坡下载...
  4. 1.Eclipse创建普通java工程
  5. 更强、更稳、更高效:解读 etcd 技术升级的三驾马车
  6. Java但中获取时间将时间转换成字符串格式(年月日格式)
  7. java jsr_分叉并加入Java 7 – JSR 166并发实用程序
  8. LeetCode 410. 分割数组的最大值(极小极大化 二分查找 / DP)
  9. centos7赋予全部权限_终结CentOS 7+Snort2.9+BASE 安装
  10. 数据结构 (二) ----- 单向链表双向链表
  11. DXUT框架剖析(13)
  12. 快速上手Perl语言
  13. 计算机机房消房安全管理制度,计算机机房消防安全管理制度
  14. 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(图像处理)
  15. 自学python接单_Python接私活,兼职轻松月薪过万,会技术就可走遍天下
  16. 苹果youtube无法连接网络_解决苹果手机Apple ID被禁止下载或无法连接到AppStore等问题...
  17. 学习c语言必备的书籍推荐
  18. 2018-2021,60+篇阿里研发效能提升合集,都在这里了
  19. Google街景车在台湾香港出现
  20. Django之django-dynamic-preferences

热门文章

  1. C#和.NET Framework的关系
  2. 交换机三种端口模式Access、Hybrid和Trunk的理解
  3. 自定义C++一元多项式类
  4. 学会做“男人”—Linux Man的使用技巧
  5. 快速了解Druid -- 实时大数据分析软件
  6. CNN-2: AlexNet 卷积神经网络模型
  7. 关于ReetrantLock
  8. asyncio协程与并发
  9. 迟到的2017年终总结与2018目标规划
  10. mysql cmd链接不上数据库情况汇总