У нас есть система, которая одновременно вставляет большой объем данных с нескольких станций, а также предоставляет интерфейс запроса данных. Схема выглядит примерно так (извините за плохое форматирование):
[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 для запросов, чтобы:
- Мы максимизируем параллелизм в нашей системе, отдавая предпочтение вставкам (нам нужно хранить много данных, что-то вроде 2000+ записей в секунду).
- Запросы возвращают данные только из «зафиксированной» синхронизации (нам не нужен набор результатов с наполовину вставленной синхронизацией или синхронизация с некоторыми пропущенными записями из-за пропуска блокировки)
- Нас не волнует, включены ли в запрос «самые новые» данные, мы больше заботимся о согласованности и отзывчивости, чем о «живых» и актуальных данных.
Это могут быть очень противоречивые цели и может потребоваться высокий уровень изоляции транзакций, но меня интересуют все приемы и оптимизации для достижения высокой скорости отклика как на вставки, так и на выборки. Я буду рад уточнить, если потребуется больше деталей, чтобы выявить больше настроек и трюков.
ОБНОВЛЕНИЕ: Просто добавьте немного больше информации для будущих ответов. Мы запускаем SQL Server 2005 (2008 год, вероятно, через шесть месяцев) в сети SAN с 5+ ТБ хранилища на начальном этапе. Я не уверен, какой тип RAID настроен на SAn и сколько именно дисков у нас есть.