У меня есть таблица из трех столбцов с более чем 6 миллиардами строк в SQL Server 2008 R2.
Мы запрашиваем его каждый день, чтобы составлять ежеминутные диаграммы системного анализа для наших клиентов. Я не заметил каких-либо падений производительности базы данных (хотя тот факт, что она увеличивается ~ 1 ГБ каждый день, делает управление резервными копиями немного более сложным, чем хотелось бы).
Обновление июль 2016
Мы сделали это до ~ 24,5 миллиардов строк до того, как резервные копии стали достаточно большими, чтобы мы решили усечь записи старше двух лет (~ 700 ГБ, хранящихся в нескольких резервных копиях, в том числе на дорогих лентах). Стоит отметить, что производительность не была значительным мотиватором в этом решении (то есть, он все еще работал отлично).
Для тех, кто пытается удалить из SQL Server 20 миллиардов строк, я настоятельно рекомендую эту статью . Соответствующий код на случай, если ссылка умрет (подробное объяснение см. В статье):
ALTER DATABASE DeleteRecord SET RECOVERY SIMPLE;
GO
BEGIN TRY
BEGIN TRANSACTION
-- Bulk logged
SELECT *
INTO dbo.bigtable_intermediate
FROM dbo.bigtable
WHERE Id % 2 = 0;
-- minimal logged because DDL-Operation
TRUNCATE TABLE dbo.bigtable;
-- Bulk logged because target table is exclusivly locked!
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
Обновление ноябрь 2016
Если вы планируете хранить столько данных в одной таблице, не делайте этого. Я настоятельно рекомендую вам рассмотреть разбиение таблиц (вручную или со встроенными функциями, если вы используете Enterprise Edition). Это делает удаление старых данных так же просто, как усечение таблицы один раз в неделю (месяц / месяц и т. Д.). Если у вас нет Enterprise (а у нас его нет), вы можете просто написать скрипт, который запускается раз в месяц, удаляет таблицы старше 2 лет, создает таблицу следующего месяца и создает динамическое представление, объединяющее все разделы. столы вместе для удобства запросов. Очевидно, что «раз в месяц» и «старше 2 лет» должны быть определены вами исходя из того, что имеет смысл для вашего варианта использования. Удаление непосредственно из таблицы с десятками миллиардов строк данных а) займет ОГРОМНОЕ количество времени и б) заполнит журнал транзакций сотни или тысячи раз.