2012-07-05 6 views
5

Podobnie jak w bardzo prosty przykład, powiedzmy, że mam tabelę test przykładowe dane tak:Liczenie warunkowe: różnice w wydajności przy użyciu funkcji SUMA() vs COUNT()?

a  |  b  
------------- 
1  | 18 
1  | 24 
1  | 64 
1  | 82 
1  | 10 
1  |  7 
2  |  5 
2  | 18 
2  | 66 
2  | 72 
3  | 81 
3  | 97 

i dla każdego a, jestem uzyskać rachubę ilu b „s istnieją, że są < 50. wynik będzie wyglądać następująco:

a  | bcnt 
-------------- 
1  |  4 
2  |  2 
3  |  0 

teraz mogę osiągnąć ten wynik w jeden z dwóch sposobów:

SELECT a, COUNT(CASE WHEN b < 50 THEN 1 ELSE NULL END) AS bcnt 
FROM test 
GROUP BY a 

Lub:

SELECT a, SUM(CASE WHEN b < 50 THEN 1 ELSE 0 END) AS bcnt 
FROM test 
GROUP BY a 

wiem, może to wydawać się tak znikoma banalna sprawa, ale moje pytanie będzie tam żadnych korzyści (choć tak niewielki) w użyciu jednej metody nad drugą pod względem: wydajność? ... Ile innych DBMS'ów będzie w nich pracować? ... Klarowność wyciągu? ... itd.

+3

"Chcę uzyskać ** liczbę ** z ..." Aby zapytać, czy należy odpowiedzieć? :-) – Eric

Odpowiedz

7

Występ?

Och, różnica, jeśli w ogóle, byłaby marginalna, jestem pewien. Nie martwiłbym się o nic.

Ile innych DBMS będzie pracować?

mam żadnych wątpliwości, że zarówno pracować w dowolnym głównym SQL produktu przynajmniej, tak, znowu, to nie byłby przedmiotem troski, a nie do mnie tak.

Klarowność wyciągu?

pewnością COUNT wyraża to bardziej oczywiste, że chcesz count rzeczy, nie dodać jakieś arbitralne wartości. Z SUM, będziesz zdawał sobie sprawę z rzeczywistej intencji tylko po osiągnięciu części THEN 1 po przejrzeniu stanu.

Również, jeśli mogę użyć COUNT mogę pominąć ELSE NULL rolę, ponieważ to, co implikuje gdy ELSE jest nieobecny.Jeśli pominiemy ELSE 0 w wyrażeniu SUM, mogę zakończyć się wynikiem NULL zamiast prawdopodobnie oczekiwanego 0.

Z drugiej strony, istnieje może być całkiem przeciwne sytuacje, w których byłoby to bardziej wygodne, aby powrócić NULL zamiast 0 w wyniku liczenia. Tak więc, jeśli użyłbym COUNT, musiałbym zrobić coś takiego jak NULLIF(COUNT(CASE ...), 0), natomiast z SUM(CASE ...) wystarczyłoby, aby pominąć klauzulę ELSE. Ale nawet w tym przypadku mógłbym jeszcze wolać nieco dłuższą klarowność niż nieco mniejszą zwięzłość (inne rzeczy są równe).

-1

Za pomocą LICZBA, zliczasz elementy, używając SUMA dodajesz liczby (dodatnie, ujemne lub zero) dla wynik może być ujemny.

2

Co złego WHERE:

select a, count(b) 
from test 
where b < 50 
group by a 
+0

Eh? Posiadanie służy do filtrowania wyników funkcji agregujących. Czy masz na myśli gdzie? – podiluska

+0

@Paddy Poda ORA-00979: nie wyrażenie GROUP BY ... – beny23

+0

Przepraszam, masz rację, będzie edytować. – Paddy

3

Osobiście używam

select a, count(b) 
    from test 
where b < 50 
group by a 

jasny, zwięzły i zgodnie z tym SQL fiddle odrobinę szybciej niż inni (potrzebuje mniej danych zgodnie do planu wykonania, ale z tabelą, która jest mała, nie zauważysz różnicy):

Powiązane problemy