1

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

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

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

        _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 数据库中的任何表中读取/迭代“选择前 10k”类型查询需要 53 秒。

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

                    }
                }
            }
4

1 回答 1

2

如果您想要最高性能,那么我建议您完全跳过 c# 部分。

  1. 对查询运行解释计划以调整其性能。
  2. 使用 Oracle UTL_FILE 将数据写入文件。

更新

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

然后,问题是如何快速将数据保存到文件中。你sw.Write不会是最快的,因为它太频繁地写入太少的数据。

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

您需要测试不同的缓冲区大小以找出最有效的缓冲区。

于 2013-10-15T22:52:06.130 回答