当前位置: 首页 > news >正文

TOP语句放到表值函数外,效率异常低下

在XXX系统中,有一个获取客户数据的SQLSERVER 表值函数,如果使用管理员登录,这个函数会返回150W行记录,大概需要30秒左右,但如果将TOP语句放到表值函数外,效率异常低下,需要约3分钟:
select  top  20   *  from GetFrame_CustomerSerch( ' admin ', ' 1 ')

 
将GetFrame_CustomerSerch 中的SQL语句提取出来,直接加上Top查询,只需要6秒,快了N倍:
declare  @WorkNo  varchar( 38)
declare  @SerchChar  varchar( 500)
set  @WorkNo = ' admin '
set  @SerchChar = ' 1 '
select  top  20 a.GUID,a.CustomerName,a.CustomerIDcard,a.CustomerPhone,a.CustomerMobile  from
 (
  select  *  from WFT_Customer a  where a.FinancialPlannerWorkNO  IN
 ( SELECT gml.workno  FROM dbo.GetManagerList( @WorkNo) gml)
  and (
  a.CustomerName  like  ' % ' + @SerchChar + ' % '
   or a.CustomerIDcard  like  ' % ' + @SerchChar + ' % '
   or a.CustomerMobile  like  ' % ' + @SerchChar + ' % '
   or a.CustomerPhone  like  ' % ' + @SerchChar + ' % '
 )
 ) a  union  all
  select b.GUID,b.CustomerName,b.CustomerIDcard,b.CustomerPhone,b.CustomerMobile  from WFT_ManagerCollectUsers a  left  join WFT_Customer b  on a.FundAccount =b.FundAccount
  -- where a.WorkNo=@WorkNo
  WHERE a.WorkNo  IN
 ( SELECT gml.workno  FROM dbo.GetManagerList( @WorkNo) gml)
  and (
  b.CustomerName  like  ' % ' + @SerchChar + ' % '
   or b.CustomerIDcard  like  ' % ' + @SerchChar + ' % '
   or b.CustomerMobile  like  ' % ' + @SerchChar + ' % '
   or b.CustomerPhone  like  ' % ' + @SerchChar + ' % '
 )

 
为什么会有这么大的差异?
我分析可能有如下原因:
1,在表值函数外使用Top或者其它条件,SQLSERVER 的查询优化器无法针对此查询进行优化,比如先返回所有记录,然后再在临时表中选取前面的20条记录;
2,虽说该表值函数使用了“表变量”,它是内存中的,但如果这个“表”结果很大,很有可能内存放不下(并非还有物理内存就会将结果放到物理内存中,数据库自己还会有保留的,会给其它查询预留一定的内存空间),使用虚拟内存,而虚拟内存实际上就是磁盘页面文件,当记录太多就会发生频繁的页面交换,从而导致这个查询效率非常低。

相关文章:

  • 产品经理教你玩转阿里云负载均衡SLB系列(一):快速入门--什么是负载均衡
  • Enum一点使用总结
  • 路由器相关参数及设置
  • 祝网友们龙年快乐!
  • CSS以图换字的9种方法
  • 部署Oracle 11.2.0.3 RAC (二)
  • [WinForm]DataGridView通过代码新增行问题
  • linux下配置SS5(SOCK5)代理服务
  • Spring.net 学习笔记之ASP.NET底层架构
  • stagefright框架 Video Playback的流程
  • EF架构~LinqToEntity里实现left join的一对一与一对多
  • Linux一般由四个主要部分组成
  • sshfs
  • Trie树(字典树)
  • MYSQL 的一些基本操作
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 11111111
  • CentOS 7 防火墙操作
  • CSS居中完全指南——构建CSS居中决策树
  • CSS相对定位
  • DataBase in Android
  • DOM的那些事
  • HTML5新特性总结
  • isset在php5.6-和php7.0+的一些差异
  • javascript 总结(常用工具类的封装)
  • Protobuf3语言指南
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React组件设计模式(一)
  • Ruby 2.x 源代码分析:扩展 概述
  • select2 取值 遍历 设置默认值
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 老板让我十分钟上手nx-admin
  • 聊聊flink的TableFactory
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 小程序测试方案初探
  • 一个JAVA程序员成长之路分享
  • 因为阿里,他们成了“杭漂”
  • 如何用纯 CSS 创作一个货车 loader
  • # Java NIO(一)FileChannel
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (26)4.7 字符函数和字符串函数
  • (多级缓存)多级缓存
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十八)三元表达式和列表解析
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)库存超卖案例实战——优化redis分布式锁
  • (推荐)叮当——中文语音对话机器人
  • .axf 转化 .bin文件 的方法
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 反射 Reflect
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET中统一的存储过程调用方法(收藏)