sqlserver 关联查询 charindex 函数 查询慢,不使用索引问题解决办法

问题:

  两张表 数据都非常多

      A表中A1字段 需要关联B表主键 查询

      A1 字段 存储多个B表主键

  格式为:

    格式1:b1,b2,b3

    格式2:b4

    格式3:b5,b6

      逗号分隔的占少数

      这样就导致在做关联查询时,必须使用 like '%...%',  charindex ,又或者replace(A1,b1,'') <> A1 等手段,而在SqlServer中使用这些方法来查询,会触发全表检索,导致字段对应的索引失效,效率极低;

 

解决方案:

  前提:在逗号分隔的数据 与 直接关联的数据量有差异的情况下,如 总共100条数据,其中99 条都是A1 直接存储B表主键,有一条存储了多个B表主键,并用逗号分隔

  那么可以 采用分开查询,单个存储于多个存储值 的记录分开查询结果用 union 关键字做合并 如:

  

select AA.* from A AA
  where exists(
    select A.pk from A,B where A.A1 like '%,%' and charindex(B.pk,A.A1) > 0 and AA.pk = A.pk
    union all
    select A.pk from A,B where A.A1 =B.pk and AA.pk = A.pk
  )

其实就是根据数据量大小 将 需要使用全表检索的数据分开,而不影响其他不需要全表检索的数据查询速度,从而解决查询卡顿的问题

  

  

 

 

 

  

转载于:https://www.cnblogs.com/Acei/p/6830076.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值