Уровень транзакций, nolock / readpast и параллелизм - PullRequest
5 голосов
/ 13 ноября 2008

У нас есть система, которая одновременно вставляет большой объем данных с нескольких станций, а также предоставляет интерфейс запроса данных. Схема выглядит примерно так (извините за плохое форматирование):

[SyncTable]
  SyncID
  StationID
  MeasuringTime


[DataTypeTable]
  TypeID
  TypeName


[DataTable]
  SyncID
  TypeID
  DataColumns...

Вставка данных выполняется в режиме «Синхронизация» и происходит следующим образом (мы только вставляем данные в систему, мы никогда не обновляем)

INSERT INTO SyncTable(StationID, MeasuringTime) VALUES (X,Y); SELECT @@IDENTITY

INSERT INTO DataTable(SyncID, TypeID, DataColumns) VALUES 
  (SyncIDJustInserted, InMemoryCachedTypeID, Data)
  ... lots (500) similar inserts into DataTable ...

И запросы идут так (для данной станции, времени измерения и типа данных)

SELECT SyncID FROM SyncTable WHERE StationID = @StationID 
                               AND MeasuringTime = @MeasuringTime 
SELECT DataColumns FROM DataTable WHERE SyncID = @SyncIDJustSelected
                                  AND DataTypeID = @TypeID

Мой вопрос заключается в том, как мы можем объединить уровень транзакций на вставках и подсказки NOLOCK / READPAST на запросы так, чтобы:

  1. Мы максимизируем параллелизм в нашей системе, отдавая предпочтение вставкам (нам нужно хранить много данных, что превышает 2000+ записей в секунду)
  2. Запросы возвращают только данные из «зафиксированной» синхронизации (нам не нужен результирующий набор с наполовину вставленной синхронизацией или синхронизацией с некоторыми пропущенными записями из-за пропуска блокировки)
  3. Нам не важно, включены ли в запрос «самые новые» данные, нам важнее согласованность и оперативность, чем «живые» и актуальные данные

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

ОБНОВЛЕНИЕ: просто добавив немного больше информации для будущих ответов. Мы запускаем SQL Server 2005 (вероятно, в течение шести месяцев в 2008 году) в сети SAN с объемом хранения 5+ ТБ. Я не уверен, какой тип RAID настроен для SAn и сколько именно дисков у нас есть.

Ответы [ 3 ]

1 голос
/ 14 ноября 2008

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

Решить это на SQL 2000 гораздо сложнее.

1 голос
/ 15 ноября 2008

Это отличный сценарий для функции секционирования в SQL Server 2005/2008. Вы можете создать раздел для каждого StationID, и данные каждого StationID могут быть помещены в его собственную файловую группу (если вы хотите, это может не потребоваться в зависимости от вашей загрузки.)

Это дает вам некоторые преимущества с параллелизмом:

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

Сценарий, который вы описываете, имеет много общего с ночными нагрузками хранилища данных. Microsoft разработала технический справочный проект Project Real, который может показаться вам интересным. Они опубликовали его как стандарт, и вы можете прочитать документацию по проектированию и код реализации, чтобы увидеть, как они справились с очень быстрой загрузкой:

http://www.microsoft.com/technet/prodtechnol/sql/2005/projreal.mspx

В SQL Server 2008 секционирование еще лучше, особенно в отношении параллелизма. Это все еще не серебряная пуля - она ​​требует ручного проектирования и обслуживания квалифицированным администратором базы данных. Это не функция «установи и забудь», и она требует Enterprise Edition, которая стоит дороже, чем Standard Edition. Я люблю это, хотя - я использовал это несколько раз, и это решило определенные проблемы для меня.

0 голосов
/ 13 ноября 2008
  1. Какой тип дисковой системы вы будете использовать? Если у вас большой чередующийся RAID-массив, запись должна выполняться хорошо. Если вы можете оценить количество необходимых операций чтения и записи в секунду, вы можете включить эти числа в формулу и посмотреть, будет ли ваша дисковая подсистема поддерживать работу. Может быть, у вас нет контроля над оборудованием ...

  2. Не хотите ли вы обернуть вставки в транзакции, что сделает их недоступными для чтения до завершения вставки?

  3. Это должно произойти, если ваше оборудование настроено правильно, и вы обращаете внимание на свою кодировку SQL - как вам кажется.

Изучите инструменты SQLIO.exe и SQL Stress:

SQLIOStress.exe SQLIOStress.exe имитирует различные шаблоны поведения ввода-вывода SQL Server 2000 для обеспечения элементарной безопасности ввода-вывода.

Утилита SQLIOStress может быть загружена с веб-сайта Microsoft. См. Следующую статью.

• Как использовать утилиту SQLIOStress для стресса дисковой подсистемы, такой как SQL Server http://support.microsoft.com/default.aspx?scid=kb;en-us;231619

Внимание! Загруженный файл содержит полный технический документ с подробными сведениями об утилите.

SQLIO.exe SQLIO.exe - это утилита ввода-вывода SQL Server 2000, используемая для определения основных результатов тестирования производительности.

Утилита SQLIO может быть загружена с веб-сайта Microsoft. Смотрите следующее: • Инструмент тестирования производительности SQLIO (разработка SQL) - доступен для клиентов http://download.microsoft.com/download/f/3/f/f3f92f8b-b24e-4c2e-9e86-d66df1f6f83b/SQLIO.msi

...