SQL Server ->> 条件筛选做法之 -- IN(VALUE1,VALUE2,...)与INNER JOIN STRING_SPLIT()性能对比

在以逗号拼接而成的字符串,传入给IN字句的元素字符串中包涵了1400多个元素

两种做法分别为

AND e.ssPfCityId IN (
SELECT
CAST(value AS INT)
FROM STRING_SPLIT(‘110000,310000,120000,210100,210200,210400,210800,211200,350100,350500,350200,350800,350700,350900,441200,441300,440500,445100,450100,451000,450800,450300,451100,450200,450900,450500,450400,450600,460100,510100,...‘
,‘,‘)
)

INNER JOIN (SELECT DISTINCT CAST(value AS INT) AS VALUE FROM STRING_SPLIT(‘110000,310000,120000,210100,210200,210400,210800,211200,350100,350500,350200,350800,350700,350900,441200,441300,440500,445100,450100,451000,450800,450300,451100,450200,450900,450500,450400,450600,460100,510100,...‘,‘,‘) T) T ON e.ssPfCityId = T.VALUE

对比看出如果用IN字句会用一个HASH MATCH的聚合操作符,而用INNER JOIN则用DISTINCT SORT。

而如果对比IO统计数据可以发现IN字句的做法多出了许多Workfile产生的IO

(128478 行受影响)

表 ‘Worktable‘。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 577 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ‘Workfile‘。扫描计数 70,逻辑读取 2424 次,物理读取 172 次,预读 2268 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ‘employee‘。扫描计数 9,逻辑读取 4559 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ‘verifyProcess‘。扫描计数 9,逻辑读取 3136 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

而用INNER JOIN则么有Workfile产生的IO

(128478 行受影响)
表 ‘Worktable‘。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ‘Workfile‘。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ‘employee‘。扫描计数 9,逻辑读取 4559 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ‘verifyProcess‘。扫描计数 9,逻辑读取 3136 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

这个例子的性能看上去总时间开销差别并不是很明显,因为连接的表数量少,而如果连接的表数量多起来,可能整个执行计划会是另一回事,那个时候IN字句的弊端就显现了。

时间: 2024-10-13 08:53:07

SQL Server ->> 条件筛选做法之 -- IN(VALUE1,VALUE2,...)与INNER JOIN STRING_SPLIT()性能对比的相关文章

SQL SERVER 2008筛选时报错 无法为该请求检索数据

使用SqlServer2008的筛选功能时报错“无法为该请求检索数据. (Microsoft.SqlServer.Management.Sdk.Sfc)” 如下图: 解决方法: 打上SQL SERVER SP1补丁. 下载地址: http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=66AB3DBB-BF3E-4F46-9559-CCC6A4F9DC19

强制SQL Server执行计划使用并行提升在复杂查询语句下的性能

最近在给一个客户做调优的时候发现一个很有意思的现象,对于一个复杂查询(涉及12个表)建立必要的索引后,语句使用的IO急剧下降,但执行时间不降反升,由原来的8秒升到20秒. 通过观察执行计划,发现之前的执行计划在很多大表连接的部分使用了Hash Join,由于涉及的表中数据众多,因此查询优化器选择使用并行执行,速度较快.而我们优化完的执行计划由于索引的存在,且表内数据非常大,过滤条件的值在一个很宽的统计信息步长范围内,导致估计行数出现较大偏差(过滤条件实际为15000行,步长内估计的平均行数为80

SQL Server ->> Memory Allocation Mechanism and Performance Analysis(内存分配机制与性能分析)之 -- Minimum server memory与Maximum server memory

Minimum server memory与Maximum server memory是SQL Server下配置实例级别最大和最小可用内存(注意不等于物理内存)的服务器配置选项.它们是管理SQL Server内存的途径之一. Minimum server memory与Maximum server memory Minimum server memory(MB): 最小服务器内存.一旦超过这个线就不会再把内存换回去.但是也不是说SQL Server一启动马上就申请这么多的内存. Maximum

SQL Server 逻辑转换

使用 OR 逻辑是因为它符合人们的思维习惯.用使用 OR 逻辑的逻辑表达式来确定优先级和标识锚点行之后的行,也相当直观. 但是,因为 SQL Server 优化器的工作方式,OR 逻辑在性能方面存在问题,特别是当一些被筛选的列上没有索引时. 例如,考虑这样一个筛选器“col1=5 or col2=10”.如果分别在 col1 和 col2 上有单独的索引,优化器可以先在每个索引中筛选出行,然后再对两个结果执行索引交集运算(index intersection)运算.然而,如果只在其中一列上有索引

SQL Server索引进阶:第十三级,插入,更新,删除

在第十级到十二级中,我们看了索引的内部结构,以及改变结构造成的影响.在本文中,继续查看Insert,update,delete和merge造成的影响.首先,我们单独看一下这四个命令. 插入INSERT 当向表中插入一行数据的时候,不管表是堆表还是聚集索引表,肯定会在表的索引中插入一个入口,过滤索引除外.这么做的时候,SQL Server使用索引键的值从根页到叶子层页,到达叶子层页之后,检查页的可用空间,如果有足够的空闲空间,新的入口就会被插入适当的位置. 最终,SQL Server可能会试图向一

全废话SQL Server统计信息(1)——统计信息简介

当心空无一物,它便无边无涯.树在.山在.大地在.岁月在.我在.你还要怎样更好的世界?--张晓风<我在> 为什么要写这个内容? 随着工作经历的积累,越来越感觉到,大量的关系型数据库的性能问题,其根源在于统计信息.这里说的是根源,其实很多时候大家觉得的那些什么索引失效等都只是表象.当然,不能一概而论,还有很多问题如配置问题.设计问题等等,甚至电源也会影响性能. 之所以得出这个结论,因为在常规的开发和部署过程中,一般企业级系统已经大量使用较为高级的磁盘阵列甚至企业级SSD,IO方面的问题已经很少,而

SQL Server中TOP子句可能导致的问题以及解决办法

原文:SQL Server中TOP子句可能导致的问题以及解决办法 简介      在SQL Server中,针对复杂查询使用TOP子句可能会出现对性能的影响,这种影响可能是好的影响,也可能是坏的影响,针对不同的情况有不同的可能性.      关系数据库中SQL语句只是一个抽象的概念,不包含任何逻辑.很多元数据都会影响执行计划的生成,SQL语句本身并不作为生成执行计划所参考的元数据(提示除外),但TOP关键字却是直接影响执行计划的一个关键字,因此在某些情况下使用TOP会导致性能受到影响,下面我们来

第三篇——第二部分——第一文 SQL Server镜像简介

原文:第三篇--第二部分--第一文 SQL Server镜像简介 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26951563 镜像是什么?说白了就是个镜子(没用过镜子?没镜子你总要小便吧?开个玩笑.. ),这里镜子的含义主要有两个:1.一模一样,下面会详细介绍,包括库名.数据文件和日志文件的存放路径都要一样.2.看得到,却"用不了",镜像库在没有做任何处理时是不可访问的.下面进入专业一点的解释: 数据库镜像(SQL Se

SQL Server Join方式

1.测试数据准备 参考:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek 这篇博客中的实验数据准备.这两篇博客使用了相同的实验数据. 2.SQL Server中的三种Join方式 在Sql Server中,每一个join命令,在内部执行时,都会采用三种更具体的join方式来运行.这三种join的方法是:nested loops join.merge join和hash join.这三种方法,没有哪一种是永远最好的,但是都有其最适合的上下文.S