Mam tabelę z trzema kolumnami z nieco ponad 6 miliardami wierszy w programie SQL Server 2008 R2.
Codziennie wykonujemy zapytania, aby tworzyć wykresy analizy systemu minuta po minucie dla naszych klientów. Nie zauważyłem żadnych spadków wydajności bazy danych (chociaż fakt, że rośnie ona o ~ 1 GB każdego dnia, sprawia, że zarządzanie kopiami zapasowymi jest nieco bardziej skomplikowane, niż bym chciał).
Aktualizacja lipiec 2016
Udało nam się osiągnąć ~ 24,5 miliarda wierszy, zanim kopie zapasowe stały się na tyle duże, że mogliśmy zdecydować o obcięciu rekordów starszych niż dwa lata (~ 700 GB przechowywanych w wielu kopiach zapasowych, w tym na drogich taśmach). Warto zauważyć, że występ nie był istotnym motywatorem w tej decyzji (tj. Nadal działał świetnie).
Gorąco polecam ten artykuł każdemu, kto próbuje usunąć 20 miliardów wierszy z SQL Server . Odpowiedni kod na wypadek utraty linku (przeczytaj artykuł, aby uzyskać pełne wyjaśnienie):
ALTER DATABASE DeleteRecord SET RECOVERY SIMPLE;
GO
BEGIN TRY
BEGIN TRANSACTION
SELECT *
INTO dbo.bigtable_intermediate
FROM dbo.bigtable
WHERE Id % 2 = 0;
TRUNCATE TABLE dbo.bigtable;
SET IDENTITY_INSERT dbo.bigTable ON;
INSERT INTO dbo.bigtable WITH (TABLOCK) (Id, c1, c2, c3)
SELECT Id, c1, c2, c3 FROM dbo.bigtable_intermediate ORDER BY Id;
SET IDENTITY_INSERT dbo.bigtable OFF;
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
ALTER DATABASE DeleteRecord SET RECOVERY FULL;
GO
Aktualizacja listopad 2016
Jeśli planujesz przechowywać tak dużo danych w jednej tabeli: nie rób tego. Zdecydowanie zalecam rozważenie partycjonowania tabel (ręcznie lub za pomocą wbudowanych funkcji, jeśli używasz wersji Enterprise). To sprawia, że usuwanie starych danych jest tak łatwe, jak obcinanie tabeli raz w tygodniu (tydzień / miesiąc / itd.). Jeśli nie masz Enterprise (czego my nie mamy), możesz po prostu napisać skrypt, który będzie uruchamiany raz w miesiącu, usunie tabele starsze niż 2 lata, utworzy tabelę na następny miesiąc i ponownie wygeneruje dynamiczny widok, który łączy całą partycję tabele razem w celu łatwego wykonywania zapytań. Oczywiście „raz w miesiącu” i „starsze niż 2 lata” powinny być zdefiniowane przez Ciebie na podstawie tego, co ma sens w Twoim przypadku użycia.