Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于.NET的Oracle数据访问_C#_Oracle - Fatal编程技术网

C# 用于.NET的Oracle数据访问

C# 用于.NET的Oracle数据访问,c#,oracle,C#,Oracle,我有一个MVC3 ASP.NET web应用程序,它使用Oracle Data Provider for.NET ODP.NET x86连接到Oracle数据库。我的应用程序中的以下代码将在Oracle数据库表中执行查询,然后使用StreamWriter将查询结果写入输出文件 下面的代码每分钟从Oracle数据库表读取大约12000条记录,即使不使用streamwriter写入输出文件 我想知道你们中是否有人知道一种提高性能的方法,即每分钟读取更多记录——也许是你们知道的另一个驱动程序?谢谢,我

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

下面的代码每分钟从Oracle数据库表读取大约12000条记录,即使不使用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();

                    }
                }
            }

如果你想要最好的性能,那么我建议你完全跳过c部分

对查询运行解释计划以优化其性能。 使用Oracle UTL_文件将数据写入文件。 更新

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

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

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


您需要测试不同的缓冲区大小,以确定哪种缓冲区效果最好。

字段分隔符在哪里???。快速成功的方法可能是让sql返回一列,例如从MyTable中选择A+“|”+B+“|”C作为行,除非lien长度很大。但首先您应该看到瓶颈在哪里,数据库、网络或磁盘。这也可能有用。让数据库做它的事情,然后只移动文件。谢谢你的帮助,托尼!瓶颈在于ODP.NET。从Oracle DB中的任何表中读取10k记录需要53秒。在oracle内部执行查询需要纳秒的时间,因此我试图找出ODP.NET为什么会减慢读取过程。有什么想法吗?您知道另一个将.NET应用程序连接到Oracle DB的数据访问库会更快吗?现在您已经解决了这个问题,我认为您最好的选择是DBA.StackExchange中的一个特定问题。感谢您的帮助!不幸的是,我们似乎没有办法跳过c部分,因为我们需要我们的web应用程序能够过滤csv并了解csv位置的某些信息,以便处理应用程序的其他区域。您是否知道在仍然使用c部件的情况下提高性能的方法?谢谢,Ray!我尝试使用Flush手动写入磁盘,这似乎有所帮助,但我发现ODP.NET存在一个瓶颈。从Oracle DB表中读取超过10k条记录而不写入或执行任何其他操作需要53秒。对其他库或其他库有什么想法吗?我尝试过的所有库都是Micrsoft Oracle Client、Oracle ODP.NET和Devart,但我不知道哪一个更快。但是,如果您没有确定瓶颈在哪里,我不希望其他库能够提供更好的性能。同样,SQL调优、网络延迟、DB硬件和库都会对性能产生影响,但首先,您需要确定最慢的位置。问题是当select语句中包含varchar24000字节的特定列时,ODP.NET读取此表的速度非常慢。选择此表中除此之外的每一列只需4秒钟。你知道我如何用ODP.NET处理这个专栏吗?这个专栏需要这么大吗?如果没有,您可能需要返回以重新调整列的大小并使其变小。你需要那一列中的所有数据吗?如果没有,您可以将其替换为仅获取前x个字符数。如果两个问题都是肯定的,我将用多个表重新建模该列中的数据。底线是,如果你必须移动1吨货物,你需要x的力。在许多情况下,你会发现你不需要一次移动所有的。用更少的时间做更少的事情会让你获得最好的表现。
_dbCommand.CommandText = query;
using (var reader = _dbCommand.ExecuteReader())
            {
                if (reader != null)
                {
                    while (reader.Read())
                    {

                    }
                }
            }