【发布时间】:2013-08-01 06:19:49
【问题描述】:
我的表中有 400 万行。(大小约为 300 GB),我想从 sql server 数据库中读取表中的所有行。我在 C# 中使用了以下代码。这需要时间。请给我一些改进建议。
List<int> hit_block_index = new List<int>();
/* Here i process some other and populate hit_block_index with integers */
string _query = "SELECT TraceName,BlockVector FROM Trace";
SqlConnection _connection = new SqlConnection(connection_string);
_connection.Open();
SqlCommand _command = new SqlCommand(_query, _connection);
SqlDataReader data_reader = _command.ExecuteReader();
Byte[] block_vector=null;
string trace_name = null;
BitArray trace = null;
int max_coverage = 0;
while (data_reader.Read())
{
int coverage = 0;
block_vector = (byte[])data_reader["BlockVector"];
trace_name = (string)data_reader["TraceName"];
BitArray trace = new BitArray(block_vector);
foreach (int x in hit_blocks_index)
{
if (trace[x])
{
coverage++;
}
}
Console.WriteLine("hit count is:" + coverage);
if (coverage > max_coverage)
{
most_covered_trace = trace_name;
most_covered_array = trace;
max_coverage = coverage;
}
}
【问题讨论】:
-
300 GB 应该需要一些时间,如果没有,我会担心
-
改进#1:降低预期。
-
即使 300GB 的原始数据通过千兆链路(没有传输开销)仍然是
(300<<30)*8 / (10**9) / 60.0 = 42.9分钟。如果将磁盘 I/O、TCP 开销、SQL 处理时间等因素考虑在内,我认为 3 小时一点也不差。 -
哦,在这种情况下,在
BlockVector列上运行ProcessByteArray()SQL 函数。</sarcasm>- 如果您需要帮助,您需要告诉我们,具体您正在对数据做什么。 -
甚至没有任何
where条件可以过滤数据,因此我认为 3 小时非常适合您的场景。 :)
标签: c# sql sql-server-2008 sql-server-2012