30 миллионов записей в день, SQL Server не может справиться, нужен другой тип системы баз данных?

Извините за воскрешение старого потока, но сегодня у меня была та же проблема. Самый простой способ, который я нашел, это следующее:

# Expand right side of clipping rect to make room for the legend
par(xpd=T, mar=par()$mar+c(0,0,0,6))

# Plot graph normally
plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2))
lines(1:3, rnorm(3), pch = 2, lty = 2, type="o")

# Plot legend where you want
legend(3.2,1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))

# Restore default clipping rect
par(mar=c(5, 4, 4, 2) + 0.1)

Найдено здесь: http://www.harding.edu/fmccown/R/

10
задан Jan Jongboom 4 October 2009 в 19:15
поделиться

8 ответов

Вы говорите, что ваша система способна вставлять 3000 записей в секунду без индексов, но только около 100 с двумя дополнительными некластеризованными индексами. Если 3k / s - максимальная пропускная способность, разрешенная вашим вводом-выводом, добавление двух индексов теоретически должно снизить пропускную способность примерно на 1000-1500 / сек. Вместо этого вы видите деградацию в 10 раз хуже. Правильным решением и ответом будет «Это зависит», и необходимо будет провести серьезное устранение неполадок и выявление узких мест. Имея это в виду, если бы я рискнул предположить, я бы назвал двух возможных виновных:

A. Дополнительные некластеризованные индексы распределяют записи грязных страниц в большее количество областей распределения. Решением было бы поместить кластерный индекс и каждый некластеризованный индекс в свою собственную файловую группу и поместить каждую из трех файловых групп на отдельные LUN ​​на RAID.

B. Низкая селективность некластеризованных индексов создает высокую конкуренцию между чтением и записью (конфликты ключей, а также конфликты % lockres% ), что приводит к длительному времени ожидания блокировки как для вставки, так и для выборки. Возможные решения заключаются в использовании снимков SNAPSHOT в режиме чтения зафиксированных снимков , но я должен предупредить об опасности добавления лота ввода-вывода в хранилище версий (т. Е. В tempdb) в системе, которая, возможно, уже находится под высоким напряжением ввода-вывода. Второе решение - использование снимков базы данных для отчетов, они вызывают меньшую нагрузку на ввод-вывод, и их можно лучше контролировать (без использования хранилища версий tempdb), но отчеты больше не основываются на данных в реальном времени.

Я склонен полагать, что B) как вероятная причина, но я должен снова подчеркнуть необходимость надлежащего расследования и надлежащего анализа корневого случая.

«RAID10» не очень точное описание.

  • Сколько шпинделей в части RAID 0? Они полосатые?
  • Сколько LUN?
  • Где находится журнал базы данных?
  • Где находится база данных?
  • Сколько разделов?
  • Где находится tempdb?

Что касается вопроса о том, подходят ли реляционные базы данных для чего-то вроде этого, да, безусловно. Есть еще много факторов, которые следует учитывать: возможность восстановления, доступность, экосистема набора инструментов, ноу-хау, простота разработки, простота развертывания, простота управления и тд и тп. Реляционные базы данных могут легко справиться с вашей рабочей нагрузкой, им просто нужно правильно настроить. 30 миллионов вставок в день, 350 операций в секунду - это небольшое изменение для сервера базы данных. Но 32-битная система ОЗУ 4 ГБ вряд ли может служить сервером базы данных, независимо от количества процессоров.

11
ответ дан 3 December 2019 в 16:29
поделиться

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

Рассматривали ли вы что-нибудь вроде индексированные представления в SQL Server? Это хороший способ удалить индексацию из основной таблицы и переместить ее в материализованное представление.

7
ответ дан 3 December 2019 в 16:29
поделиться

Вы можете попробовать сделать таблицу секционированной . Таким образом, обновления индекса повлияют на меньшие наборы строк. Вероятно, будет достаточно ежедневного разбиения. Если нет, попробуйте разбить по часам!

3
ответ дан 3 December 2019 в 16:29
поделиться

Репликация базы данных для отчетов кажется лучшим путем с учетом интенсивного трафика. Однако сначала нужно попробовать кое-что ...

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

Вы не говорите, что вы используете для идентификаторов, но если вы используете GUID, вы можете захотеть изменить свои ключи на bigints. Поскольку идентификаторы GUID являются случайными, они ложатся тяжелым бременем на индексы как при построении индексов, так и при их использовании. Использование столбца идентификаторов bigint будет поддерживать работу индекса в значительной степени в хронологическом порядке, и если вы действительно заинтересованы в доступе в реальном времени для запросов к вашим недавним данным,

2
ответ дан 3 December 2019 в 16:29
поделиться

Вы предоставляете недостаточно информации; Я не уверен, почему вы говорите, что реляционная база данных кажется плохой, кроме того факта, что вы сейчас испытываете проблемы с производительностью. На какой машине работает СУБД? Учитывая, что у вас есть иностранные идентификаторы, кажется, что реляционная база данных в точности то, что здесь требуется. SQL Server должен иметь возможность обрабатывать 30 миллионов вставок в день, если предполагается, что он работает на достаточном оборудовании.

2
ответ дан 3 December 2019 в 16:29
поделиться

Sybase IQ кажется вполне подходящей для этой цели, как указали наши архитекторы / администраторы баз данных (например, они явно переносят всю нашу статистику в IQ, указывая эту возможность как причину). Я не могу обосновать себя - просто кивните людям в нашей компании, которые обычно знают, о чем они говорят, из прошлого опыта.

Однако мне интересно, ДОЛЖНЫ ли вы хранить все 30-миллиметровые записи? Не лучше ли хранить некоторые предварительно агрегированные данные?

0
ответ дан 3 December 2019 в 16:29
поделиться

Не уверен насчет SQL-сервера, но в другой системе баз данных, которую я использовал давно, идеальным методом для этого типа деятельности было сохранение обновлений, а затем, как пакетное отключение индексов, добавление новые записи, а затем переиндексировать. Мы делали это один раз за ночь. Я не уверен, подходят ли ваши потребности в отчетности для этого типа решения или даже если это можно сделать в MS SQL, но я думаю, что это возможно.

0
ответ дан 3 December 2019 в 16:29
поделиться

Вы не говорите, как управляются вставки. Они группируются или каждая статистика записывается отдельно? Потому что вставка тысячи строк за одну операцию, вероятно, будет намного эффективнее, чем вставка одной строки за тысячу отдельных операций. Вы по-прежнему можете вставлять достаточно часто, чтобы предоставлять отчеты более или менее в реальном времени;)

0
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

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