AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 10655
Accepted
DataGirl
DataGirl
Asked: 2012-01-14 10:01:46 +0800 CST2012-01-14 10:01:46 +0800 CST 2012-01-14 10:01:46 +0800 CST

NOLOCK é sempre ruim?

  • 772

Sou um desenvolvedor de relatórios que deseja tornar minhas consultas o mais eficientes possível. Eu trabalhava com um DBA que me dizia - acredito porque sempre lidava com relatórios em um servidor de produção - para usar NOLOCKem todas as consultas.

Agora, trabalho com um DBA que baniu NOLOCKem qualquer circunstância - mesmo quando um relatório meu (devido a uma falta considerável de índices em algumas tabelas) está interrompendo a replicação e as atualizações do sistema. Na minha opinião, neste caso, a NOLOCKseria uma coisa boa.

Como a maior parte do meu treinamento em SQL veio de vários DBAs com opiniões muito diferentes, gostaria de perguntar isso a uma grande variedade de DBAs.

sql-server locking
  • 4 4 respostas
  • 4601 Views

4 respostas

  • Voted
  1. Martin Smith
    2012-01-14T10:29:30+08:002012-01-14T10:29:30+08:00

    Nem sempre é ruim.

    É claro que permite que você leia valores não confirmados (que podem ser revertidos e, portanto, nunca existiram logicamente), além de permitir fenômenos como ler valores várias vezes ou não.

    Os únicos níveis de isolamento que garantem que você não encontrará tais anomalias são serializáveis/instantâneos. Os valores de leitura repetível podem ser perdidos se uma linha for movida (devido a uma atualização de chave) antes que a verificação alcance essa linha, os valores confirmados de leitura podem ser lidos duas vezes se uma atualização de chave fizer com que uma linha lida anteriormente avance.

    No entanto, é mais provável que esses problemas surjam nolockporque, por padrão, nesse nível de isolamento, ele usará uma verificação ordenada de alocação quando estimar que há mais de 64 páginas a serem lidas . Assim como a categoria de problemas que surgem quando as linhas se movem entre as páginas devido a atualizações de chave de índice, essas varreduras ordenadas de alocação também são vulneráveis ​​a problemas com divisões de página (onde as linhas podem ser perdidas se a página recém-alocada for anterior no arquivo do que o ponto já digitalizada ou lida duas vezes se uma página já digitalizada for dividida em uma página posterior no arquivo).

    Pelo menos para consultas simples (tabela única), é possível desencorajar o uso dessas verificações e obter uma verificação ordenada de chave nolocksimplesmente adicionando um ORDER BY index_keyà consulta para que a Orderedpropriedade do IndexScanseja true.

    Mas se o seu aplicativo de relatório não precisar de números absolutamente precisos e puder tolerar a maior probabilidade de tais inconsistências, pode ser aceitável.

    Mas certamente você não deve jogá-lo em todas as consultas na esperança de que seja um botão "turbo" mágico. Além da maior probabilidade de encontrar resultados anômalos nesse nível de isolamento ou nenhum resultado (erro "Não foi possível continuar a varredura com NOLOCK devido à movimentação de dados"), existem até casos em que o desempenho nolock pode ser muito pior .

    • 34
  2. Best Answer
    Remus Rusanu
    2012-01-14T11:23:07+08:002012-01-14T11:23:07+08:00

    Se o seu relatório bloquear atualizações de que seu DBA está certo: você absolutamente não deve usar NOLOCK. O próprio fato de haver conflitos é uma indicação clara de que, se você usasse leituras sujas, obteria relatórios incorretos.

    Na minha opinião, sempre há alternativas melhores do que NOLOCK:

    • Suas tabelas de produção são somente leitura em vigor e nunca são modificadas? Marque o banco de dados somente leitura!
    • As verificações de tabela causam conflitos de bloqueio? Indexe as tabelas adequadamente, os benefícios são múltiplos.
    • Não consegue modificar/não sabe como indexar adequadamente? Use ISOLAMENTO DE INSTANTÂNEO .
    • Não é possível alterar o aplicativo para usar o instantâneo? Ative a leitura do instantâneo confirmado !
    • Você mediu o impacto do controle de versão de linha e tem evidências de que isso afeta o desempenho? Você não pode indexar os dados? e você está bem com relatórios incorretos ? Então, pelo menos, faça um favor a si mesmo e use SET TRANSACTION ISOLATION LEVEL, não uma dica de consulta. Será mais fácil corrigir posteriormente o nível de isolamento em vez de modificar cada consulta.
    • 31
  3. A-K
    2012-01-14T19:01:15+08:002012-01-14T19:01:15+08:00

    Seus clientes toleram resultados inconsistentes em relatórios? Se a resposta for não, você não deve usar NOLOCK - você pode obter resultados errados em simultaneidade. Escrevi alguns exemplos aqui , aqui e aqui . Esses exemplos mostram saída inconsistente em READ COMMITTED e REPEATABLE READ, mas você pode ajustá-los e obter resultados errados com NOLOCK também.

    • 11
  4. Christian Specht
    2012-03-14T10:47:51+08:002012-03-14T10:47:51+08:00

    A maioria dos relatórios que crio não são executados em dados atuais. A maioria dos relatórios de execução dos clientes são dados de ontem. Sua resposta mudaria se fosse esse o caso?

    Se for esse o caso, você tem mais uma opção possível:
    em vez de executar suas consultas no banco de dados de produção e mexer com bloqueios e NOLOCK, você pode executar seus relatórios a partir de uma cópia do banco de dados de produção.

    Você pode configurá-lo para que seja restaurado automaticamente a partir de um backup todas as noites .
    Aparentemente, seus relatórios estão sendo executados em servidores nos sites dos clientes, então não sei se essa configuração seria uma solução viável para você.
    (mas, novamente ... eles devem ter backups de qualquer maneira, então tudo que você precisa é de algum espaço no servidor para restaurá-los)

    Sou um desenvolvedor interno, então isso é mais fácil para mim porque tenho controle total sobre os servidores e bancos de dados.

    Você pode fazer isso pelo menos para os relatórios que precisam apenas de dados de ontem e mais antigos. Talvez alguns relatórios tenham que ficar no banco de dados de produção, mas pelo menos você move parte da carga para outro banco de dados (ou melhor ainda, outro servidor).

    Eu também tenho a mesma situação no trabalho:
    estamos usando uma cópia de banco de dados de produção como esta para quase todos os relatórios, mas há algumas consultas que exigem os dados de hoje.

    • 8

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve