C# 如何高效地从存储过程中检索数千行
我使用的是VSTS2008+C+.NET3.0+ADO.Net+SQLServer2008。在ADO.Net中,我从SQL Server端调用了一个存储过程。存储过程是这样的C# 如何高效地从存储过程中检索数千行,c#,sql-server,sql-server-2008,stored-procedures,ado.net,C#,Sql Server,Sql Server 2008,Stored Procedures,Ado.net,我使用的是VSTS2008+C+.NET3.0+ADO.Net+SQLServer2008。在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
SELECT Table1.col2
FROM Table1
LEFT JOIN Table2 USING (col1)
WHERE Table2.col1 IS NULL
我的问题是,如何高效地检索示例中返回的行Table1.col2?我的结果可能返回多达5000行,Table1.col2的数据类型为nvarchar 4000
提前感谢,,
乔治你不能——你永远无法有效地检索到那么多数据
提高效率的关键在于限制您检索的数据—仅限那些确实不需要SELECT*的列,但要选择字段列表(您已经这样做了),并且只允许轻松处理尽可能多的行
例如,您不想填充一个下拉框或列表框,用户需要在其中选择一个包含数千个条目的值-这是不可行的
所以我想我的观点是:如果你真的,真的需要返回5000行或更多行,那就需要时间了。如果以每行5000字节的速度传输5000行,那么就没有什么可以做的了,那就是250000000字节或25MB,没有什么神奇的办法可以让它运行得更快
只有找到将返回的行数限制为10、20、50左右的方法,它才会运行得非常快。思考:服务器端分页!!:-
Marc您没有说您想对数据做什么。但是,假设您需要在.NET中处理结果,那么使用读取结果将是最有效的方法。我将使用exists作为一种方法
SELECT
Table1.col2
FROM
Table1
WHERE
NOT EXISTS (SELECT *
FROM
Table2
WHERE
Table2.col1 = Table1.col1)
假设col1已编制索引,但覆盖了cols非常广泛的索引,那么查询可能会非常有效,但您仍然需要在网络上铲取大量数据
这取决于你所说的性能。5000行对于一个报表来说不算多,但是对于一个组合框来说就太多了您正在使用SQL Server 2008的这种语法?我的伪代码,有什么问题吗?没问题,但它会让人困惑,因为这是其他数据库引擎的有效语法是的,我从Oracle/DB2迁移了一些SQL Server代码:-您会对返回的数据进行分页吗?谢谢Marc,我们如何从ADO.Net客户端处理数据,在性能上有什么不同吗?我只需要按顺序读取返回的数据一次。您建议我从ADO.Net客户端检索数据的解决方案是什么?如果必须检索这5000行,SqlDataReader绝对是最快、最好的方法-获取所需的列并将其存储在列表或其他内容中。我只需按顺序读取返回的数据一次。您建议我从ADO.Net客户端检索数据的解决方案是什么?这取决于您主要关心的是什么-内存或长时间保持与数据库的连接打开。如果要节省内存,请使用SqlDataReader一次读取一行,对其进行处理,然后转到下一行。但是,如果内存不是大问题,请按照上面的建议执行,然后使用SqlDataReader创建一个列表,其中T是包含列的类。把清单上的所有内容都读一遍,然后再处理。看见