2010-12-17 19 views
11

Zawsze używałem "SELECT COUNT (1) FROM X", ale być może nie jest to najbardziej efektywne. jakieś pomysły? Inne opcje to SELECT COUNT (*) lub uzyskanie ostatnio wstawionego identyfikatora, jeśli jest on automatycznie inkrementowany (i nigdy nie jest usuwany).Jaki jest najskuteczniejszy sposób zliczania wierszy w tabeli w SQLite?

A może chciałbym się dowiedzieć, czy coś jest w ogóle w stole? (Np liczyć> 0?)

+0

Dla count (*) vs count (coś innego), spójrz (tutaj) [http://stackoverflow.com/questions/4437399/jest-using-count-or-select-a-good-idea/ 4439459 # 4439459] – Ronnis

Odpowiedz

11

Najlepszym sposobem jest upewnienie się, że uruchomisz SELECT COUNT na jednej kolumnie (SELECT COUNT(*) jest wolniejszy) - ale SELECT COUNT zawsze będzie najszybszy sposób, aby uzyskać liczbę rzeczy (bazy danych optymalizuje wewnętrznie zapytanie).

Jeśli zapoznasz się z komentarzami poniżej, możesz zobaczyć argumenty, dla których SELECT COUNT(1) jest prawdopodobnie najlepszą opcją.

+0

Jest jeszcze lepiej, jeśli wybierzesz count (columnName) w kolumnie, która jest indeksowana w tabeli. – DwB

+0

Więc nie WYBIERZ LICZBĘ (1), ale WYBIERZ LICZBĘ (ID)? – tofutim

+0

Tak - jak powiedział Dwb, najlepiej zrobić to w kolumnie, która jest indeksowana. – girasquid

0

Nie sądzę, że znajdziesz w tym specjalną metodę. Możesz jednak dokonać wyboru liczby na kluczu podstawowym, aby być trochę szybszym.

0

Najszybszym sposobem uzyskania liczby wierszy jest bezpośrednio z metadanych tabeli, jeśli takie istnieją. Niestety, nie mogę znaleźć odniesienia do tego rodzaju danych dostępnych w SQLite.

W przeciwnym razie, każde zapytanie typu

SELECT COUNT (non-NULL wartość stała) od stołu

powinny zoptymalizować aby uniknąć konieczności stole, a nawet indeks, skanowanie. Idealnie silnik po prostu zwróci aktualną liczbę wierszy, o których wiadomo, że są w tabeli z wewnętrznych metadanych. W przeciwnym razie musi po prostu znać liczbę wpisów w indeksie dowolnej kolumny, która nie jest NULL (klucz podstawowy jest pierwszym miejscem do wyświetlenia).

Po wprowadzeniu kolumny w polu WYBIERZ LICZENIE użytkownik prosi silnik, aby wykonał co najmniej skanowanie indeksu i ewentualnie skanowanie tabeli, które będzie wolniejsze.

-1

sp_spaceused 'table_name' (wyklucza apostrof)

to zwróci liczbę wierszy w tabeli powyżej, jest to najbardziej efektywny sposób doszedłem jeszcze w poprzek.

to bardziej efektywne niż select Count(1) from 'table_name' (wyklucza apostrof)

sp_spaceused może być stosowany do każdego stołu, to bardzo pomocne, gdy tabela jest wyjątkowo duża (setki milionów wierszy) zwraca liczbę wierszy w prawo na drogę , natomiast 'select Count(1)' może zająć więcej niż 10 sekund. Co więcej, nie trzeba uwzględniać nazw kolumn/pól kluczowych.

+0

Pytanie dotyczy SQLite, a nie SQL Server – dsz

1

Jeżeli jesteś pewien (pewien), że nigdy nie zostały usunięte dowolny wiersz z tej tabeli i tabela nie została zdefiniowana z bez optymalizacji ROWID można mieć liczbę wierszy pod numerem:

select max(RowId) from table; 

Lub, jeśli stół jest okrągły kolejki można użyć coś jak

select MaxRowId - MinRowId + 1 from 
    (select max(RowId) as MaxRowId from table) JOIN 
    (select min(RowId) as MinRowId from table); 

to jest naprawdę bardzo szybki (w milisekundach), ale trzeba zwrócić uwagę, ponieważ SQLite mówi, że rząd id jest unikalny wśród wszystkich wierszy w tym samym stół. SQLite nie deklaruje, że identyfikatory wierszy są i będą zawsze kolejnymi liczbami.

+0

Tutaj możesz przeczytać coś o poleganiu na rowid [link] (http://www.sqlabs.com/blog/2010/12/sqlite-and-unique-rowid-something- naprawdę musisz/wiedzieć /) – Teolazza

0

Aby odpowiedzieć na odpowiedź girasquid, jako punkt danych, mam tabelę sqlite z 2,3 milionami wierszy. Korzystanie z select count(*) from table trwało ponad 3 sekundy, aby policzyć wiersze. Próbowałem również używać SELECT rowid FROM table, (myślę, że rowid jest domyślnym kluczem indeksowanym), ale nie było to szybsze. Następnie zrobiłem indeks na jednym z pól w bazie danych (tylko dowolne pole, ale wybrałem pole liczby całkowitej, ponieważ wiedziałem z wcześniejszych doświadczeń, że indeksy na krótkich polach mogą być bardzo szybkie, myślę, że ponieważ indeks jest przechowywany w kopii wartości w samym indeksie). SELECT my_short_field FROM table sprowadził czas do mniej niż sekundy.

Powiązane problemy