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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
  )

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

  

  

 

 

 

  






以上是关于sqlserver 关联查询 charindex 函数 查询慢,不使用索引问题解决办法的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer varchar数据中类似于1.1.1.1这种值的排序方法

SQLServer函数 left()charindex()stuff()的使用

SQLserver中字符串查找功能patindex和charindex的区别

sqlserver 按分隔符截取字符串

数据库把1行查询为n行

Sql中CHARINDEX用法