Хранение статуса платежа в высоконагруженной базе
От: PetrovichForever Россия  
Дата: 28.03.12 14:38
Оценка:
Коллеги, приветствую!
Есть табличка заказов Deal (MSSQL Server 2008 R2):
Id, ... , ...
Есть связаная с ней табличка DealTrace:
Id, DealId, Status, ...

У объекта Deal на протяжении жизни статус меняется много раз, каждый раз дописывая в DealTrace новую строку (необходимо хранить историю статусов).

Проблема возникает при работе со статистикой, а именно получение большого кол-ва Deal'ов и выяснение их текущих статусов.
Выполняется запрос вида:
SELECT * FROM Deal d
INNER JOIN DealTrace dt on d.Id = dt.DealId AND dt.id = (SELECT MAX(id) FROM DealTrace WHERE dealid=d.id )

В нашей системе с сотнями и сотнями INSERT'ов и SELECT'ов в секунду на больших объёмах этот запроc нещадно тормозит.
Индексы построены. Подумываем переводить часть объектов из базы на noSQL чтобы разгрузить сиквел, однако, пока нет чёткой понимания что переводить (и на какой рост объемов при этом можно будет расчитывать).

Я вижу несколько путей решения со своими недостатками:
— писать статусы в DealTrace, а тек-ий статус хранить в Deal обновляя его UPDATE'ом (кажется, самое неудобное решение — UPDATE убъет всю производительность lock'ами, или нет?)
— перенести Deal целиком в noSQL базу, целиком брать объект и обновлять в нем список статусов (избавляемся от сложных запросов в процессе жизнидеятельности Deal'а и запроса списка Deal'ов, но возникает потребность в доп. данных для запросов по Deal'ам с определённым статусом)
— что то еще?
sql parent child status highload
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.