문제

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

또는

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM PRACOWNICY
    WHERE NR_DZIALU = 30
    GROUP BY NR_DZIALU
도움이 되었습니까?

해결책

이론 (이론에 의해 나는 의미한다 SQL 표준)는 행을 반환하기 전에 결과 세트를 제한하고 모든 행을 가져온 후 결과 세트를 제한한다고 말합니다. 그래서 더 빠릅니다. 이와 관련하여 SQL 표준 준수 DBMSS에서는 조건을 어디에 놓을 수없는 곳 (일부 RDBMS의 계산 열) 만 사용하십시오.

둘 다에 대한 실행 계획을보고 직접 확인할 수 있습니다. 아무것도 이길 수 없습니다 (데이터를 사용하여 특정 환경에서 특정 쿼리에 대한 측정).

다른 팁

엔진에 따라 다를 수 있습니다. 예를 들어 MySQL은 체인에서 거의 마지막으로 적용됩니다. 즉, 최적화를위한 여지가 거의 없습니다. 로부터 수동:

HABING 절은 항목이 클라이언트에게 전송되기 직전에 최적화없이 거의 마지막으로 적용됩니다. (제한이 적용됩니다.)

이 동작은 대부분의 SQL 데이터베이스 엔진에서 동일하다고 생각하지만 보장 할 수는 없습니다.

두 쿼리는 동일하며 DBMS 쿼리 최적화기 ~해야 한다 이를 인식하고 동일한 쿼리 계획을 생산합니다. 그것은 그렇지 않을 수도 있지만 상황은 인식하기가 상당히 간단하기 때문에 현대 시스템, 심지어 Sybase도 처리 할 것으로 기대합니다.

조항을 사용하는 것은 그룹 기능에 조건을 적용하는 데 사용해야합니다. 그렇지 않으면 WHERE 조건으로 MVO를 사용할 수 있습니다. 예를 들어. 쿼리를 Count (Dzialu)> 10을 가진 그룹으로 제한하려면 개별 행이 아닌 그룹에 작용하기 때문에 조건을 사용하여 조건을 넣어야합니다.

Where 절이 더 빠를 것으로 기대하지만 정확히 동일하게 최적화 할 수 있습니다.

그들이 최적화 할 것이라고 말하는 것은 실제로 통제하고 컴퓨터에 무엇을 해야하는지 알려주는 것이 아닙니다. 나는 사용이 WHERE 절에 대한 대안이 아니라는 데 동의합니다. Sum ()과 같은 것이 사용되는 곳에 의해 그룹에 적용되는 특별한 사용법이 있으며, 결과 세트를 제한하여 SUP ()>이 100 그 자체 이상을 갖는 그룹 만 표시하도록 제한하려고합니다. 줄에서 작동하는 그룹에서 작업하는 것. 그들은 사과와 오렌지입니다. 따라서 실제로, 그들은 매우 다른 두 마리의 동물이기 때문에 비교해서는 안됩니다.

두 진술 모두 SQL Server와 동일한 성능을 갖는 것과 동일한 성능을 가지고있을 것입니다.

따라서 쿼리에서 어디에 있거나 사용하는지는 중요하지 않습니다.

그러나 이상적으로는 조항을 구문 적으로 사용해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top