SQL Server: максимальное количество строк в таблице

Я разрабатываю программное обеспечение, которое хранит много данных в одной из таблиц базы данных (SQL Server версии 8, 9 или 10). Скажем, около 100 000 записей вставляются в эту таблицу в день. Это около 36 миллионов записей в год. Из-за опасений, что я проиграю по производительности, я решил создать новую таблицу каждый день (таблица с текущей датой в ее названии), чтобы уменьшить количество записей в таблице.

Не могли бы вы рассказать мне, была ли это хорошая идея? Существует ли ограничение записи для таблиц SQL-сервера? Или вы знаете, сколько записей (более или менее) может быть сохранено в таблице до того, как производительность значительно снизится?

Ответ 1

Трудно дать общий ответ на это. Это действительно зависит от количества факторов:

  • какой размер вашей строки
  • какие данные вы храните (строки, капли, цифры)
  • что вы делаете с вашими данными (просто храните их в архиве, регулярно обращайтесь к ним)
  • У вас есть индексы на вашем столе - сколько
  • какие характеристики вашего сервера

и др.

Как было сказано в другом месте здесь, 100 000 в день и, следовательно, на таблицу слишком много - я предлагаю ежемесячно или еженедельно, возможно, даже ежеквартально. Чем больше таблиц у вас будет больше кошмара обслуживания/запроса, тем он станет.

Ответ 2

Вот некоторые из Максимальная емкость для SQL Server 2008 R2

  • Размер базы данных: 524 272 терабайт
  • Базы данных на экземпляр SQL Server: 32 767
  • Файловые группы на каждую базу данных: 32 767
  • Файлы для каждой базы данных: 32,767
  • Размер файла (данных): 16 терабайт
  • Размер файла (журнал): 2 терабайта
  • Строки в таблице: ограничено доступной памятью
  • Таблицы на базу данных: ограничено количеством объектов в базе данных

Ответ 3

У меня есть таблица с тремя столбцами с чуть более 6 миллиардами строк в SQL Server 2008 R2.

Мы запрашиваем его каждый день, чтобы создавать графические диаграммы системного анализа для наших клиентов. Я не заметил ни одной производительности производительности базы данных (хотя тот факт, что она растет ~ 1 Гбайт каждый день, делает управление резервными копиями более активным, чем хотелось бы).

Обновление Июль 2016

Количество строк

Мы сделали это до ~ 24,5 миллиардов строк, пока резервные копии не стали достаточно большими, чтобы мы могли урезать записи старше двух лет (~ 700 ГБ, хранящиеся в нескольких резервных копиях, в том числе на дорогих лентах). Стоит отметить, что производительность не была существенным стимулом в этом решении (т.е. Все еще работала отлично).

Для тех, кто пытается удалить 20 миллиардов строк из SQL Server, я настоятельно рекомендую эту статью. Соответствующий код в случае, если ссылка замирает (прочитайте статью для полного объяснения):

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 (чего у нас нет), вы можете просто написать script, который выполняется один раз в месяц, отбрасывает таблицы старше 2 лет, создает таблицу следующего месяца и восстанавливает динамическое представление, которое объединяет все таблицы разделов для упрощения запросов. Очевидно, что "раз в месяц" и "старше 2 лет" должен быть определен вами на основе того, что имеет смысл для вашего случая использования. Удаление непосредственно из таблицы с десятками миллиардов строк данных будет: a) взять ОГРОМНОЕ количество времени и б) заполнить журнал транзакций в сотни или тысячи раз.

Ответ 4

Я не знаю предела строки, но я знаю таблицы с более чем 170 миллионами строк. Вы можете ускорить его с помощью секционированных таблиц (2005+) или представлений, которые соединяют несколько таблиц.

Ответ 5

Я не знаю MSSQL специально, но 36 миллионов строк невелики для базы данных предприятия - работая с базами данных мейнфреймов, для меня 100.000 строк звучит как таблица конфигурации: -).

В то время как я не являюсь большим поклонником некоторых программ Microsoft, это не Access, о котором мы говорим здесь: я предполагаю, что они могут обрабатывать довольно значительные размеры базы данных с помощью своих корпоративных СУБД.

Я подозреваю, что дни, возможно, были слишком прекрасными, чтобы разделить его, если действительно ему нужно делить вообще.

Ответ 6

У нас есть таблицы в SQL Server 2005 и 2008 с более чем 1 миллиардом строк в нем (30 миллионов добавляются ежедневно). Я не могу себе представить, как спуститься с крыс, раскладывая их в новый стол каждый день.

Намного дешевле добавить подходящее место на диске (которое вам нужно) и RAM.

Ответ 7

Это зависит, но я бы сказал, что лучше всего держать все в одной таблице ради простоты.

100 000 строк в день на самом деле не так много. (В зависимости от вашего серверного оборудования). Я лично видел, что MSSQL обрабатывает до 100M строк в одной таблице без каких-либо проблем. Пока вы держите свои индексы в порядке, все должно быть хорошо. Ключ состоит в том, чтобы иметь кучи памяти, чтобы индексы не могли быть заменены на диск.

С другой стороны, это зависит от того, как вы используете данные, если вам нужно сделать много запросов, и потребуются маловероятные данные, которые охватывают несколько дней (так что вам не нужно будет присоединяться к таблицам) он будет быстрее разделить его на несколько таблиц. Это часто используется в таких приложениях, как управление производственными процессами, где вы можете читать значение, например, 50 000 инструментов каждые 10 секунд. В этом случае скорость чрезвычайно важна, но простота не является.

Ответ 8

Мы переполнили целочисленный первичный ключ один раз (это ~ 2,4 миллиарда строк) на таблице. Если есть ограничение по строкам, вы вряд ли когда-либо ударяете его всего за 36 миллионов строк в год.

Ответ 9

Вы можете заполнить таблицу, пока не будет достаточно места на диске. Для лучшей производительности вы можете попробовать перейти на SQL Server 2005, а затем разбить таблицу и поместить детали на разные диски (если у вас есть конфигурация RAID, которая действительно может вам помочь). Разметка возможна только в корпоративной версии SQL Server 2005. Вы можете посмотреть пример раздела по этой ссылке: http://technet.microsoft.com/en-us/magazine/cc162478.aspx

Также вы можете попытаться создать представления для большинства используемых частей данных, что также является одним из решений.

Надеюсь, это помогло...

Ответ 10

Самая большая таблица, с которой я столкнулась на SQL Server 8 на Windows2003, составила 799 миллионов с 5 столбцами. Но независимо от того, будет ли это хорошо, измерять ли он по SLA и случаю использования - например, загрузите 50-100 000 000 записей и посмотрите, все ли работает.

Ответ 11

SELECT Top 1 sysobjects.[name], max(sysindexes.[rows]) AS TableRows, 
  CAST( 
    CASE max(sysindexes.[rows]) 
      WHEN 0 THEN -0 
      ELSE LOG10(max(sysindexes.[rows])) 
    END 
    AS NUMERIC(5,2)) 
  AS L10_TableRows 
FROM sysindexes INNER JOIN sysobjects ON sysindexes.[id] = sysobjects.[id] 
WHERE sysobjects.xtype = 'U' 
GROUP BY sysobjects.[name] 
ORDER BY max(rows) DESC

Ответ 12

Разделяйте таблицу ежемесячно. Это лучший способ обработки таблиц с большим ежедневным притоком, будь то оракул или MSSQL.