适用于.NET的Oracle数据访问

时间:2013-10-15 22:20:33

标签: c# oracle

我有一个MVC3 ASP.NET Web应用程序,它使用Oracle Data Provider for .NET(ODP.NET)x86连接到Oracle数据库。我的应用程序中的以下代码将在Oracle数据库表中执行查询,然后使用StreamWriter将查询结果写入输出文件。

以下代码从Oracle数据库表中读取每分钟大约12,000条记录(即使不使用streamwriter写入输出文件)。

我想知道你们中是否有人知道如何提高性能以便每分钟读取更多记录 - 或许你知道的另一个驱动程序?谢谢,我真的很感激!

        _dbCommand.CommandText = query;

        using (var sw = new StreamWriter(output, append, Encoding.UTF8))
        {
            using (var reader = _dbCommand.ExecuteReader())
            {
                if (reader != null)
                {
                    var count = reader.FieldCount;

                    while (reader.Read())
                    {
                        //get records
                        for (var i = 0; i < count; i++)
                        {
                            var txt = reader[i].ToString();

                            sw.Write(txt);
                        }
                        sw.WriteLine();

                    }
                }
            }

更新:

看起来瓶颈在于ODP.NET。从我的Oracle数据库中的任何表读取/迭代“select top 10k”类型查询需要53秒。

_dbCommand.CommandText = query;
using (var reader = _dbCommand.ExecuteReader())
            {
                if (reader != null)
                {
                    while (reader.Read())
                    {

                    }
                }
            }

1 个答案:

答案 0 :(得分:2)

如果你想获得最佳性能,那么我建议你完全跳过c#部分。

  1. 针对您的查询运行解释计划以调整其效果。
  2. 使用Oracle UTL_FILE将数据写入文件。
  3. <强>更新

    首先,您仍需要调整SQL查询以使查询尽可能快地运行。

    然后,问题是如何快速将数据传输到文件。您的sw.Write不会是最快的,因为它过于频繁地写入太少的数据。

    尝试将其AutoFlush属性设置为false并手动调用Flush以写入磁盘。

    您需要测试不同的缓冲区大小,以找出哪种方法效果最好。