2013-08-13 10 views
12

Chcę wiedzieć tylko dla ciekawości, że czy Select Count(*) from SomeTableName przemierza wszystkie wiersze bazy danych tak jak Select * from SomeTableName?Czy indeksowano COUNT (*)?

Czy jest jakieś inne pole licznika dostępne w metadanych bazy danych, które aktualizuje się za każdym razem, gdy wiersz jest dodawany lub usuwany? I to pole jest dostępne przez poprzednie zapytanie.

Chciałbym również wiedzieć, które z obu zapytań jest szybsze, a ile?

+0

w jaki sposób db może śledzić liczbę? co jeśli zapytasz liczyć z filtrem gdzie? –

+2

'count (*)' jest w porządku, 'wybierz *' nie jest –

+0

@ArsenMkrt wtedy będzie liczyć tylko dane spełniające warunek – zxc

Odpowiedz

17
SELECT Count(*) 
FROM SomeTableName 

będzie zawsze liczyć wszystkie wiersze. Chociaż (w przeciwieństwie do SELECT *) nie musi czytać wszystkich kolumn i może wykorzystywać najwęższy (niefiltrowany) dostępny do tego indeks.

W przeciwieństwie do MySQL (silnik MyISAM) nie pobiera wartości z metadanych.

Wartość rowcowa jest dostępna w metadanych i można ją pobrać z sys.partitions, ale nigdy nie jest używana dla zapytań COUNT i nie zawsze jest dokładna.

+0

dzięki za to krótkie i proste wyjaśnienie. :) –