2016-02-02 31 views
1

我使用一个SqlDataReader来检索数据库管理系统的一些“选择”查询。 到目前为止,我使用SqlDataReader.read()在结果集中逐一读取每一行,并逐个处理它们。当结果集很大时(意味着数百万行数百列),使用.read()迭代非常缓慢。我问:是否有一种方法可以从SqlDataReader中读取“块”,这意味着像SqlDataReader.read(100)这样的东西给了我一个结果集中接下来100行的数组?使用SqlDataReader同时读取多个行(块读取)

我想过要像DataTable.Load()一样加载内存中的所有结果集,但由于表的大小为几个千兆字节,因此它不适合内存。

你会推荐什么? 非常感谢

示例代码:

TdConnection conn; 
TdCommand cmd; 
TdDataReader reader; 
IAsyncResult res; 

conn = new TdConnection(@"xxxx;"); 
conn.Open(); 

cmd = new TdCommand(q,conn); 
res = cmd.BeginExecuteReader(); 

while (!res.IsCompleted); 

reader = cmd.EndExecuteReader(res); 
if (reader.HasRows) 
{ 
    string sb; 
    string currentout = "C:\file"; 
    string[] row = new string[reader.FieldCount]; 
    sb = ""; 
    for (int i = 0; i < reader.FieldCount; i++) 
     row[i] = reader.GetName(i); 

    sb = String.Concat(sb,String.Join("\t",row),"\r\n"); 

    File.WriteAllText(currentout,sb); 

    sb = ""; 

    /* With a test query, the following commented "while" takes 5 minutes 
    /* to iterate over a dataset with 639967 rows x 63 columns (about 300MB) 
    /* while(reader.Read()); 
    */ 

    /* With the same test query, the following "while block" takes 6 minutes 
    /* to iterate over the same dataset AND writing it on a text file 
    /* I conclude that I/O writing on text file is fast, and .Read() is very slow 
    */ 
    while(reader.Read()) 
    { 
     for (int i = 0; i < reader.FieldCount; i++) 
       row[i] = reader.GetValue(i).ToString(); 

     sb = String.Concat(sb,String.Join("\t",row),"\r\n"); 

     if (sb.Length > 100000) 
     { 
      File.AppendAllText(currentout,sb); 
      sb = ""; 
     } 
    } 
    File.AppendAllText(currentout,sb); 
} 

reader.Close(); 
reader.Dispose(); 
cmd.Dispose(); 
conn.Close(); 

的 “TD” 组件是Teradata的DBMS接口.NET(但他们表现就像 “SQL” 成分)。

+0

真正的问题在这里:为什么你需要加载所有的数据? – Steve

+0

阅读缓慢,还是处理?你有没有简介代码来找到瓶颈? – LarsTech

+1

也许您可以将您的程序登录名转移到SQL查询并从程序中执行该查询。 – Chuck

回答

1

什么是慢这里是在循环中的字符串连接的二次成本:

sb = String.Concat(sb,String.Join("\t",row),"\r\n"); 

由于这是一个明显的问题PERF我提交此作为一个答案,因为它可能解决您的问题。

如果您的应用程序很慢,轮廓也看什么是缓慢的。

不幸的是,ADO.NET确实挺读取数据时CPU沉重。你无能为力。