PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zapewnić klientowi API 1 000 000 wyników z bazy danych?

Tabela ma klucz podstawowy. Wykorzystaj to.

Zamiast LIMIT i OFFSET , zrób stronicowanie z filtrem na kluczu podstawowym. Wskazałeś na to w swoim komentarzu:

Stronicowanie przy użyciu liczb losowych ( dodaj „WIĘKSZE NIŻ ORDER BY ” do każdego zapytania )

ale nie ma nic przypadkowego w sposobie, w jaki należy to zrobić.

SELECT * FROM big_table WHERE id > $1 ORDER BY id ASC LIMIT $2

Pozwól klientowi określić oba parametry, ostatni widziany identyfikator i liczbę rekordów do pobrania. Twój interfejs API będzie musiał mieć symbol zastępczy, dodatkowy parametr lub alternatywne wywołanie „pobierz pierwszy n identyfikatorów”, gdzie pomija się WHERE klauzula z zapytania, ale to trywialne.

To podejście wykorzystuje dość wydajne skanowanie indeksu, aby uporządkować rekordy, generalnie unikając sortowania lub konieczności iterowania przez wszystkie pominięte rekordy. Klient może zdecydować, ile wierszy chce naraz.

To podejście różni się od LIMIT i OFFSET podejście w jeden kluczowy sposób:równoczesna modyfikacja. Jeśli INSERT do tabeli za pomocą klawisza niżej niż klucz, który niektórzy klienci już widzieli, to podejście w ogóle nie zmieni jego wyników, podczas gdy OFFSET podejście powtórzy wiersz. Podobnie, jeśli DELETE wiersz z identyfikatorem niższym niż wcześniej widziany, wyniki tego podejścia nie ulegną zmianie, podczas gdy OFFSET pominie niewidoczny wiersz. Nie ma jednak różnicy w przypadku tabel zawierających tylko dołączanie z wygenerowanymi kluczami.

Jeśli wiesz z góry, że klient będzie chciał otrzymać cały zestaw wyników, najskuteczniejszą rzeczą, jaką możesz zrobić, to po prostu wysłać mu cały zestaw wyników bez żadnej z tych stronicowania. Właśnie tam chciałbym użyj kursora. Odczytaj wiersze z bazy danych i wyślij je do klienta tak szybko, jak klient je zaakceptuje. Ten interfejs API musiałby ustawić limity dotyczące powolnego działania klienta, aby uniknąć nadmiernego obciążenia zaplecza; dla powolnego klienta prawdopodobnie przełączyłbym się na stronicowanie (jak opisano powyżej) lub buforował cały wynik kursora do pliku tymczasowego i zamykał połączenie z bazą danych.

Ważne zastrzeżenia :

  • Wymaga UNIQUE ograniczenie / UNIQUE index lub PRIMARY KEY być wiarygodnym
  • Różne równoczesne zachowanie modyfikacji w celu ograniczenia/przesunięcia, patrz wyżej


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Niewrażliwe na wielkość liter unikalne pola modelu w Django?

  2. Szybkość obcinania Postgresql

  3. Dodaj lata do daty w PostgreSQL

  4. Oblicz Max of Sum pola z adnotacjami w pogrupowanym zapytaniu w Django ORM?

  5. Jak utworzyć histogram w PostgreSQL