Pergunta

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM  PRACOWNICY
    GROUP BY NR_DZIALU
    HAVING NR_DZIALU = 30

ou

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM PRACOWNICY
    WHERE NR_DZIALU = 30
    GROUP BY NR_DZIALU
Foi útil?

Solução

A teoria (pela teoria Quero dizer SQL Padrão ) diz que ONDE restringe o conjunto de resultados antes de retornar linhas e HAVING restringe o conjunto de resultados depois de trazer todas as linhas. Então, onde é mais rápido. Em SGBDs compatível com SQL padrão a este respeito, só usam TENDO onde você não pode colocar a condição em um WHERE (como colunas computadas em alguns RDBMSs.)

Você pode apenas ver o plano de execução para ambos e verificar por si mesmo, nada vai bater que (medida para a sua consulta específica em seu ambiente específico com seus dados.)

Outras dicas

Pode depender do motor. MySQL por exemplo, aplica TENDO quase último na cadeia, ou seja, não há quase nenhum espaço para otimização. Do manual:

A cláusula HAVING é aplicada quase passado, pouco antes de itens são enviados para o cliente, sem otimização. (Limite for aplicada depois de ter.)

Eu acredito que este comportamento é o mesmo na maioria dos bancos de dados SQL, mas não posso garantir isso.

As duas consultas são equivalentes e seu DBMS consulta otimizador deve reconhecer isso e produtos produzem o mesmo plano de consulta. Não pode, mas a situação é bastante simples para reconhecer, então eu esperaria qualquer sistema moderno - mesmo Sybase -. Para lidar com ele

HAVING deve ser usado para aplicar condições em funções de grupo, caso contrário, eles podem ser mvoed na condição WHERE. Por exemplo. se você queria restringir sua consulta para grupos que têm COUNT (DZIALU)> 10, por exemplo, você precisa colocar a condição em um TENDO, pois atua sobre os grupos, não as linhas individuais.

eu esperaria a cláusula WHERE seria mais rápido, mas é possível que eles otimizar a exatamente o mesmo.

dizendo que iria otimizar não está realmente tomando o controle e dizer ao computador o que fazer. Concordo que o uso de ter não é uma alternativa a um onde cláusula. Tendo tem um uso especial de ser aplicado a um grupo por onde algo como uma soma foi usada () e você quiser limitar o conjunto de resultados para mostrar apenas os grupos que possuem uma soma ()> de 100 per se. Tendo trabalhos sobre grupos, onde os trabalhos sobre linhas. Eles são maçãs e laranjas. Então, realmente, eles não devem ser comparados porque são dois animais muito diferentes.

Tanto as declarações vai ter mesmo desempenho de SQL Server é inteligente o suficiente para analisar ambas as mesmas instruções em um plano similar.

Assim, não importa se você usar WHERE ou HAVING na sua consulta.

Mas, idealmente você deve usar a cláusula WHERE sintaticamente.

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