[MSSQL]Отслеживание изменений в чужой базе без триггеров
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 26.08.09 11:30
Оценка:
Добрый день!

Нужна идея. Есть чужая база на MSSQL2000, модифицировать её нельзя. Там есть таблица вида (Код_ТС int not null FK, Путевая_точка int not null FK, План_время_прохождения datetime not null, Реал_время_прохождения datetime). Таблица содержит план для кучи маршрутных транспортных средств, времена когда они должны проходить эти путевые точки. В таблице порядка 10 тыс записей. Чужое ПО отслеживает прохождение этих точек и проставляет в колонку Реал_время_прохождения соответствующее время.

Мне нужно быстро получить таблицу (Код_ТС int, Последняя_путевая_точка int). Я могу сделать это запросом — но, как ни крути, получается время 0,5 — 0,7 сек, что неприемлемо. Идеально подошел бы триггер, проставляющий значения в какую-то мою таблицу — но модифицировать базу нельзя. Пока, единственным вариантом видится свое маленькое приложение, которое будет периодически (скажем, раз в секунд 10) опрашивать чужую таблицу и строить нужную мне. Задержка в 10 сек. приемлема, так как мне надо быстро получить табличку, пусть и с немного устаревшими данными.

Но, может еще есть какие-то варианты? Никак нельзя в пределах сервера реализовать функционал триггеров, но без навешивания самого триггера? Другие базы и пользовательские объекты создавать на сервере можно.

Спасибо
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re: [MSSQL]Отслеживание изменений в чужой базе без триггеров
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.08.09 04:30
Оценка:
Здравствуйте, Sshur, Вы писали:

S>Добрый день!


S>Нужна идея. Есть чужая база на MSSQL2000, модифицировать её нельзя. Там есть таблица вида (Код_ТС int not null FK, Путевая_точка int not null FK, План_время_прохождения datetime not null, Реал_время_прохождения datetime). Таблица содержит план для кучи маршрутных транспортных средств, времена когда они должны проходить эти путевые точки. В таблице порядка 10 тыс записей. Чужое ПО отслеживает прохождение этих точек и проставляет в колонку Реал_время_прохождения соответствующее время.


S>Мне нужно быстро получить таблицу (Код_ТС int, Последняя_путевая_точка int). Я могу сделать это запросом — но, как ни крути, получается время 0,5 — 0,7 сек, что неприемлемо.

Непонятно, почему. Приведите запрос, который вы выполняете.
S> Идеально подошел бы триггер, проставляющий значения в какую-то мою таблицу — но модифицировать базу нельзя.
Почему нельзя?

S>Пока, единственным вариантом видится свое маленькое приложение, которое будет периодически (скажем, раз в секунд 10) опрашивать чужую таблицу и строить нужную мне. Задержка в 10 сек. приемлема, так как мне надо быстро получить табличку, пусть и с немного устаревшими данными.

Почему вы думаете, что получение данных из вашей таблички будет быстрее?
S>Но, может еще есть какие-то варианты? Никак нельзя в пределах сервера реализовать функционал триггеров, но без навешивания самого триггера? Другие базы и пользовательские объекты создавать на сервере можно.
Можно попробовать состряпать indexed view на основе нужного запроса.

S>Спасибо
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: [MSSQL]Отслеживание изменений в чужой базе без тригге
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 28.08.09 08:04
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>>Мне нужно быстро получить таблицу (Код_ТС int, Последняя_путевая_точка int). Я могу сделать это запросом — но, как ни крути, получается время 0,5 — 0,7 сек, что неприемлемо.

S>Непонятно, почему. Приведите запрос, который вы выполняете.

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

S>> Идеально подошел бы триггер, проставляющий значения в какую-то мою таблицу — но модифицировать базу нельзя.

S>Почему нельзя?

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


S>>Пока, единственным вариантом видится свое маленькое приложение, которое будет периодически (скажем, раз в секунд 10) опрашивать чужую таблицу и строить нужную мне. Задержка в 10 сек. приемлема, так как мне надо быстро получить табличку, пусть и с немного устаревшими данными.

S>Почему вы думаете, что получение данных из вашей таблички будет быстрее?

Потому что там будет не 10 тыс строк, а порядка 100. Изначальная табличка выглядит примерно как

Код_ТС Путевая_точка Время
1 1 00:00
1 2 00:10
1 3 00:15
1 4 null
1 5 null
2 1 00:00
2 2 00:07
2 3 null
2 4 null


для каждого ТС порядка 1000 строк. А мне надо, чтобы остались только выделенные. Плюс, из-за нормализации там надо подтягивать данные из других таблиц, а тут можно сразу денормализованный результат записать, что тоже ускорит выборку.

S>>Но, может еще есть какие-то варианты? Никак нельзя в пределах сервера реализовать функционал триггеров, но без навешивания самого триггера? Другие базы и пользовательские объекты создавать на сервере можно.

S>Можно попробовать состряпать indexed view на основе нужного запроса.

Честно говоря, ни разу делать не приходилось, попробую
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[3]: [MSSQL]Отслеживание изменений в чужой базе без тригге
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.08.09 08:29
Оценка:
Здравствуйте, Sshur, Вы писали:
S>для каждого ТС порядка 1000 строк. А мне надо, чтобы остались только выделенные.
Ага, то есть вы тянете данные, используя свёртку через ranking functions?
S> Плюс, из-за нормализации там надо подтягивать данные из других таблиц, а тут можно сразу денормализованный результат записать, что тоже ускорит выборку.
Ну, может быть, может быть. Просто 500-700 мс — это довольно много для чистого выполнения запроса.

S>Честно говоря, ни разу делать не приходилось, попробую

Да, похоже — это ваш вариант. Раз нельзя навесить индексы на табличку, попробуйте на view. Но учтите, его придётся перегенерировать после каждого апдейта структуры чужой базы.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.