sql in语句的性能问题

sql in语句的性能问题,第1张

每个机票订单含有多个票,用符合条件的订单List,去查询对应的票List。

两张表的关联方式是用一个特性的key关联,其中包含,代理商区分标志,订单号,订单类型等,是一个长度在30~50之间的varchar

遍历list一条一条查的话,IO太多,显然不合适。我们就想到用in来实现批量查询

在beta测试时,库中表里只有一个月的数据,大约在1000万左右,测试时没有发现问题。

到了线上之后,发现查询数据非常慢,两万左右的in条件,查询起来,时间在10分钟左右,显然出现了慢查询。

针对这个问题,做了几个测试,看了下执行计划,如下所示

事实上我们看到,在in语句中数据量不大的情况下,索引是有效的,不过这个数量已经是极限了。

下面是我的语句

这里在in里面包含了三万条数据,索引实效了。

这里我们首先想到,强制使用索引会不会有所帮助如下

但是,事实上并没有效果,这是结果

解下来我们分析一下,两个问题,索引为什么会失效

这个问题需要从两个方面入手

1.索引区分度

2.预计扫描行数

3.优化器的选择

先看第一个,索引的区分度,经过随机采样,看着内容还是很高的。

预计扫描行数

预计扫描行数的话,如前两图所示,基本都走了全表扫描。

优化器的选择

优化器选择时,衡量了回表等 *** 作,综合考虑,这里没有办法继续下去了,只能问到DBA了。

在数据表大时,索引负重较大,同样的情况下,in语句里面数据条数够大时,索引会失效,可以通过force index尝试一下,不过成功的可能行很小,尽量分批去查找,批次数量可配置。

假设原来的句子是

select * from t1 where t1.f1 in (select t2.f2 from t2 where t2.f2=xxx)

和你的很类似

你用子查询 很慢

我们现在修改为:

select t1.* from t1 ,t2 where t1.f1 = t2.f2 and t2.f2=xxxx

这里使用了关联查询代替了子查询大大提高效率。

其次你可以考虑在表t1.f1上加索引,提高查询速度。

楼主测一下结果集是否正确

declare @lFAD01 int

set @lFAD01 = 605

SELECT

case a.VBL04 when 2 then '门诊挂号' else '门诊收费' end 业务类别

, b.AAO02 支付类型

, a.VBL14 支付方式

, SUM(case a.VBL05 when 4 then a.VBL13 else 0 END) 退费

, SUM(case a.VBL05 when 4 then 0 else a.VBL13 END) 收费

, SUM(a.VBL13) 实收

FROMV_VBL_Full a

JOIN AAO1 b ON a.VBL15 = b.AAO01

JOIN vaa1 c ON c.vaa01 = a.vaa01

WHERE VBL17 = @lFAD01 and a.VBL04 >= 2 and a.VBL04 <= 3

and not exists(select 1 from IAS1 where IAS1.VAK01=a.VAK01)

AND NOT EXISTS(SELECT 1 FROM V_VBL_Full AS a1 WHERE (a1.VBL01=a.VBL01 OR a.VBL01A=a1.VBL01) AND EXISTS(SELECT 1 FROM IAS1 WHERE VAK01=a1.VAK01))

GROUP BY case a.VBL04 when 2 then '门诊挂号' else '门诊收费' END,b.AAO02,a.VBL14


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9932780.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存