![](/img/trans.png)
[英]What is the best way to fetch a single record via an OleDbConnection?
[英]What would be the best way to fetch around a million record from DB?
我需要在网页上获取和显示数据,其记录数量可能会因大约500条记录到100万条记录的过滤器而异。
缓存在这里会有用吗,因为我认为记忆中的百万记录不是一个好主意。 SqldataReader
?
当然,分页是必须实现的。 显示100万条记录是最糟糕的情况(用例中的愚蠢的All filter
!)。
我应该使用连接架构(SqlDataReader)还是断开连接的架构(DataSet)?
首先,想一想:显示100万条记录对任何用户都没有意义。 因此,您必须考虑用户期望看到的内容。 也许总结一下?! 也许可以将这些记录分页为25或50或100条记录。 这些方法中的任何一种都不需要您在内存中一次保存1 M条记录。
此外,当您对SQL数据库运行查询并使用SqlDataReader时,您将不会收到所有记录,而是SQL驱动程序将查询发送到SQL服务器,服务器将执行查询,准备结果集并创建服务器上的只进游标。 然后,每次在SqlDataReader上调用Read()时,驱动程序将一次获取一条记录。 如果使用使用延迟执行的LINQ to SQL,则行为非常相似。 在您特别请求每一行之前(或除非),结果集不会被完全转移。
因此,一个简单的分页查询就可以解决问题。 或者在其他情况下,某种汇总报告汇总来自100万条记录的数据,一页或两页相关数据。
当然,如果你确实需要在页面中来回移动,那么某种缓存可能是有意义的,但是再考虑一下:用户实际想要浏览100万条记录的频率 - 可能永远不会。
最后一点,如果你实现了分页 - 确保用于实现分页的方法依赖于SQL Server一次发送一页数据而不是将所有100万条记录读入ASP.NET然后将本地分页数据的副本,因为这将非常低效和缓慢。 以下是执行分页的SQL Server查询示例: SO问题#109232
我同意其他的回答者。 显示1M记录是荒谬的。 但是,您可以显示前X个记录和页面浏览。
诀窍是在存储过程中进行提取
ALTER PROCEDURE [dbo].[MyHugeTable_GetWithPaging]
(
@StartRowIndex int,
@MaximumRows int
)
AS
SET NOCOUNT ON
Select
RowNum,
[UserName]
From
(Select
[ID],
[UserName]
Row_Number() Over(Order By [ID] Desc) As RowNum
From dbo.[MyHugeTable] t)
As DerivedTableName
Where RowNum Between @StartRowIndex And (@StartRowIndex + @MaximumRows)
如果您的服务器无法缓存100万条记录,您认为您的用户的Web浏览器将如何处理100万条记录的HTML记录呢?
考虑分页( 这是一个包含100万条记录的例子 )
还要考虑用户从不想要超过30到50条记录。 您要么显示它们的细节太低,要么需要更多过滤。
我建议使用动态查询和分页。 因此,当您单击特定页面时,仅为这些页面提取记录。 要从特定范围从数据库中获取记录,请使用以下查询。
像这样。
Create proc Test
@take smallint,
@skip smallint,
@orderBy nvarchar(20),
@subscriptionid smallint,
as
DECLARE @SQLQuery AS NVARCHAR(max)
SET @SQLQuery=' Select ROW_NUMBER() OVER (ORDER BY P.ProductId desc) as RowNum,* from product"
set @SQLQuery=@SQLQuery + ' and Subscriptionid='+CONVERT(nvarchar, @subscriptionid)
set @SQLQuery= ';WITH Results_CTE AS ( '+@SQLQuery
set @SQLQuery= @SQLQuery +' ) SELECT * FROM Results_CTE WHERE RowNum > '+CONVERT(nvarchar, @skip)+' AND RowNum <= '+CONVERT(nvarchar, @skip+@take) --//paging';
END
EXECUTE sp_executesql @SQLQuery
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.