Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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# 如何在SQL中批量选择大表中的记录_C#_Sql_Offset_Next - Fatal编程技术网

C# 如何在SQL中批量选择大表中的记录

C# 如何在SQL中批量选择大表中的记录,c#,sql,offset,next,C#,Sql,Offset,Next,我有一个包含数十亿条记录的表。我想使用c while循环选择批处理中的记录。我使用了Offset和Fetch Next,但它花费的时间太长,无法获得结果。如果表中包含低于100k的记录,则工作正常。批量选择记录的最佳方法是什么 示例代码 int Count=500000//从表中选择Countid int OffSet=1//下次10万 int=100000//下次20万 而偏移量@A和Id { 任务。产量; var temp=command.GetId; iftemp?.Count>0堆栈.P

我有一个包含数十亿条记录的表。我想使用c while循环选择批处理中的记录。我使用了Offset和Fetch Next,但它花费的时间太长,无法获得结果。如果表中包含低于100k的记录,则工作正常。批量选择记录的最佳方法是什么

示例代码

int Count=500000//从表中选择Countid int OffSet=1//下次10万 int=100000//下次20万 而偏移量<计数 { _strsqlcommand=按id偏移量+偏移量+行取回下一步+取回下一步+行从表顺序中选择id _sqlCommand=newsqlcommand\u strsqlcommand,\u sqlConnection; _sqlDataReader=\u sqlCommand.ExecuteReader; 偏移量+=FetchNext; }
如果您的Id是一个数字,并且您的网络带宽足够好:

首先,找到Id的最大值和最小值。 其次,在where子句中创建一系列数字,对许多记录进行排序是一项高成本的操作。使用Where Id>@A和Id { 任务。产量; var temp=command.GetId; iftemp?.Count>0堆栈.PUSHRANGTEMP.ToArray; 联锁。Addref PROCESSCOUNT,1; var donitems=Interlocked.Readref ProccessCount; 如果项目%10==0 { Console.WriteLine${donitems}/{Alllist.Count}TotalM={stack.Count/1000000}Total={stack.Count}; } }; 收集; Console.WriteLine$Done>{DateTime.Now.Subtractstart.totalmillizes}count={stack.count/1000000}; Console.ReadLine; } } 公共类查询 { 私有字符串Q=; 私有字符串C=; 私有整数i=0; 公共查询执行器字符串Q,字符串C,整数i { 这个。Q=Q; 这个.C=C; 这个。i=i; } 公共列表GetId { var结果=新列表; 尝试 { SqlConnection conn=新的SqlConnectionC; SqlCommand=newsqlcommandthis.Q,conn; command.CommandTimeout=180; 使用conn { 康涅狄格开放大学; 使用SqlDataReader=command.ExecuteReader { 边读边读 { result.Addreader.GetInt320; } } } } 捕获异常 { Console.WriteLine$Exception>{i}; } 返回结果; } } }
这是正确的做法。性能问题需要在sql server端解决。例如,id是否被索引?而且你确定你需要拉取所有数十亿行吗?@jnevil是的,我必须批量拉取数十亿行。我不知道从1到100000的速度,但第二批10万到20万的速度非常慢。我担心从50,00000到60,00000需要多少时间。处理大型文件的最佳方法是使用SQL Server命令行实用程序,如SQLCMD.exe。您可以创建CSV文件并将CSV导入c。这些实用程序设计用于归档大型数据库,运行速度比运行c代码快得多。这些实用程序还内置在Power Shell中,因此您可以运行Power Shell来创建csv。相比之下,我看到在c中运行sqlcmd.exe需要1/2个多小时,而运行sqlcmd.exe只需几分钟。但是,说真的,每次你想要拉一个页面,按id数百万行排序需要多长时间?按id排序意味着它是一个整数;如果你想要一大堆行,为什么不在x和y之间选择呢?他们一定要井然有序吗?为什么不直接从表中选择*?为什么每次都增加提取大小?@CaiusJard不能使用表中的select*。我没有在两者之间使用它。到目前为止,很多人说提取速度比两者更快。是的,我增加了提取大小,因为我想选择批处理。