SQL Sever从视图

时间:2017-01-09 15:31:27

标签: c# asp.net sql-server linq

我目前正在使用SQL Server 2008 R2和ASP.Net与Linq

在服务器1上

我们的数据库包含一个表,其中包含大约一百万条记录的地址信息。

在服务器2上

我有一个包含大约一百万条记录的客户表,其中包含一个AddressID

我创建了同义词以链接到服务器1以获取地址表。并创建了一个视图,将两个表链接在服务器2中。

一个存储过程来处理数据的分页,以便它返回一个包含20条记录的页面,还尝试将RowNumber添加到实际视图中,这样就没有提高速度

CREATE PROCEDURE [dbo].[GetCustomerAddressesByPage] 
(
    @pageIndex int,
    @pageSize int,
    @totalRows int output
)
AS
BEGIN
  DECLARE @startRowIndex int
  DECLARE @endRowIndex int

  SET @startRowIndex = (@pageIndex * @pageSize) + 1;
  SET @endRowIndex = (@pageIndex + 1) * @pageSize;

  --SELECT * FROM
  --  (SELECT ROW_NUMBER() OVER (ORDER BY CustomerID) AS RowNumber,*
  --     FROM View_CustomersAddress) xx
  --WHERE RowNumber >= @startRowIndex AND RowNumber <= @endRowIndex

  SELECT *
    FROM View_CustomersAddress
    WHERE RowNum >= @startRowIndex AND RowNum <= @endRowIndex

  SELECT @totalRows = COUNT(*) FROM View_CustomersAddress  
END

这会在2秒内返回数据,但要处理页数我还需要总行数,下面的代码需要另外20秒左右才能完成

SELECT @totalRows = COUNT(CustomerID) FROM View_CustomersAddress 

服务器代码如下填充gridview中的数据

public IQueryable<GetCustomerAddressLinesByPageResult2> GetAddress(int startRowIndex, int maximumRows)
{
    var data = dbContext.GetCustomerAddressLinesByPage(startRowIndex, maximumRows);
    return data;
}

由于使用同义词,视图不包含任何索引,所以我目前在我的asp.net程序的视图状态中存储总行,所以在初始加载时它需要25秒+但是分页很好。

无论如何都要增加count()的性能,或者在不使用我没想过的count()的情况下使用另一种方式来实现它。

只是为了澄清

服务器1上的地址表具有主键AddressID并且是唯一的

服务器2上的客户表具有主键CustomerID并且是唯一的

由于服务器1和服务器2之间的同义词,View_CustomersAddress没有任何索引

1 个答案:

答案 0 :(得分:0)

当您需要显示&#34; Total Rows&#34;时,您总会遇到问题。为了做到这一点,必须完成全部工作,唯一的节省就是传输的数据量。

如果您必须计算&#34; Total Rows&#34; 页面我建议在两个不同的步骤中执行此操作:

第1步 - 获取总行数

SELECT COUNT(1) FROM Customer

请注意,我没有加入同义词,这是您减速的一部分。

第2步 - 获取页面结果

(您已经知道如何执行此步骤)