Oracle Data Access for .NET
本文关键字:NET for Access Data Oracle | 更新日期: 2023-09-27 18:35:26
我有一个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())
{
}
}
}
如果你想要最高的性能,那么我建议你完全跳过c#部分。
- 对查询运行解释计划以优化其性能。
- 使用 Oracle UTL_FILE将数据写入文件。
更新
首先,您仍然需要调整 SQL 查询,以使查询尽可能快地运行。
然后,问题是如何快速将数据获取到文件中。您的sw.Write
不会是最快的,因为它写入的数据太少太频繁。
尝试将其 AutoFlush
属性设置为 false
并手动调用Flush
以写入磁盘。
您需要测试不同的缓冲区大小,以找出哪种缓冲区效果最好。