我使用.NET framework 4.5.1 Linq to SQL。
我首先使用代码生成此产品类:
public class Part
{
public int PartID { get; set; }
[Required(ErrorMessage = "xxx")]
public string Title { get; set; }
[MaxLength(50)]
[Index(IsClustered = false, IsUnique = false,Order =1)]
public string Part_Number { get; set; }
[MaxLength(50)]
[Index(IsClustered = false, IsUnique = false, Order = 2)]
public string Manufacturer_Number { get; set; }
}
我在数据库中有大约250万个这样的实体。
第一种方法
var query = db.Parts.Where(s => s.Manufacturer_Number == sstring).ToList();
query.AddRange(db.Parts.Where(s => s.Part_Number == sstring).ToList());
query.AddRange(db.Parts.Where(s => s.Title == sstring).ToList());
第二种方法
var query = db.Parts.Where(s => s.Manufacturer_Number == sstring
|| s.Part_Number == sstring || s.Title == sstring).ToList();
第一种方法比第二种方法快100倍。谁能解释一下呢?
答案 0 :(得分:1)
首先没有标题索引我觉得有点难以相信你得到了你声称的行为。
至少设置统计信息,并将结果添加到此问题中。
但是说,第一种方法实际上是三次访问数据库,但会利用创建的索引。
第二种方法是单次访问数据库,但肯定会导致全表扫描,2,500,000行可能需要花费很多时间。
答案 1 :(得分:1)
正如我所说的问题可能在索引中,如果你希望你的查询更快这个确切的查询我建议你创建这个索引:
CREATE NONCLUSTERED INDEX PartIndex
ON Part (PartID, Manufacturer_Number, Part_Number, Title)
如果您经常更改表数据,请不要忘记更新统计信息。