У нас есть система, которая одновременно вставила большой объем данных с нескольких станций, одновременно выставляя интерфейс запросов данных. Схема выглядит примерно так (извините о плохом форматировании):Уровень транзакции, nolock/readpast и параллелизм
[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 ...
и запросов выглядит следующим образом (для данной станции, measuringtime и тип данных)
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-массив настроен и точно, сколько у нас дисков.
Отметить это как ответ, так как часть «решения» была привязана к правильной настройке конкретной дисковой системы, что значительно улучшило пропускную способность. – 2009-10-14 09:03:10