EF SQL查询逗号分隔字符串Id的性能



要存储和查询关联的ID,哪种方法在查询速度和性能方面效果最好?尤其是在主表中的大量记录中,如100000条记录。

1-使用逗号分隔的字符串字段作为Ids:

query.Where(x => (',' + x.Ids + ',').Contains(',' + value + ','));

2-使用单独的表和联接操作:

query.Where(x => x.SecondaryTable.Any(s => s.Id == value));

如果将Id存储为逗号分隔的字符串,则始终具有TABLE/INDEX扫描。如果你的桌子很小,那就足够了。

SecondaryTable表存储与主表相关联的Id,还有很多其他计划:

  1. 您可以保持原样,并信任或不信任DB引擎优化器
query = query.Where(x => x.SecondaryTable.Any(s => s.Id == value));
  1. 如果对(MainId,Id(是唯一的。以下查询肯定会命中索引
var query = 
from m in query
from s in m.SecondaryTable.Where(s => s.Id == value)
select s;
  1. 如果对(MainId,Id(不是唯一的
var secondary = db.SecondaryTable.Where(s => s.Id == value);
var mainIds = secondary.Select(s => new { s.MainId }).Distinct();
query = 
from m in query
from s in mainIds.Where(s => s.MainId == m.Id)
select m;

无论如何,最好测试和检查执行计划。

第一个选项对动态生成的字符串执行字符串比较,因此索引不可能提高查询性能。它将异常缓慢。

第二个选项是对索引主键执行数字比较(假设Id是某种数字类型,并且它是主键(。对于处理器来说,这是一个更快的比较,而且它是一个简单的比较,不需要为所述比较生成动态数据。

最新更新