如何提高Select查询从数据库中获取大量数据的性能

时间:2014-03-11 09:58:54

标签: c# asp.net sql-server

我希望在网站上获取大量数据(大约19000条记录),并在datalist控件上显示。 我的数据列表有一个分页功能,第一次我在datalist上只显示6条记录。 那么他的用户可以去第2页和第3页...... 获取所有记录到数据表获得更多时间。 请帮我详细说明我应该在sql server中使用什么。

private void FetchDataToDataList()
{
    DataTable dt = new DataTable();
    if (Cache["DataTable-cach"] == null)
    {
        String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection con = new SqlConnection(strConnString);
        SqlCommand cmd = new SqlCommand("SELECT dbo.table_name.field_name, FROM dbo.table_name ", con);
        con.Open();
        dt = new DataTable("T");
        string startime = System.DateTime.Now.ToLongTimeString();
        dt.Load(cmd.ExecuteReader());
        string endtime = System.DateTime.Now.ToLongTimeString();
        Cache.Insert("DataTable-cach", dt, null, DateTime.Now.AddMinutes(5), System.Web.Caching.Cache.NoSlidingExpiration);
        con.Close();
    }
    else 
    {
        dt = ((DataTable)Cache["DataTable-cach"]);
    }

    // pagedDS is data list control
    PagedDataSource pagedDS = new PagedDataSource();
    pagedDS.DataSource = dt.DefaultView;
    pagedDS.AllowPaging = true;
    pagedDS.PageSize = 6;
    pagedDS.CurrentPageIndex = CurrentPage;
    dlPaging.DataSource = pagedDS;
    dlPaging.DataBind();
    lblCurrentPage.Text =  pagedDS.PageCount.ToString() +" صفحه    " +  (CurrentPage + 1).ToString()+ " از " ;
    // Disable Prev or Next buttons if necessary
    cmdPrev.Enabled = !pagedDS.IsFirstPage;
    cmdNext.Enabled = !pagedDS.IsLastPage;
}

3 个答案:

答案 0 :(得分:4)

根据SQL Server版本,您应该只根据需要从数据库中请求尽可能多的记录。

在SQL Server 2012中,您可以使用OFFSETFETCH NEXT关键字。在早期版本中,请使用ROW_NUMBER

答案 1 :(得分:0)

答案 2 :(得分:0)

一次Laoding 19,000条记录不是一个好选择,因为它需要时间来同时构建所有的html。

最重要的是,你不会一次显示所有记录。

因此,您只需要加载当前正在向用户显示的记录。

这极大地提升了您的性能/页面加载速度。

编写存储过程,使得您一次只获取所需记录而不是所有记录。

示例:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================

CREATE PROCEDURE GetDataPageWise                      // Name of the stored procedure
      @PageIndex INT = 1
      ,@PageSize INT = 10
      ,@RecordCount INT OUTPUT
AS
BEGIN
      SET NOCOUNT ON;
      SELECT ROW_NUMBER() OVER
      (
            ORDER BY [ColumnName] ASC
      )AS RowNumber
      ,[ColumnName]
      ,[ColumnName]
      ,[ColumnName]
     INTO #Results                              // #Results is the temporary table that we are creating
      FROM [TableName]

      SELECT @RecordCount = COUNT(*)
      FROM #Results

      SELECT * FROM #Results
      WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

      DROP TABLE #Results                      // Dropping the temporary table results as it is not required furthur
END
GO

希望这会有所帮助..