如何优化搜索?

时间:2012-03-28 12:11:41

标签: .net sql-server linq

我只是编写一个测试应用程序,以确定如何优化对大量记录的搜索,以便在gridview中显示。

目前,我有一个包含20,000条记录的测试表(目前没有索引),我希望在gridview中以20个批量显示记录。我不确定如何做到这一点,我正在努力理解它背后的理论。

namespace TestingIndexes
{
  public partial class Default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void btnStart_Click(object sender, EventArgs e)
    {
      gvResults.DataSource = GetContacts();
      gvResults.DataBind();
    }

    private List<Contact> GetContacts()
    {
      List<Contact> contacts = new List<Contact>();

      DataClasses1DataContext dc = new DataClasses1DataContext();

      // Track time elapsed
      Stopwatch sw = new Stopwatch();
      sw.Start();

      var result = from c in dc.GetTable<Contact>()
      select c;

      sw.Stop();
      ltMessage.Text = "<p>Time elapsed: " + sw.ElapsedMilliseconds + "</p>";

      if (result.Count() > 0)
        contacts = result.ToList<Contact>();

      return contacts;
    }
  }
}

正如您所看到的,这是一个使用LINQ的非常简单的查询,我非常确定我不希望每次将20,000条记录带入内存以便将其绑定到gridview。有什么选择呢?我想我想要做的是最终查询数据库以查找有很多记录,但之后在gridview中一次只显示20条记录。这是由SQL Server处理的吗?我肯定必须有关于我正在尝试做什么的文章,但我不完全确定我应该寻找什么。任何教程的指针或链接都会非常有用!

任何人都可以帮我指出正确的方向吗?

2 个答案:

答案 0 :(得分:4)

您应该使用SkipTake从数据库表中获取部分数据。

var result = dc.GetTable<Contact>().Skip(40).Take(20).ToList();

答案 1 :(得分:0)

首先,last和allways在表上构建一个(聚集的)索引理想情况下,索引也包含您想要返回的行。如果你没有,那么SQL将逐步完成所有记录。如果覆盖索引到位,SQL将只访问索引。如果你想了解SQL,那么可能没有比http://www.sqlserverinternals.com/ Kalen Delaney更好的资源了。 “覆盖索引”以及更多内容都清晰地解释,甚至对她书中的内容的肤浅理解也会让你成为一个更好的开发者哦,而http://en.wikipedia.org/wiki/Database_index