鸿 网 互 联 www.68idc.cn

当前位置 : 主页 > 数据库 > mssql > >

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

来源:互联网 作者:佚名 时间:2017-09-20 14:51
问题: 两张表 数据都非常多 A表中A1字段 需要关联B表主键 查询 A1 字段 存储多个B表主键 格式为: 格式1:b1,b2,b3 格式2:b4 格式3:b5,b6 逗号分隔的占少数 这样就导致在做关联查询时,必须使用 like '%...%', charindex ,又或者replace(A1,b1,'')

问题:

  两张表 数据都非常多

      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
  )

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

  

  

 

 

 

  

网友评论
<