|
|
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Добрый день Вопрос по конструированию запросов. Есть база источника данных, из нее запрашиваются значения по параметрам. Значения лежат в одной таблице, в ней есть ключи какому параметру принадлежит значение, а так же метка времени, за которое это значение было. Цикл опроса работает следующим образом: В источник делается запрос с указанием ключей соответствующих параметров и меткой времени, с какой возвращать значения. После разбора ответа метка времени делается равной самому старому из последних значений пришедших параметров. У этого метода есть минус: Когда прекращают обновляться значению по одному или нескольким параметрам-прекращает сдвигаться метка времени запроса. Таким образом ответ с каждой итерацией растет, приходят значения которые нам уже не нужны, потому что мы их прочитали и вообще общая производительность падает. Вроде понятно изложил. Кто может подсказать как оптимизировать алгоритм чтобы бороться с подобными ситуациями? Первое что приходит на ум - делать запрос по каждому из параметров. Но это мало производительно при большом объеме получаемых параметров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2012, 17:44 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
rdzviperДобрый день ... Вроде понятно изложил. Ничего не понятно (мне) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2012, 17:58 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
rdzviper, В общем бред какой-то. Если речь идет о чтении данных - читайте по нужному периоду. При чем тут какой-то сдвиг метки?.. Что за сдвиг... В общем пост ниочем. Или разжевывайте как для идиотов, или сами думайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2012, 22:01 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
>Есть база источника данных, из нее запрашиваются значения по параметрам . >В источник делается запрос с указанием ключей соответствующих параметров и меткой времени, с какой возвращать значения. То есть типа такого Код: sql 1. 2. 3. ? >После разбора ответа метка времени делается равной самому старому из последних значений пришедших параметров. "метка времени" где "делается равной ..."? у вас есть вторая таблица с метками времени, неким образом связанных с чем-то из исходной таблицы, или как? >Когда прекращают обновляться значению по одному или нескольким параметрам-прекращает сдвигаться метка времени запроса. >Таким образом ответ с каждой итерацией растет, приходят значения которые нам уже не нужны, потому что мы их прочитали и вообще общая производительность падает. Почему он растёт, если нет обновлений --> нет новых записей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2012, 10:05 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
rdzviper, Если вам нужны актуальные параметры? Так берите самые последние по времени и все ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2012, 11:43 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Вроде понятно изложил. Кто может подсказать как оптимизировать алгоритм ?Нанять программиста ? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2012, 12:01 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Добрый день, извиняюсь что долго не отвечал, уезжал на внедрение. Думал что объяснить "на пальцах будет понятнее". tanglir совершенно верно разобрался в алгоритме По каждому параметру хранится метка времени его последнего значения. Среди этих меток времени выбирается самая старая и она присваивается mytimestamp. Затем делается запрос, образно говоря Код: sql 1. 2. 3. Приходит ответ. Пришедшие значения укладываются в базу, обновляются метки времени, цикл запускается заново. В идеальной ситуации, когда период чтения равен периоду появления одного значения по каждому параметру, в один цикл приходит одно значение по каждому параметру. Такой механизм нужен чтобы обрабатывать нестандартные ситуации. Например сбор только запустили и необходимо собрать данные с определенной метки времени, или был сбой связи с источником и продолжительное время не было возможности получать данные. Данные необходимо иметь в нашей базе 1:1, то есть пропускать значения нельзя , поэтому Ivan Durak , брать только последние значения нельзя. Или, как вариант, городить логику и обрабатывать пропуски отдельным потоком. Но в момент когда по одному из параметров прекращают приходить значения, получается что прекращает сдвигаться общий mytimestamp. Понятно дело что при каждом цикле опроса данных с mytimestamp до now становится по остальным параметрам все больше и больше. LSV , а вы бесплатно не консультируете? поэтому 60% ваших сообщений на этом форуме в разделе Просто треп? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 17:47 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
rdzviper, Я так понимаю есть две БД и вы их пытаетесь таким методом синхронизировать? Грубо говоря рабочая база и база для отчетов, т.е. из первой во вторую время от времени переливаем информацию 1:1? Если да то почему ненастроить реплику на уровне БД и незаниматься самобичеванием? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 19:39 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
нет, не 1:1 Для чего мы тогда делаем выборку по условиям? Расскажите мне как настроить репликацию из interbase или m$sql в oracle, например? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 09:55 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
rdzviperРасскажите мне как настроить репликацию из interbase или m$sql в oracle, например? Берётся репликатор, умеющий гетерогенную репликацию, читается документация, настраивается. Реплицировать Interbase->Oracle умеют IBPhoenix Replicator, DBReplicator. MS SQL->Oracle - Golden Gate или штатные Materialized View. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 11:11 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
rdzviperнет, не 1:1 Т.е. в базе 1 есть документ расхода, а в базу 2 нетянем его? Че-та я наверное туплю, или как-то так ... Для чего мы тогда делаем выборку по условиям? Собственно я незнаю, может вам так хочется... Расскажите мне как настроить репликацию из interbase или m$sql в oracle, например? Ну собственно ответ дали постом выше. Если это сделать разово то вероятно проще нанять кого-то и даже невникать в процесс. А если нужно будет постоянно что-то тягать, ну тогда наверное стоит затариться книжками и на недельку засесть за тестовый сервачок и тренироваться на кошках, так сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2012, 18:17 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Хотелось бы вернуться к исходному вопросу. Есть запрос, есть описанная проблема в частном случае при работе этого запроса. Может ли кто то подсказать, может пофантазировать даже, пути решения данной проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 10:04 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, кстати, чтобы отсечь разговоры в этом направлении, поиск по первому же продукту https://www.ibphoenix.com/shop/category/2 необходимо на 40 баз получать в среднем по 3 источника фанаты репликаторов могут на досуге заняться подсчетом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 10:08 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
rdzviper, вообще говоря timestamp это не дата, а просто уникальный номер изменения. Поэтому проблему можно решить достаточно просто. Вместо >= использовать > Поскольку номер изменения уникальный, ничего не потеряется. А уже прочитанные данные перестанут таскаться туда сюда. Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 10:32 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
уникальный в таблице, надо было добавить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 10:36 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
ах да, по этой же причине вот это: "После разбора ответа метка времени делается равной самому старому из последних значений пришедших параметров" тоже неправильно. Метку надо делать равной самому новому (большому) значению пришедшего timestamp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 11:03 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
rdzviper, А что приложение делает? Вообще обычно никаких циклов не делают, данные запрашивают по требованию пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 11:39 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
rdzviperМожет ли кто то подсказать, может пофантазировать даже, пути решения данной проблемы? У репликации, основанной на временных отметках только одна проблема: она совершенно неработоспособна в многопользовательском окружении. А то, что описано в первом сообщении это не проблема, а так - мелкий баг реализации изначально неработоспособного алгоритма. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 12:14 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovУ репликации, основанной на временных отметках только одна проблема: она совершенно неработоспособна в многопользовательском окружении. Вполне себе работоспособна. Делал года три назад для небольшой базы с сотней пользователей, все замечательно работает. Каждый пользователь сохраняет у себя max timestamp сервера на момент репликации, и при следующей репликации обновляется все, что больше сохраненного timestamp. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 12:29 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
VFlДелал года три назад для небольшой базы с сотней пользователей, все замечательно работает. Уверен? Сценарий: 1. Транзакция 1 меняет данные 2. Транзакция 2 меняет данные 3. Транзакция 2 коммитится 4. Транзакция 3 запускает репликационный запрос 5. Транзакция 1 коммитится. Всё, изменения транзакции 1 никогда не будет отреплицированы, поскольку их таймштамп меньше чем у уже отреплицированных изменений транзакции 2. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 12:33 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Сценарий: 1. Транзакция 1 меняет данные 2. Транзакция 2 меняет данные 3. Транзакция 2 коммитится 4. Транзакция 3 запускает репликационный запрос 5. Транзакция 1 коммитится. Я программирую и делаю дизайн базы по старинке, между открытием трансакции и commit / rollback проходят доли секунды, и изменяемые данные в это время не читаются. В том числе и репликацией, которая тоже ждет окончания трансакции (по этому поводу я даже сильно ругался на новый MS SQL Native Driver, который по умолчанию открывает трансакцию сразу после коннекта). Но это я отвлекся. У пользователя в локальной базе сохранен старый timestamp, для каждой таблицы. И без разницы, в какой последовательности коммитятся трансакции, полученные в таблице новые timestamp в измененных записях будут гарантированно больше, чем сохраненный у пользователя локально. Поэтому и данные реплицируются корректно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 12:50 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
VFlизменяемые данные в это время не читаются Эксклюзивная блокировка на всю таблицу? Да, в таком случае оно может работать. Как и при использовании Dirty Read. VFlУ пользователя в локальной базе сохранен старый timestamp, для каждой таблицы. В вышеприведённом сценарии какой именно это будет timestamp? Из шага 1,2 или 4? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 13:02 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
VFlDimitry SibiryakovСценарий: 1. Транзакция 1 меняет данные 2. Транзакция 2 меняет данные 3. Транзакция 2 коммитится 4. Транзакция 3 запускает репликационный запрос 5. Транзакция 1 коммитится. Я программирую и делаю дизайн базы по старинке, между открытием трансакции и commit / rollback проходят доли секунды, и изменяемые данные в это время не читаются. В том числе и репликацией, которая тоже ждет окончания трансакции (по этому поводу я даже сильно ругался на новый MS SQL Native Driver, который по умолчанию открывает трансакцию сразу после коннекта). Но это я отвлекся. У пользователя в локальной базе сохранен старый timestamp, для каждой таблицы. И без разницы, в какой последовательности коммитятся трансакции, полученные в таблице новые timestamp в измененных записях будут гарантированно больше, чем сохраненный у пользователя локально. Поэтому и данные реплицируются корректно. Я бы добавил пункт "четыре-с-половиной" - Транзакция 3 коммитится. И заблуждение сразу станет нагляднее. В этом случае в локальную базу будет помещен "последний timestamp", соотвествующий транзакции 2, который будет БОЛЬШЕ, чем у для еще незакоммиченной 1-ой транзакции. Без блокировок на всю голову таблицу система "меток времени" не работает. А с такими блокировками как-то плохо смотрится многопользовательская работа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 13:17 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЭксклюзивная блокировка на всю таблицу? Да, в таком случае оно может работать. Как и при использовании Dirty Read. Нет, обходится без блокировки. Репликация делает Код: sql 1. И если на таблице есть открытые трансакции с измененными данными, то такой селект становится в очередь и ждет, пока трансакции не завершатся. Dimitry SibiryakovВ вышеприведённом сценарии какой именно это будет timestamp? Из шага 1,2 или 4? Во время репликации каждой таблицы там находится Max(timestamp) этой таблицы. Полученное значение сохраняется в локальной базе в специальной таблице (поле типа bigint). И используется при следующей репликации как [сохраненный timestamp]. Т.е. не из шага 1,2 или 4, а из прошлой репликации. Которая делалась в момент без открытых трансакций. Есть конечно заморочки с удаленными и новыми данными, но они решаемы. Долго рассказывать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 13:20 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37811142&tid=1541657]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 194ms |
| total: | 429ms |

| 0 / 0 |
