簡體   English   中英

如何提高Select查詢的性能,以從數據庫中獲取大量數據

[英]How to increase the Performance of the Select query fetching Huge data from database

我想在站點上獲取大量數據(大約19000條記錄),並在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;
}

根據SQL Server的版本,您應該只從數據庫中請求所需數量的記錄。

在SQL Server 2012中,可以使用OFFSETFETCH NEXT關鍵字。 在早期版本中,使用ROW_NUMBER

一次放置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

希望這可以幫助..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM