单个查询慢于3个查询

时间:2016-02-02 09:50:32

标签: c# .net linq-to-sql

我使用.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倍。谁能解释一下呢?

2 个答案:

答案 0 :(得分:1)

首先没有标题索引我觉得有点难以相信你得到了你声称的行为。

至少设置统计信息,并将结果添加到此问题中。

但是说,第一种方法实际上是三次访问数据库,但会利用创建的索引。

第二种方法是单次访问数据库,但肯定会导致全表扫描,2,500,000行可能需要花费很多时间。

答案 1 :(得分:1)

正如我所说的问题可能在索引中,如果你希望你的查询更快这个确切的查询我建议你创建这个索引:

CREATE NONCLUSTERED INDEX PartIndex 
ON Part (PartID, Manufacturer_Number, Part_Number, Title)

如果您经常更改表数据,请不要忘记更新统计信息。