Pergunta

Na Oracle, ao consultar para a existência de linha, por que é Select 1 rápida que SELECT COUNT (*)?

Foi útil?

Solução

Uma vez que a Oracle não suporta SE EXISTE em PL / SQL, a sugestão de CodeByMidnight ao uso EXISTE normalmente seria feito com algo como

SELECT 1 
  INTO l_local_variable 
  FROM dual 
 WHERE EXISTS( 
    SELECT 1 
      FROM some_table 
     WHERE some_column = some_condition ); 

A Oracle sabe que pode parar de processar a cláusula WHERE EXISTS assim que uma linha é encontrado, por isso não tem que potencialmente contar um grande número de linhas que correspondem aos critérios. Esta é uma preocupação menor, é claro, se você está verificando para ver se uma linha com uma determinada chave existe do que se você está verificando uma condição que envolve colunas não indexados ou verificar uma condição que pode resultar em um grande número de linhas a serem devolvidos.

(Nota: Eu gostaria de poder postar isso como um comentário no post de CodeByMidnight, mas os comentários não pode incluir código formatado).

UPDATE: Dado o esclarecimento o poster original feita em seu comentário, a resposta curta e definitiva é que uma SELECT 1 ou SELECT COUNT(1) não mais rápido do que um SELECT COUNT(*) é. Contrariamente ao que a codificação diretrizes que você está olhando, COUNT(*) é a forma preferida de contar todas as linhas. Havia um velho mito de que um COUNT(1) foi mais rápido. No mínimo, isso não tem sido verdade em qualquer versão do Oracle lançou na última década e é improvável que ele sempre foi fiel. Era uma crença amplamente difundida, no entanto. Hoje, o código que faz um COUNT(1) em vez de um COUNT(*) geralmente me faz suspeitar que o autor é propenso a acreditar vários mitos da Oracle que é por isso que eu sugiro usar COUNT(*).

Outras dicas

É melhor ainda ao uso existe onde os suportes de RDBMS de TI ou um equivalente, pois isso irá parar o processamento de linhas assim que encontra uma correspondência.

Eu ficaria surpreso se select count (*) não foi devidamente otimizado, não há necessidade de carga em todas as colunas como não haverá processamento relacionado coluna.

Como uma estrela leva todos cols na contagem, "1" é um tipo de dados nativo.

No MySQL "SELECT COUNT (name_of_the_primary_key)" deve ser tão rápido quanto o seu SELECT 1. É o índice que conta. Uma contagem () em um índice deve ser bastante rápido;)

Eu não acho que isso é verdade para Oracle. http://justoracle.blogspot.com/2006/12/count- vs-count1.html

Mas, em alguns bancos de dados a razão é porque '*' tem de visitar o meta-dados tabelas. Isso tende a adicionar uma sobrecarga necessária-un. Onde como 1 é apenas um literal.

Todas as outras coisas sendo iguais, "select 1 from my_table" retornará o início resultar mais rápido do que "select count(*) from my_table", mas se você recuperar todos os resultados da consulta, o count(*) será mais rápido porque envolve muito menos dados ( um número inteiro, por oposição a um número inteiro por cada linha da tabela).

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