Impacto no desempenho do SQL 2000 de JDBC selectMethod = cursor

3

( Postado primeiro no SO , mas não está obtendo respostas. Publique novamente para alcançar um público maior, já que é uma disciplina cruzada.)

No processo de tentar ajudar uma equipe de desenvolvimento de aplicativos com alguns problemas de desempenho em um servidor SQL 2000, executei um rastreamento SQL e descobri que todas as chamadas para o banco de dados estão cheias de instruções do Cursor do servidor API (sp_cursorprepexec, sp_cursorfetch, sp_cursorclose).

Parece que eles estão especificando algumas propriedades de cadeia de conexão que forçam o uso de cursores do lado do servidor, recuperando apenas 128 linhas de dados de cada vez: (From link )

When the API cursor attributes or properties are set to anything other than their defaults, the OLE DB provider for SQL Server and the SQL Server ODBC driver use API server cursors instead of default result sets. Each call to an API function that fetches rows generates a roundtrip to the server to fetch the rows from the API server cursor.

UPDATE : Eles têm vários aplicativos Java usando uma conexão JDBC com o servidor SQL com selectMethod=cursor especificado (em oposição a selectMethod=direct ).

Do ponto de vista do DBA, isso é simplesmente irritante (ele confunde o rastreamento com lixo inútil) e, com toda a probabilidade, resulta em muitas viagens extras de ida e volta de aplicativos para SQL, reduzindo o desempenho geral.

Eles aparentemente testaram selectMethod=direct de uma forma muito limitada (mudaram apenas uma aplicação em ~ 60) e experimentaram alguns problemas de algum tipo (detalhes técnicos dos quais eu não tenho).

Então, minhas perguntas são:

  • Qual é o impacto no desempenho de selectMethod=cursor vs direct em um servidor SQL 2000 já ocupado? (Eu tinha especulado que aumentar o número de idas e voltas entre servidores SQL e APP não pode fazer nada de bom. Eu estava errado?)
  • O selectMethod é uma configuração transparente para o aplicativo? Isso poderia quebrar seus aplicativos se mudarmos?
  • Quando eles devem usar cursor vs direct ? Existem alguns tipos de aplicativos que se beneficiariam de um sobre o outro?

Atualizar : descobri o nome do parâmetro do driver, que garantiu edições significativas no título, no corpo e nas tags.

Atualizar : bounty adicionado. Também adicionou recompensa à pergunta SO (que é mais focada no comportamento do aplicativo). Obrigado!

    
por BradC 02.09.2010 / 17:55

1 resposta

2

Resumidamente,

  1. %código%
    • teoricamente requer mais recursos do lado do servidor do que selectMethod=cursor
    • carrega apenas no máximo tamanho do lote registros na memória do cliente de uma só vez, resultando em uma pegada de memória do cliente mais previsível
  2. %código%
    • teoricamente requer menos recursos do lado do servidor do que selectMethod=direct
    • lerá todo o conjunto de resultados na memória do cliente (a menos que o driver suporte nativamente a recuperação do conjunto de resultados assíncronos) antes que o aplicativo cliente possa iterá-lo; isso pode reduzir o desempenho de duas formas :
      1. reduz o desempenho com conjuntos de resultados grandes se o aplicativo cliente for gravado de modo a interromper o processamento após percorrer apenas uma fração do conjunto de resultados (com selectMethod=direct ele já pagou o custo de recuperar dados que essencialmente lançará away; com selectMethod=cursor o desperdício é limitado a no máximo tamanho de lote - 1 linhas - a condição de término antecipado provavelmente deve ser recodificada no SQL, eg como direct ou funções de janela)
      2. reduziu o desempenho com grandes conjuntos de resultados devido à potencial coleta de lixo e / ou problemas de falta de memória associados a um aumento de espaço ocupado pela memória

Em resumo,

  • Pode usar cursor menor desempenho do aplicativo? - qualquer método pode diminuir o desempenho, por diferentes motivos. Depois de um determinado tamanho do conjunto de resultados, SELECT TOP ainda pode ser preferível. Veja abaixo para quando usar um ou outro
  • O selectMethod=cursor é uma configuração transparente de aplicativo em uma conexão JDBC? - é transparente, mas ainda pode quebrar o aplicativo se o uso de memória aumentar o suficiente para sobrecarregar o sistema cliente (e, correspondentemente, seu servidor) ou travar completamente o cliente
  • Mais geralmente, quando você deve usar cursor vs selectMethod= ? - Eu pessoalmente uso cursor ao lidar com conjuntos de resultados potencialmente grandes ou ilimitados. A sobretaxa de ida e volta é então amortizada, dado um tamanho de lote grande o suficiente, e a pegada de memória do meu cliente é previsível. Eu uso direct quando o tamanho do conjunto de resultados que eu esperava é conhecido por ser inferior ao tamanho de lote que eu uso com cursor , ou ligado de alguma forma, ou quando a memória não é um problema.

Felicidades, V.

    
por 14.09.2010 / 06:37