por que um proc SQLCLR ficar mais lento do lado do cliente o mesmo código

votos
2

Estou escrevendo um procedimento armazenado que quando concluído irá ser utilizado para digitalizar tabelas de teste para dados falsos sobre uma coluna de base da coluna.

Primeiro passo no exercício era apenas para examinar a tabela --- que é o que o código abaixo faz. A questão é que esse código é executado em 5:45 segundos --- no entanto, o mesmo código executado como um aplicativo de console (mudando o connectionstring é claro) é executado em cerca de 44 segundos.

    using (SqlConnection sqlConnection = new SqlConnection(context connection=true))
    {
        sqlConnection.Open();
        string sqlText = string.Format(select * from {0}, source_table.Value);
        int count = 0;
        using (SqlCommand sqlCommand = new SqlCommand(sqlText, sqlConnection))
        {
            SqlDataReader reader = sqlCommand.ExecuteReader();
            while (reader.Read())
                count++;
            SqlDataRecord record = new SqlDataRecord(new SqlMetaData(rowcount, SqlDbType.Int));
            SqlContext.Pipe.SendResultsStart(record);
            record.SetInt32(0, count);
            SqlContext.Pipe.SendResultsRow(record);
            SqlContext.Pipe.SendResultsEnd();
        }
    }

No entanto, o mesmo código (string de conexão diferente, é claro) é executado em um console app em cerca de 44 segundo (que é mais perto do que eu estava esperando no lado do cliente)

O que estou ausente no lado da SP, que faria com que ele seja executado tão lento.

Por favor, note: Eu entendo totalmente que se eu quisesse uma contagem de linhas, eu deveria usar a agregação count (*) --- que não é o propósito deste exercício.

Publicado 19/05/2009 em 16:19
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

O tipo de código que você está escrevendo é altamente suscetível a injeção SQL. Em vez de processar o leitor como você é, você pode simplesmente usar a propriedade RecordsAffected para encontrar o número de linhas no leitor.

EDITAR:

Depois de fazer algumas pesquisas, a diferença que você está vendo é uma diferença projeto por entre a conexão de contexto e uma conexão regular. Peter Debetta blog sobre isso e escreve:

"A conexão de contexto é escrito de tal forma que ele só busca uma linha de cada vez, por isso, para cada um dos 20 milhões de algumas linhas ímpares, o código estava pedindo para cada linha individualmente. Usando uma conexão não-contexto, no entanto, ele solicita 8K pena de linhas de cada vez ".

http://sqlblog.com/blogs/peter_debetta/archive/2006/07/21/context-connection-is-slow.aspx

Respondeu 19/05/2009 em 17:51
fonte usuário

votos
1

Bem, parece que a resposta é na cadeia de conexão, afinal.

context connection=true

versus

server=(local); database=foo; integrated security=true

Por alguma razão bizarra, usando a conexão "externa" do SP é executado quase tão rápido como um aplicativo console (ainda não mente tão rápido que você! - 55 segundos)

Claro que agora a montagem tem de ser implantado como externo, em vez de Seguro --- e que introduz mais frustração.

Respondeu 19/05/2009 em 17:24
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more