ericmend / oracleClientCore-2.0

Unofficial Oracle Client for .Net Core
MIT License
31 stars 6 forks source link

Data Reader is very slow #1

Open paulparas opened 6 years ago

paulparas commented 6 years ago

I'm using this library to connect to .net core but it is very slow in reading large data sets. I can't seem to set fetch size in this. How can we improve the fetch performance or increase fetch size?

Estou usando esta biblioteca para conectar-se ao núcleo .net, mas é muito lento na leitura de grandes conjuntos de dados. Não consigo definir o tamanho de busca neste. Como podemos melhorar o desempenho de busca ou aumentar o tamanho de busca?

ericmend commented 6 years ago

Can you pass some example? The ideal of using the datareader. Mostly for large masses of data. It is always to pass the position of the column and not the description.

*see test ParameterTest()

paulparas commented 6 years ago

I've 3000 rows , each row has 16 columns, it is taking too much time to read. Due to this second cursor is null. I want to set attribute OCI_ATTR_PREFETCH_ROWS. Default value is 1 but i want to read more rows at once to reduce round trips. OCI_ATTR_PREFETCH_ROWS can be set by calling OCIAttrSet() as mentioned here : https://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci04sql.htm#i429698

Please see section : Setting Prefetch Count in above article

But when I try to set this count I get memory access errors in C#. Can you help here please?

Tenho 3000 linhas, cada linha tem 16 colunas, está demorando muito tempo para ler. Devido a este segundo cursor é nulo. Eu quero definir o atributo OCI_ATTR_PREFETCH_ROWS. O valor padrão é 1, mas eu quero ler mais linhas de uma só vez para reduzir as viagens de ida e volta. OCI_ATTR_PREFETCH_ROWS pode ser configurado chamando OCIAttrSet () como mencionado aqui: [https://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci04sql.htm#i429698](https://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci04sql. htm # i429698)

Consulte a seção: Configuração Prefetch Contar no artigo acima

Mas quando tento configurar essa conta, recebo erros de acesso à memória em C #. Você pode ajudar aqui, por favor?

ericmend commented 6 years ago

very well 👍 I'll take a look this weekend.

paulparas commented 6 years ago

Hi We managed to get second cursor when we modified the function NextResult() in OracleDataReader.cs. We made hasRows = true if statement is not null in next cursor. Without this hasRows becomes false after 1st cursor and 2nd cursor is always null.

public
        override
        bool NextResult ()
        {
            ValidateState ();

            if (statement == null)
                return false;

            statement.Dispose ();
            statement = null;

            statement = command.GetNextResult ();

            if (statement == null)
                return false;
            else
                hasRows = true;
            return true; 
        }

But still we can't set Prefetch Size to improve performance.

ericmend commented 6 years ago

Isso vai ser mais difícil do que eu imaginei. Andei pesquisando sobre o assunto e consigo encontrar muitos exemplos em C++. Porem não consegui realizar nenhum debug em C++, e muito menos relacionar a solução para o emaranhado de códigos importado pelo Mono (rs).

Exemplo C++ http://www.sqlines.com/oracle/oci/array_fetch

Vou realizar testes com a solução citada... Obrigado por contribuir para a comunidade ;-)

*Desculpe pelo português. Mas o meu inglês é ainda pior :D

ericmend commented 6 years ago

paulparas, acredito que sua sugestão não cause muito efeito para fetch de linhas de um cursor. Pois o método NextResult ele é usado para recuperar vários cursores em uma mesma requisição. Que para o mundo Oracle, isso seria possível somente para procedures ou packages

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/retrieving-data-using-a-datareader https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/retrieving-data-from-multiple-ref-cursors

jaydeept commented 6 years ago

Hello @ericmend ,

I am also facing the issue of performance. I have two application, one on .Net framework where I am using ODP managed library and other application is on .Net Core 2 where I am using your package. When I measured the performance on both, I found that data retrieval in .Net Core 2 is 3 times slower.

paulparas commented 6 years ago

Oi Eric Obrigado pela sua resposta e pesquisa sobre esta questão. Na ausência do Oracle Managed Client, esta biblioteca é um salvador de vida para a comunidade .net core.

Nós também vimos a maioria dos exemplos na internet estão em C ou C ++ talvez porque é fácil usar ponteiros em C ++. Nós quase tentamos tudo, desde configurar nrows, ociattrset, etc., mas é difícil de jogar com ponteiros em C # e obtemos erros de acesso à memória.

Em segundo lugar, nós testamos o NextResult () não funciona nesta biblioteca, ele retorna apenas o primeiro cursor quando há vários cursores. Então, como solução alternativa, modificamos NextResult ().