Pergunta

Eu tenho uma tabela que contém informações sobre as cidades em um jogo, você pode construir uma construção de cada vez e este é gravado com o valor "usedBuilding".

Cada vez eu vou executar um script que altera usedBuilding a 0, a pergunta é: qual dos dois modos seguintes é mais rápido e faz isso realmente importa o caminho que é usado?

UPDATE cities SET usedBuilding = 0;
UPDATE cities SET usedBuilding = 0 WHERE usedBuilding = 1;
Foi útil?

Solução

Em geral, o segundo caso (com a WHERE) cláusula seria mais rápido -. Como ele não irá causar avaliação gatilho, registro de transações, índice de atualização, etc, sobre as linhas não utilizadas

Potencialmente - dependendo da distribuição de 0/1 valores, ele poderia realmente ser mais rápido para atualizar todas as linhas em vez de fazer a comparação -. Mas isso é um caso bastante degenerado

Uma vez que ~ 95% de seus custos de consulta são I / O, utilizando a cláusula WHERE será ou não fazem diferença (já que a coluna não é indexado, e você está fazendo uma varredura na tabela) ou uma enorme diferença (se a coluna é indexado, ou a tabela de partição, etc). De qualquer maneira, não faz mal.

Eu suspeito que para a quantidade de dados que você está falando, você não vai notar uma diferença em ambos os planos de execução ou de velocidade - o que torna acadêmico na melhor otimização, prematura na pior das hipóteses. Então, eu aconselho a ir com o que logicamente faz sentido para a sua aplicação.

Outras dicas

Se usedBuilding é indexado, ele vai ser mais rápido para usar a cláusula onde, uma vez que só irá acessar / atualizar linhas onde usedBuilding é verdade. Se ele não está indexado, você estaria fazendo um qualquer maneira varredura completa da tabela, por isso não faria muito (qualquer?) Diferença.

Tente em ambos os sentidos em um loop de alguns milhares de vezes e tempo eles! Provavelmente depende: quantos registros são realmente nesta tabela, e se todos eles se encaixam na memória ou tem que ser paginada para disco. Quantos edifícios são pelo valor 1 antes de executar a atualização (eu estou supondo que isso pode ser 1).

Não importa o caminho que é usado, mas o mais curto, provavelmente tem o mínimo que pode dar errado com ele. O código que você não escreve não pode ter erros.

Com que frequência são estas voltas acontecendo? Quantas linhas que você espera ter nesta mesa? Se as respostas forem 'menos de uma vez por segundo' e 'inferior a 10000', simplesmente parar de se preocupar.

A menos que se acontecer de ter algum tipo de interesse acadêmico isso, é claro.

Parece que haveria um menor número de transações para fazer as "cidades Atualizar Definir usedBuilding = 0;" executar do que a consulta mais específica. A principal razão que eu posso pensar contra este seria se você tivesse mais de um estado para sua coluna. Se a sua apenas um boolean então seria bom, mas você pode querer passar algum tempo pensando se isso será sempre o caso.

A indexação também poderia fazer com que o plano de execução para ser mais eficiente usando a cláusula WHERE.

A melhor maneira de obter uma resposta definitiva seria ao perfil usando um monte de dados amostra sob diferentes cenários.

indexação não vai ajudá-lo a menos que você tem algo como talvez 2% dos usedBuilding = 1 valores.

No entanto, estes 2 afirmações são logicamente diferente e pode significar coisas totalmente diferentes. mas se para o seu caso, eles são o mesmo, em seguida, usar o um sem o onde cláusula.

Quantas linhas exatamente vai você tem? Eu suspeito que, para um jogo online pequeno, você realmente não me importo.

Se você estiver fazendo várias atualizações para a tabela de "cidades", pode ser uma boa idéia para fazê-los todos em um instrução UPDATE se possível.

Fazer qualquer alteração em uma linha provavelmente leva tanto I / O como escrever a linha inteira (exceto, claro, atualização colunas indexadas também requer gravações de índice), então você perder, fazendo várias atualizações que atingiu lotes de linhas.

Mas se você tem, digamos, <1000 linhas, você realmente não me importo:)

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