2016-06-05 7 views
5

Im Nachgang zu meinem früheren question:Wählen Sie Anzahl (*) vs Wählen Sie Anzahl (ID) vs Anzahl wählen (1). Sind diese in der Tat gleichwertig?

Einige der Antworten und Kommentare deuten darauf hin, dass

select count(*)-select count(id) meist gleichwertig ist, wo ID der Primärschlüssel .`

ich immer haben, ist bevorzugt select count(1); Ich benutze auch immer if exists (select 1 from table_name) ...

Nun meine Frage:

1) Was ist der optimale Weg, um ein select count query über eine Tabelle der Ausstellung?

2) Wenn wir eine hinzufügen, wo Klausel: where msg_type = X; Wenn msg_type einen Non-Clustered-Index hat, würde select count(msg_type) from table_name where msg_type = X die bevorzugte Option zum Zählen sein?

Side-Bar:

Von einem sehr frühen Alter wurde ich gelehrt, dass select * from... ist BAD BAD BAD, ich denke, das hat mich skeptisch select count (*) als auch

+1

Die Optimierer sind heutzutage so weit fortgeschritten, dass wahrscheinlich alle Zählabfragen äquivalent sind. –

+0

@Evgeni guter Punkt –

+1

@CharlesOkwuagwu: Nur zu Ihrer Information, habe ich einen Blog-Post darüber in meinem Blog schreiben - [https://krishnrajrana.wordpress.com/2016/02/16/sql-server-miscondition-about -countcolumnname-vs-count1-vs-count /] (https://krishnrajrana.wordpress.com/2016/02/16/sql-server-miscondition-about-countcolumnname-vs-count1-vs-count/) –

Antwort

5
count(*) --counts all values including nulls 

count(id)-- counts this column value by excluding nulls 

count(1) is same as count(*) 

Wenn wir eine where-Klausel hinzufügen: wo msg_type = X; Wenn msg_type einen Nonclustered-Index hat, würde count (msg_type) aus table_name wählen, wobei msg_type = X die bevorzugte Option zum Zählen ist.

Wie ich in meinem previous answer erwähnt, SQL Server ein kostenbasierte Optimizer ist und der Plan gewählten hängt von vielen Faktoren .SQL günstigstenen Plan in kürzester Zeit möglich abzurufen versucht ..

jetzt, wenn Sie ausgeben, count(msg_type), SQL kann dieser Index wählen, ob dies billiger ist oder ein anderes scannen, solange es right Ergebnisse (keine NULL-Werte in der Ausgabe) gibt ..

ich neige dazu, immer count(*) zu verwenden, es sei denn, i nulls ausschließen möchten, für die reasons quoted here

2

Nun, diese Anzahl Abfragen sind nicht identisch und werden verschiedene Dinge tun.

Sind identisch und werden jeden Datensatz zählen!

select count(col_name) 

Wird nur NOT NULL Werte auf col_name zählen!

Also, es sei denn col_name ist die PK wie Sie sagten, diese Abfrage wird verschiedene Dinge tun.

Wie für Ihre zweite Frage, es kommt darauf an, können wir Ihnen keine generische Antwort, die immer wahr sein wird.Sie müssen sich den EXPLAIN-Plan ansehen oder einfach nach sich selbst sehen, obwohl ich glaube, dass das Hinzufügen dieser WHERE-Klausel mit diesem Index besser ist.

Verwandte Themen