【发布时间】:2011-03-10 13:18:22
【问题描述】:
我正在编写一个应用程序,它读取整个表,进行一些处理,然后将结果数据写入另一个表。我正在使用SqlBulkCopy 类(“bcp in”的.net 版本),它的插入速度非常快。但是我首先找不到任何有效的方法来选择数据。没有 .net 等价于“bcp out”,这对我来说似乎很奇怪。
目前我正在使用select * from table_name。例如,选择 6,000 行需要 2.5 秒……而批量插入相同数量的行只需 600 毫秒。
我希望选择数据应该总是比插入更快。 从表中选择所有行和列的最快方法是什么?
问题解答:
- 我将选择时间设置为 2.5 秒 2 种方式。首先是在运行我的应用程序并运行 sql 跟踪时。第二个是在 SSMS 中运行相同的查询。两者都返回了大致相同的结果。
- 我正在使用 SqlDataReader 读取数据。
- 没有其他应用程序正在使用此数据库。
- 我目前的处理时间不到 1 秒,所以 2+ 秒的读取时间比较长。但在将其扩展到 100,000 行和数百万行时,我最关心(感兴趣)性能。
- 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);
}
【问题讨论】:
-
您的处理需要多长时间?
-
你是如何测量这 2.5 秒的?在 SSMS 中还是在您的应用程序中?如果是前者,如果您打开选项“执行后丢弃结果”以消除 SSMS 处理时间。如果是后者,您的应用程序如何检索行 - 例如,您是否使用数据阅读器?你的代码是什么样的?
-
当您从该表读取数据时,是否有其他应用程序写入该表?如果是这样,您可能想尝试使用“WITH (NOLOCK)”选项。
-
不一定。读取时您必须在磁盘上找到数据,但写入时您只是写出到指定的位置。您可以尝试创建一个新索引,并定期重建/重组,以提高读取效率。
-
我认为您需要提供一些有关您如何计时的详细信息。您使用的是 DataAdapter 还是 DataReader?你是如何管理你的连接的?可能还有其他一些问题。如果您可以发布您的计时代码,那将很有帮助。
标签: c# .net sql sql-server-2008