如何有效地从存储过程中检索数千行

时间:2009-07-19 13:08:11

标签: c# sql-server sql-server-2008 stored-procedures ado.net

我正在使用VSTS 2008 + C#+。Net 3.0 + ADO.Net + SQL Server 2008.从ADO.Net我调用SQL Server端的存储过程。存储过程是这样的,

SELECT Table1.col2
FROM Table1
LEFT JOIN Table2 USING (col1)
WHERE Table2.col1 IS NULL

我的问题是,如何有效地检索返回的行(我的样本中的Table1.col2)?我的结果最多可返回5,000行,Table1.col2的数据类型为nvarchar(4000)。

提前谢谢, 乔治

3 个答案:

答案 0 :(得分:7)

不能 - 你永远不能有效地检索那么多数据......

高效的全部意义是限制你检索的数据 - 只有那些你真正需要的列(没有SELECT *,但是你已经做过的SELECT(字段列表)),以及只有你那么多的行可以轻松处理。

例如,您不希望填充下拉列表或列表框,其中用户需要选择包含数千个条目的单个值 - 这是不可行的。

所以我想我的观点确实如此:如果真的,真的需要返回5000行或更多,它只需要花时间。你可以做的事情并不多(如果你传输5000行,每行5000字节,那就是25'000'000字节或25兆字节 - 没有什么魔法可以让它快速发展)。

如果你找到一种方法来限制返回到10,20,50左右的行数,它只会非常快。想一想:服务器端分页!! : - )

马克

答案 1 :(得分:4)

您没有说出您想要对数据做什么。但是,假设您需要在.NET中处理结果,那么使用SqlDataReader读取结果将是最有效的方法。

答案 2 :(得分:2)

我使用exists for one。

SELECT
    Table1.col2
FROM
    Table1
WHERE
    NOT EXISTS (SELECT *
         FROM
            Table2
         WHERE
            Table2.col1 = Table1.col1)

查询效率很高(假设col1已编入索引,但涵盖了cols(当然索引很宽),但您仍需要通过网络挖掘大量数据。

这取决于你的表现。 5000行对于报表来说并不多,但对于组合框来说却是很多