Лучшая база данных для высокой записи (10000 + вставляет/час), низкое чтение (10 чтений/секунда)?

Необходимо использовать \r\n в качестве решения.

7
задан rksprst 13 September 2009 в 03:03
поделиться

4 ответа

Ваша проблема заключается в используемом вами уровне изоляции. Если вы его не измените, SQL Server (и многие другие базы данных) будут работать в режиме, в котором выбирается блокировка незафиксированных чтений. Вы хотите изменить SQL Server так, чтобы он использовал вместо него MVCC (по умолчанию для Oracle; MySQL и SQL Server тоже имеют его), и ваша проблема исчезнет.

From SET TRANSACTION ISOLATION LEVEL (Transact-SQL) :

READ COMMITTED

Указывает, что операторы не могут читать данные, которые были изменены, но не совершенные другими сделками. Эта предотвращает грязное чтение. Данные могут быть изменено другими транзакциями между отдельные заявления в рамках текущая транзакция, в результате которой неповторяющиеся чтения или фантомные данные. Этот параметр установлен по умолчанию для SQL Server.

Поведение READ COMMITTED зависит от о постановке READ_COMMITTED_SNAPSHOT база данных option:

  • Если READ_COMMITTED_SNAPSHOT имеет значение OFF (по умолчанию), компонент Database Engine использует общие блокировки для предотвращения других транзакции от изменения строк, пока текущая транзакция выполняет читать операцию. Общие блокировки также заблокировать оператор от чтения строк изменен другими транзакциями до другая транзакция завершена. Тип общей блокировки определяет, когда он будет выпущен. Замки строк выпущен до того, как следующая строка будет обработанный. Блокировки страниц сняты при чтении следующей страницы и таблицы замки освобождаются, когда заявление завершается.
  • Если READ_COMMITTED_SNAPSHOT имеет значение ON, компонент Database Engine использует строку версионирование для представления каждого оператора с транзакционно последовательным снимок данных, как они существовали на начало заявления. Замки не используется для защиты данных от обновления от других транзакций.

Когда READ_COMMITTED_SNAPSHOT опция базы данных включена, вы можете использовать Подсказка таблицы READCOMMITTEDLOCK для запросить общую блокировку вместо строки версия для отдельных операторов в транзакциях, выполняемых в READ Уровень изоляции COMMITTED.

(выделено автором)

Измените конфигурацию базы данных, чтобы включить READ_COMMITTED_SNAPSHOT.

Кроме того, постарайтесь, чтобы ваши транзакции оставались как можно более короткими и убедитесь, что вы фиксируете транзакцию в своем фоновый процесс (который выполняет 10 000 вставок в час), потому что, если он никогда не фиксируется, выборки будут заблокированы навсегда (по настройкам по умолчанию).

20
ответ дан 6 December 2019 в 06:37
поделиться

Как уже говорили другие, объем данных, которые вы записываете в базу данных, не является проблемой. SQL Server может легко обрабатывать гораздо больше данных. Лично у меня есть таблицы, которые без проблем занимают от сотен тысяч до миллионов строк в час, и люди читают строки весь день без какого-либо замедления.

  1. Возможно, вам придется посмотреть на выполнение грязного чтения, изменив уровень изоляции операторов чтения или с помощью подсказки WITH (NOLOCK).

  2. Вы должны изучить использование объекта массовой загрузки в .NET для загрузки данных в базу данных. Используйте партии от 1000 до 5000 в зависимости от производительности, которую вы видите во время тестирования. Вам нужно будет поиграть с числом, чтобы добиться максимальной производительности. Массовая вставка данных в таблицу даст вам значительно лучшую производительность, чем вставка записей строка за строкой. Убедитесь, что вы не выполняете всю загрузку за одну транзакцию. Вы должны выполнять одну транзакцию в пакете.

  3. Как выглядит дисковый ввод-вывод при записи в базу данных.

  4. Какую модель восстановления вы установили для базы данных? ПОЛНОЕ восстановление базы данных потребует гораздо больше операций ввода-вывода, чем использование ПРОСТОГО режима восстановления. Используйте ПОЛНОЕ восстановление только в том случае, если вам действительно нужно восстановление на определенный момент времени, которое идет вместе с ним.

5
ответ дан 6 December 2019 в 06:37
поделиться

В продолжение ответа Джоэла вам может потребоваться установить соответствующие значения для PAD_INDEX и FILLFACTOR в ваших индексах. Если вы не указали эти параметры, ваши вставки могут выполнять много повторной разбивки на страницы ваших индексов, что значительно замедлит время записи.

0
ответ дан 6 December 2019 в 06:37
поделиться

Менее 3 вставок в секунду не даст никакой СУБД тренировки, если только объем данных, вставляемых в каждую операцию вставки, не является феноменальным. Аналогичным образом, 10 операций чтения в секунду вряд ли вызовут чрезмерную нагрузку на любую компетентную СУБД, если только не возникнет какой-то усложняющий фактор, о котором вы не упомянули (например, `` операции чтения представляют собой совокупность агрегатов по всей СУБД, которые будут накапливать миллиарды записей после определенного периода ''). из ... ну, 100 000 часов для первого миллиарда записей, что составляет примерно 4 000 дней или примерно 10 лет »).

2
ответ дан 6 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: