C# 在SQL Server中选择整个表的最快方法是什么?

C# 在SQL Server中选择整个表的最快方法是什么?,c#,.net,sql,sql-server-2008,C#,.net,Sql,Sql Server 2008,我正在编写一个应用程序,它读取整个表,进行一些处理,然后将结果数据写入另一个表。我使用的是SqlBulkCopy类(.net版本的“bcp-in”),它的插入速度非常快。但我首先找不到任何有效的方法来选择数据。在我看来,没有.net等同于“bcp out”的说法 目前我正在使用select*fromtable\u name。对于预测,选择6000行需要2.5秒。。。只需600毫秒即可批量插入相同数量的行 我希望选择数据总是比插入数据快从表中选择所有行和列的最快方法是什么? 有关投诉的答覆:

我正在编写一个应用程序,它读取整个表,进行一些处理,然后将结果数据写入另一个表。我使用的是
SqlBulkCopy
类(.net版本的“bcp-in”),它的插入速度非常快。但我首先找不到任何有效的方法来选择数据。在我看来,没有.net等同于“bcp out”的说法

目前我正在使用
select*fromtable\u name
。对于预测,选择6000行需要2.5秒。。。只需600毫秒即可批量插入相同数量的行

我希望选择数据总是比插入数据快从表中选择所有行和列的最快方法是什么?


有关投诉的答覆:

  • 我将我的选择计时为2.5秒2种方式。首先是在运行我的应用程序和sql跟踪时。第二个是在SSMS中运行相同的查询。两人都对同样的结果表示不满
  • 我正在使用SqlDataReader读取数据
  • 没有其他应用程序正在使用此数据库
  • 我当前的处理时间不足1秒,因此2秒以上的读取时间相对较大。但我最关心的是将其扩展到100000行和数百万行时的性能
  • Sql Server 08r2和我的应用程序都在我的开发计算机上运行
  • 一些数据处理是基于集合的,所以我需要将整个表放在内存中(为了支持更大的数据集,我知道这一步可能需要移动到SQL中,所以我只需要在内存中按行操作)
这是我的密码:

DataTable staging = new DataTable();
using (SqlConnection dwConn = (SqlConnection)SqlConnectionManager.Instance.GetDefaultConnection())
{
    dwConn.Open();
    SqlCommand cmd = dwConn.CreateCommand();
    cmd.CommandText = "select * from staging_table";

    SqlDataReader reader = cmd.ExecuteReader();
    staging.Load(reader);
}

select*from table\u name
是读取整个表格最简单、最简单、最快的方法

让我解释一下为什么你的结果会导致错误的结论

  • 复制整个表是一种优化操作,只需要将旧的二进制数据克隆到新的表中(根据存储机制,最多可以执行文件复制操作)
  • 写入是缓冲的。DBMS说记录已经写入,但实际上还没有完成,除非处理事务。磁盘操作通常会延迟
  • 查询表还需要(与克隆不同)将数据从二进制存储的布局/格式调整为客户端最终可读的驱动程序相关格式。这需要时间

  • 一般来说,在选择列表中包含列名是一个好主意,但是对于今天的RDBMS,这不会有太大的区别。只有在限制所选列的情况下,才能看到这方面的差异。一般来说,最好包含列名。但要回答这个问题,选择似乎确实比插入您描述的场景要慢
    是的,
    select*from table_name
    确实是读取表中所有行和列的最快方法,这完全取决于您的硬件,但您的网络可能是这里的瓶颈

    除了将查询限制为只读取实际使用的列之外,执行select操作的速度也会尽可能快。这里涉及到缓存,当您在一行中执行两次时,第二次应该要快得多,因为数据缓存在内存中。执行
    dbcc dropcleanbuffers
    检查缓存的效果

    如果您希望尽可能快地执行此操作,请尝试实现在T-SQL中执行处理的代码,这样它就可以直接对服务器上的数据进行操作

    另一个很好的速度调整技巧是在一个磁盘上读取表(查看文件组),在另一个磁盘上写入表。这样一来,一个磁盘可以连续读取,另一个磁盘可以连续写入。如果两个操作都发生在同一个磁盘上,那么磁盘的磁头会不断地来回移动,这会严重降低性能

    如果您编写的逻辑不是T-SQL,那么您还可以看看SQL CLR

    另一个提示:当您从表中选择*时,如果可能,请使用datareader。这样你就不会先在记忆中具体化整件事


    GJ

    您的处理需要多少时间?如何测量这2.5秒?在SSMS中还是在您的应用程序中?如果是前者,如果启用“执行后丢弃结果”选项以消除SSMS处理时间,该怎么办。如果是后者,应用程序如何检索行?例如,您使用的是数据读取器吗?您的代码是什么样子的?当您从该表中读取时,是否有其他应用程序写入该表?如果是这样,您可能想尝试使用“WITH(NOLOCK)”选项。不一定。读取时,您必须找到磁盘上的数据,但写入时,您只是将数据写入指定的位置。你可以尝试创建一个新的索引,你可以定期重建/重新组织它,以提高读取效率。我认为你需要提供一些关于你是如何安排时间的细节。您使用的是DataAdapter还是DataReader?您如何管理您的连接?可能还有其他一些问题。如果你可以发布你的计时代码,那会很有帮助。+1因为这是有帮助的,并且包含了一个我同意的好观点,这不是在其他答案中。