Qual é o período de tempo “razoável” para manter um cursor SQL aberto?

StackOverflow https://stackoverflow.com/questions/10727

  •  08-06-2019
  •  | 
  •  

Pergunta

Em seus aplicativos, qual é o "muito tempo" para manter uma transação aberta antes de confirmar ou reverter?Minutos?Segundos?Horas?

e em qual banco de dados?

Foi útil?

Solução

@lomaxx, @ChanChan:Pelo que sei, os cursores são apenas um problema no SQL Server e no Sybase (variantes do T-SQL).Se o seu banco de dados preferido for Oracle, os cursores são seus amigos.Já vi vários casos em que o uso de cursores realmente melhorou o desempenho.Os cursores são um mecanismo incrivelmente útil e, para ser sincero, dizer coisas como "se você usar um cursor, nós demitimos você" é um pouco ridículo.

Dito isto, você deseja manter o cursor aberto apenas para o mínimo absoluto necessário.Especificar um tempo máximo seria arbitrário e inútil sem a compreensão do domínio do problema.

Outras dicas

Provavelmente serei criticado por isso, mas você realmente deve tentar evitar o uso de cursores, pois eles prejudicam seriamente o desempenho.Se precisar usá-lo, você deve mantê-lo aberto o mínimo de tempo possível para liberar os recursos bloqueados pelo cursor o mais rápido possível.

transações:minutos.

Cursores:0 segundos no máximo, se você usar um cursor nós demitimos você.

Isso não é ridículo quando você considera que estamos em um ambiente web de alta disponibilidade, que precisa executar o SQL Server, e nem sequer permitimos procs armazenados devido à incapacidade de versioná-los e mantê-los com precisão.Se estivéssemos usando o Oracle, talvez.

Geralmente concordo com as outras respostas:Evite cursores quando possível (na maioria dos casos) e feche-os o mais rápido possível.

No entanto:Tudo depende do ambiente em que você está trabalhando.

  • Se for um ambiente de site de produção com muitos usuários, certifique-se de que o cursor desapareça antes que alguém atinja o tempo limite.
  • Se você estiver - por exemplo - escrevendo um "procedimento armazenado de análise de log" (ou qualquer outro) em uma máquina proprietária que não faz mais nada:sinta-se à vontade para fazer o que quiser.Você será a única pessoa que terá que esperar.Não é como se o servidor de banco de dados fosse morrer porque você usa cursores.Você deve considerar, porém, que talvez o comportamento de uso mude com o tempo e em algum momento poderá haver 10 pessoas usando esse aplicativo.Então tente encontrar outra maneira ;)

@ninesided:Deixando de lado as questões de desempenho, trata-se também de usar a ferramenta certa para o trabalho.Dada a opção de mover o cursor da sua consulta para o código, acho que 99 em 100 vezes seria melhor colocar essa lógica de loop em algum tipo de código gerenciado.Fazer isso permite que você obtenha as vantagens de usar um depurador, verificação de erros em tempo de compilação, segurança de tipo, etc.

Minha resposta para a pergunta ainda é a mesma, se você estiver usando um cursor, feche-o o mais rápido possível, no Oracle eu também tentaria usar cursores explícitos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top