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