【发布时间】:2014-01-22 11:40:15
【问题描述】:
使用 C# 和 .NET 3.5 以及 ADO 连接或 OLEDB 连接,用 700k 行(每行 3 列)填充 DataTable 或 DataSet,需要 15 秒以上。
在 DB 上执行实际的 select 语句需要不到一秒钟的时间。数据库与查询它的机器位于不同的机器上,处理数据。 (也许这会增加时间?)
数据如下:
public class Node
{
public DateTime Timestamp;
public float Value;
public string Name;
}
使用 SqlDataReader 并调用 reader.Read(),然后手动将数据放入上述类的新实例中,将其添加到 List<Node> 也需要 15 秒以上。
代码如下:
List<Node> data = new List<Node>();
while (reader.Read())
{
Node n = new Node();
n.Timestamp = (DateTime)reader["Timestamp"];
n.Value = (float)reader["Value"];
n.NodeName = (string)reader["NodeName"];
data.Add(n);
}
我在发布模式下使用 StopWatch 类测量了这一点,并在项目属性中启用了优化。
我知道它必须迭代每条记录,但我希望今天的任何机器都能够在几秒钟内迭代 70 万条记录,但不会更多。
这需要 15 秒以上的原因可能是什么?我期望这会更快吗?
EDIT 单独执行 SqlDataReader.Read() 也需要 15 秒以上。
【问题讨论】:
-
运行分析器。并检查实际查询需要多长时间。
-
对您的代码使用 Visual Studio 分析器,看看它在哪里花费时间。
-
获取Data最快的方法其实就是使用DataReader。所以可能是关于您的数据库查询和/或缺少索引...
-
查询需要多长时间而不将项目添加到列表中?另外:如果不显示您为迭代阅读器/添加项目而编写的代码,就很难判断。
-
根据您的说法,我猜——但不能确定——网络速度是瓶颈。您是否尝试过
while(reader.Read());来了解需要多长时间才能获得结果,但不采取行动?
标签: c# database performance