我目前正在使用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没有任何索引
答案 0 :(得分:0)
当您需要显示&#34; Total Rows&#34;时,您总会遇到问题。为了做到这一点,必须完成全部工作,唯一的节省就是传输的数据量。
如果您必须计算&#34; Total Rows&#34; 和页面我建议在两个不同的步骤中执行此操作:
SELECT COUNT(1) FROM Customer
请注意,我没有加入同义词,这是您减速的一部分。
(您已经知道如何执行此步骤)