Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何高效地从存储过程中检索数千行_C#_Sql Server_Sql Server 2008_Stored Procedures_Ado.net - Fatal编程技术网

C# 如何高效地从存储过程中检索数千行

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

我使用的是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 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是包含列的类。把清单上的所有内容都读一遍,然后再处理。看见