Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Najlepszy magazyn danych dla miliardów wierszy

Przechowywanie ~3,5 TB danych i wstawianie około 1 tys.

  • jakie masz w tym celu wymagania dotyczące dostępności? 99,999% czasu pracy, czy wystarczy 95%?
  • jakie masz wymagania dotyczące niezawodności? Czy brak wkładki kosztuje 1 milion dolarów?
  • jakie masz wymagania dotyczące możliwości odzyskania? Jeśli stracisz jeden dzień danych, czy to ma znaczenie?
  • jakie masz wymagania dotyczące spójności? Czy zapis musi być gwarantowany, aby był widoczny przy następnym czytaniu?

Jeśli potrzebujesz wszystkich tych wymagań, które podkreśliłem, proponowane obciążenie będzie kosztować miliony sprzętu i licencji w systemie relacyjnym, dowolnym systemie, bez względu na to, jakich sztuczek spróbujesz (sharding, partycjonowanie itp.). System nosql z samej definicji nie spełniałby wszystkich te wymagania.

Więc oczywiście złagodziłeś już niektóre z tych wymagań. Istnieje ładny wizualny przewodnik porównujący oferty nosql w oparciu o paradygmat „wybierz 2 z 3” w Visual Guide to NoSQL Systems:

Po aktualizacji komentarza OP

Z SQL Server byłaby to prosta implementacja:

  • jeden klucz klastrowy pojedynczej tabeli (GUID, czas). Tak, ulegnie fragmentacji, ale czy fragmentacja ma wpływ na odczyty z wyprzedzeniem, a odczyty z wyprzedzeniem są potrzebne tylko w przypadku skanowania o dużym zasięgu. Ponieważ zapytania dotyczą tylko określonego identyfikatora GUID i zakresu dat, fragmentacja nie będzie miała większego znaczenia. Tak, jest to klucz szeroki, więc strony bez kartek będą miały słabą gęstość klucza. Tak, doprowadzi to do słabego współczynnika wypełnienia. I tak, mogą wystąpić podziały stron. Pomimo tych problemów, biorąc pod uwagę wymagania, nadal jest to najlepszy wybór klucza klastrowego.
  • Podziel tabelę według czasu, aby umożliwić skuteczne usuwanie wygasłych rekordów za pomocą automatycznego okna przesuwnego. Uzupełnij to przebudową partycji indeksu online z ostatniego miesiąca, aby wyeliminować słaby współczynnik wypełnienia i fragmentację wprowadzoną przez klastrowanie GUID.
  • włącz kompresję stron. Ponieważ najpierw klastrowane są grupy kluczy według GUID, wszystkie rekordy GUID będą znajdować się obok siebie, dając kompresji strony dużą szansę na wdrożenie kompresji słownika.
  • Będziesz potrzebować szybkiej ścieżki we/wy do pliku dziennika. Interesuje Cię wysoka przepustowość, a nie małe opóźnienia, aby dziennik mógł nadążyć za 1 tys.

Partycjonowanie i kompresja stron wymagają serwera SQL w wersji Enterprise Edition, nie będą działać w wersji Standard Edition i oba są bardzo ważne, aby spełnić wymagania.

Na marginesie, jeśli rekordy pochodzą z frontowej farmy serwerów WWW, umieściłbym Express na każdym serwerze WWW i zamiast INSERT na zapleczu, SEND informacje do zaplecza, korzystając z lokalnego połączenia/transakcji w ekspresie znajdującym się w tym samym miejscu co serwer sieciowy. Daje to znacznie lepszą historię dostępności rozwiązania.

Więc tak zrobiłbym to w SQL Server. Dobrą wiadomością jest to, że problemy, z którymi się zmierzysz, są dobrze zrozumiane, a rozwiązania znane. to niekoniecznie oznacza, że ​​jest to lepsze niż to, co można osiągnąć za pomocą Cassandry, BigTable lub Dynamo. Pozwolę komuś bardziej kompetentnemu w sprawach nie-sql-owskich argumentować swoją sprawę.

Zauważ, że nigdy nie wspomniałem o modelu programowania, obsłudze .Net i tym podobnych. Szczerze myślę, że są one nieistotne w przypadku dużych wdrożeń. Robią ogromną różnicę w procesie rozwoju, ale po wdrożeniu nie ma znaczenia, jak szybki był program, jeśli narzut ORM zmniejsza wydajność :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przechowywanie danych UTF-16/Unicode w SQL Server

  2. Jak naprawić „Serwer nie jest skonfigurowany do dostępu do danych” w SQL Server

  3. Przegląd kompresji danych w SQL Server

  4. Jak przechowywać obrazy w kolumnie varbinary(max)?

  5. Jak znaleźć ustawienie ANSI_NULLS bazy danych w SQL Server (T-SQL)