none
Otimizar Cursor RRS feed

  • Pergunta

  • Bom dia Pessoal!!!

    Tenho o seguinte cursor:


    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69 

    Porém ele demora muito para terminar 5 a 10 minutos....

    Como devo proceder para deixá-lo mais rapido ?

    Obrigado!!!

    Ale

    fasdfasfd
    quarta-feira, 11 de fevereiro de 2009 11:17

Respostas

Todas as Respostas

  • Bom Dia,

    A forma mais poderosa para deixar um cursor mais rápido é não o utilizando. Normalmente cursores podem ser substituídos por outras soluções mais performáticas. De qualquer forma, talvez usar o FAST_FORWARD o ajude.

    DECLARE cCURSOR CURSOR 
    FAST_FORWARD  
    FOR SELECT 

    Isso pode ajudar, mas você já verificou se a lentidão não é por conta da consulta ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Importe arquivos XML com o CLR
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!346.entry


    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 11 de fevereiro de 2009 13:20
  • Gustavo, obrigado pela resposta....

    Sei q nao eh legal usar cursor, mas nesse caso é necessario...


    Tava pensando em trocar os subselects por inner join, sera q isso iria melhorar a performance?

    Se sim, vc poderia me dar um exemplo, pois nao sei usar join com case when....

    Obrigado!!!!!

    Ale

    fasdfasfd
    quarta-feira, 11 de fevereiro de 2009 13:26
  • Como citado por Gustavo,

    A melhor forma é não usá-los. No entanto, para o tempo de execução da query você deve levar em consideração vários fatores, ( quantidade de registros retornados, você está usando case, está usando tabelas derivadas, e funções de agregação ).

    Abraços
    Demétrio Silva
    quarta-feira, 11 de fevereiro de 2009 13:28
  • Olá Ale2009,

    A performance da consulta influencia no desempenho do cursor.
    Antes de propor mudanças, quanto tempo demora somente a execução da consulta ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Importe arquivos XML com o CLR
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!346.entry


    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 11 de fevereiro de 2009 13:32
  • Autalmente demora 2 minutos, só a consulta.
    fasdfasfd
    quarta-feira, 11 de fevereiro de 2009 15:17
  • Olá Ale2009,

    Acredito que como o cursor irá fazer a consulta várias vezes, essa demora é prejudicial.
    Tente colocar o resultado em uma tabela temporária e posteriormente rode o cursor contra a tabela temporária.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Importe arquivos XML com o CLR
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!346.entry


    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 11 de fevereiro de 2009 15:48
  • Ale,

    Peço licensa para entrar nesta discussão!!!

    Como todos nós sabemos, a utilização de cursor é uma técnica que tem uma finalidade muito grade, mas o custo de processamento que o cursor demanda poderá atrapalhar em algumas situações.

    Como você mesmo destacou, pensou em utilizar subquerys ou outras funcionalidades, gostaria de saber o porque você decidiu por cursores?


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 11 de fevereiro de 2009 19:04
  • O FAST_FORWARD não ajudou?

    Onde está a demora? No opem do cursor?


    Fabiano Neves Amorim - MCTS / MCP - SQLServer - http://fabianosqlserver.spaces.live.com/
    quarta-feira, 11 de fevereiro de 2009 19:32
  • Eu também costumo utilizar cursores em procedures com bastante processamento.
    Sei da restrição do uso dos "maledetos" cursores, mais em alguns casos é extremamente necessário.
    Em vários testes de performance, os sub-selects perdem feito para os joins... isso eu fiz e no meu caso melhorou muito.

    Eu, particularmente, não uso sub-selects a não ser em situações extremas.
    No seu caso, eu faria o uso dos joins me certificando que os campos que fazem a junção entre as tabelas estejam indexados em ambas as tabelas (ou pelo menos na que será juntada).

    Leandro.
    Tytto
    quinta-feira, 12 de fevereiro de 2009 11:39
  • Junior Galvao, na verdade eu nao decidi, decidiram por mim..rsrs

    FAbiano, o
    FAST_FORWARD nao ajudou muito nao, mas obrigado pela indicação.

    Tytto, eu gostaria de aplicar os inner join, mas nao sei como converter...pode me ajudar???


    Obrigado a todos pelas respostas!!!

    fasdfasfd
    quinta-feira, 12 de fevereiro de 2009 13:40
  • Olá Ale2009,

    A minha sugestão de gravar o resultado da consulta em uma tabela temporária e rodar o cursor contra a tabela temporária surgiu algum efeito ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Importe arquivos XML com o CLR
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!346.entry


    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 12 de fevereiro de 2009 13:58
  • Gustavo obrigado pela sugestao......
    Vou tentar....


    fasdfasfd
    sexta-feira, 13 de fevereiro de 2009 16:01