2016-03-23 25 views
16

Stworzyłem prostą Tabe:Ilość Cassandra CQL Wybierz z LIMIT

CREATE TABLE test (
    "type" varchar, 
    "value" varchar, 
    PRIMARY KEY(type,value) 
); 

włożeniu do niego 5 rzędów:

INSERT INTO test(type,value) VALUES('test','tag1') 
INSERT INTO test(type,value) VALUES('test','tag2') 
INSERT INTO test(type,value) VALUES('test','tag3') 
INSERT INTO test(type,value) VALUES('test','tag4') 
INSERT INTO test(type,value) VALUES('test','tag5') 

wpadłem SELECT * from test LIMIT 3 i działa zgodnie z oczekiwaniami.

type | value 
------+------ 
test | tag1 
test | tag2 
test | tag3 

Kiedy wpadłem SELECT COUNT(*) from test LIMIT 3, produkuje:

count 
------- 
    5 

nie należy powiedzieć 3?

Wydaje się, że Datastax documentation wskazuje, że podanie wartości LIMIT spowoduje nadpisanie wartości domyślnej wynoszącej 10.000. Dlaczego nie działa w tym przypadku? Jeśli to ma znaczenie, jestem na Cassandra 2.2.5 i uruchomiłem wszystkie zapytania poprzez cqlsh.

Aktualizacja Zarówno kierowca Java i CQLSH zostały przetestowane, aby pokazać, że LIMIT rzeczywiście nie działa w sposób określony w dokumentacji. Jeśli są czytani pracownicy Datastax, twój wkład byłby bardzo doceniany.

Odpowiedz

10

Moja spontaniczna odpowiedź na to, że liczba wierszy zawsze zwraca tylko jeden wiersz w zestawie wyników, podając liczbę znalezionych wierszy. Tak więc każdy LIMIT większy niż 1 nie miałby żadnego efektu.

Ale, jak podkreślono @ light, dokumentacja stwierdza, że ​​LIMIT powinien mieć zastosowanie do count(*). I nie bez powodu. Według this blog post Cassandra nie może pozyskać żadnych meta danych, aby wymyślić liczbę lub wiersze, ale musi sprawdzić każdą partycję (na każdym węźle), aby dostać się do liczby. Jest to zatem bardzo kosztowna operacja.

Jednak w przeciwieństwie do dokumentacji, podczas odpytywania C * 2.2.4 z cqlsh lub ze sterownikiem Java (v3.0.0) klauzula LIMIT nie ma wpływu na zgłaszaną liczbę wierszy. Nie ma również domyślnego limitu cqlsh z 10'000 wierszy. Limit LIMIT nie przekracza 10 000, jeśli jest ich więcej niż 10 000.

Dokumentacja i implementacja wydają się być niezsynchronizowane. Chociaż nie jestem w stanie powiedzieć, który z nich jest nieprawidłowy.

EDIT

Bilet odwołuje @Abhishek Anand stwierdza, że ​​documentation is wrong. Nie zachowanie. Zatem określenie limitu 1 zliczy wszystkie twoje wiersze. I to jest pożądane zachowanie.

+0

Jeśli 'WYBIERZ COUNT' zawsze zwraca 1 wiersz, a' LIMIT 'klauzula jest bezużyteczna w zapytaniu' SELECT COUNT', nieprawdaż? Dlaczego dokumentacja Datastax dała konkretne przykłady, takie jak "SELECT COUNT (*) Z big_table LIMIT 50000;"? – light

+0

@light, um, masz rację. Dokumentacja sugeruje, że powinieneś otrzymać 3 w wyniku liczenia w połączeniu z klauzulą ​​LIMIT. Ten [artykuł] (http://www.planetcassandra.org/blog/counting-key-in-cassandra/) wyjaśnia, dlaczego stosowanie limitu do liczenia jest dobrą rzeczą. Będę testować na mojej instancji (C * v 2.2.4). Jaka jest twoja wersja C *? – Ralf

+0

Jestem na Cassandra v2.2.5 – light

1

Klauzula limitów służy do ograniczania liczby wierszy w wyniku. Liczba (*) zwraca tylko jeden wiersz z liczbą (w tym przypadku) sumą wierszy.

„Granica 3” nie ma wpływu na liczbę wystąpień analizowanych z count (*), jeśli tego chcesz, to większość będzie używać „gdzie”

+0

Dzięki za odpowiedź. Jeśli 'SELECT COUNT' zawsze zwraca 1 wiersz, klauzula' LIMIT' jest bezużyteczna w zapytaniu 'SELECT COUNT', nieprawdaż? Dlaczego dokumentacja Datastax dała konkretne przykłady, takie jak "SELECT COUNT (*) Z big_table LIMIT 50000;"? – light

+0

odwołujesz się do tej dokumentacji? -> "SELECT COUNT() Z big_table LIMIT 50000; SELECT COUNT() Z big_table LIMIT 200000; Wynik tych instrukcji, jeśli masz 105 291 wierszy w bazie danych, to: 50000 i 105291" Myślę, że pomylili się z –

+0

, więc dokumentacja Datastax jest błędna? – light

9

Jest to błąd w Cassandry i wersji 2.2 dotyczy go .x.

https://issues.apache.org/jira/browse/CASSANDRA-8216

one oznaczone jako stałe, ale oczywiście to jest propagowana do wersji poza wersji stacjonarnej.

W każdym razie, światło, Twoje założenie/myślenie jest całkowicie poprawne. Słowo kluczowe limitu musi być zastosowane na liście Kasandra (*), i działa tak, jak powinno w wersjach, w których pracuję: 3.2.4 i 2.1.x

Powiązane problemy