2009-07-19 81 views
4

我正在使用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在我的示例中)?我的结果可能会返回多达5000行,并且Table1.col2的数据类型是nvarchar(4000)。

由于事先 乔治

+2

您正在使用带有该语法的SQL Server 2008? – gbn 2009-07-19 13:12:53

+0

我的伪代码是什么问题? – George2 2009-07-19 13:13:44

+2

没问题,但是它会混淆人们,因为这是其他数据库引擎的有效语法 – gbn 2009-07-19 13:18:01

回答

7

CAN NOT - 你永远无法检索大量数据有效....

的是高效的整点是限制你检索数据 - 仅那些你真正需要的列(没有SELECT *,但SELECT(字段列表),你已经做了),只有你可以轻松处理的行数。

例如,您不想填充下拉列表框或列表框,用户需要用数千个条目选择一个值 - 这是行不通的。

所以我想我的观点确实是:如果你确实需要返回5000行或更多,它只需要花时间。对此你可以做的事情不多(如果你传输5000行,每行5000个字节,这是25'000'000字节或25兆字节 - 没有魔法去让它走得快)。

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

Marc

4

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

2

我会使用一个存在。

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

查询可以是有效的(假定COL1被索引,而是涵盖课程的cols(很宽的指数),但你仍然有通过网络铲大量的数据。

这取决于你5000行对于报告并不多,但对于组合框来说很多

相关问题