none
qual melhor tipo de cursor - quantidade grande de regsitros RRS feed

  • Pergunta

  • tenho um tabela temporária com 500 mil linhas. preciso percorre-la usando um cursor. qual o tipo de cursor mais rápido para se usar nesse caso?
    quarta-feira, 7 de novembro de 2012 16:51

Respostas

  • Onde eu trabalho não se pode usar CURSOR, e em alguns lugares que presto consultoria, também não se pode usar.

    Eu faço do modo abaixo qdo preciso trabalhar com um volume grande de registros:

    declare @au_id char( 11 ) 
    set rowcount 0 
    select au_id,au_lname,au_fname into #mytemp from authors 
    set rowcount 1 
    select @au_id = au_id from #mytemp 
    while @@rowcount <> 0 
    begin 
         set rowcount 0 
         select au_id,au_lname,au_fname from #mytemp 
         where au_id = @au_id 
         delete #mytemp where au_id = @au_id 
         set rowcount 1 
         select @au_id = au_id from #mytemp 
    end 
    set rowcount 0 
    

    Claro, que é um exemplo e isso varia muito para seu ambiente e número de colunas que se vai utilizar.

    []´s

    quarta-feira, 7 de novembro de 2012 17:47

Todas as Respostas

  • O melhor seria fazer em batch, mas como não tem jeito aconselharia o fast foward.


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 7 de novembro de 2012 16:53
  • e o FORWARD_ONLY FOR? não seria uma boa opção também?
    quarta-feira, 7 de novembro de 2012 16:59
  • Onde eu trabalho não se pode usar CURSOR, e em alguns lugares que presto consultoria, também não se pode usar.

    Eu faço do modo abaixo qdo preciso trabalhar com um volume grande de registros:

    declare @au_id char( 11 ) 
    set rowcount 0 
    select au_id,au_lname,au_fname into #mytemp from authors 
    set rowcount 1 
    select @au_id = au_id from #mytemp 
    while @@rowcount <> 0 
    begin 
         set rowcount 0 
         select au_id,au_lname,au_fname from #mytemp 
         where au_id = @au_id 
         delete #mytemp where au_id = @au_id 
         set rowcount 1 
         select @au_id = au_id from #mytemp 
    end 
    set rowcount 0 
    

    Claro, que é um exemplo e isso varia muito para seu ambiente e número de colunas que se vai utilizar.

    []´s

    quarta-feira, 7 de novembro de 2012 17:47
  • Como o Advaldo disse, eu tambem uso cursores em ultimo caso quando não tem jeito mesmo, mas quando uso sempre use o fast foward que dos que fiz testes tem uma melhor performance e sempre funcionou para o que eu precisava, se quiser de uma olhada neste post:

    http://msdn.microsoft.com/pt-br/library/ms188644(v=sql.105).aspx


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 7 de novembro de 2012 18:09
  • então costumo usar while de uma forma bem performática. porém, nessa caso preciso usar cursor. 

    e pelo que estou vendo a melhor a opção é esse tipo de cursor FORWARD_ONLY FOR.

    com grandes volumes de dados é mais performático.

    quarta-feira, 7 de novembro de 2012 18:14
  • Sempre cada caso é um caso, faça os testes com este que voce sugeriu, caso não fique bom teste os outros tambem para ver qual melhor se enquadra no seu caso.

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 7 de novembro de 2012 18:16
  • rafa-martin

    No meu trabalho costumo usar tabela temporária assim como no exemplo do Advaldo. Dependendo da sua lógica e necessidade você pode até indexar a tabela temporária.
    Já li diversas coisas a respeito do assunto e ninguém afirma que um ou outro é melhor..

    No link abaixo tem posts do Gustavo Maia Aguiar e do Fabiano Amorim (duas feras de SQL no Brasil) sobre cursores.. vale a pena dar uma olhada.

    http://social.msdn.microsoft.com/Forums/pt-BR/transactsqlpt/thread/6df1dc37-79e2-41b9-99b5-74139208688e/

    []'s


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    quarta-feira, 7 de novembro de 2012 18:17
  • eu sempre uso tabela temporária ou variável do tipo table. é que e um caso específico. 

    eu vou usar o forward_only for mesmo. está bem performático. fiz os testes com os outros e estão executando rápido também. coisa de 3,4 segundos a mais.

    blz. valeu

    quarta-feira, 7 de novembro de 2012 18:35
  • Rafa-Martin,

    Por favor, classifique as respostas para que o fórum continue sendo útil nas pesquisas.

    Obrigada.


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    quarta-feira, 7 de novembro de 2012 19:17