powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Оптимизация запроса выборки данных из базы
46 сообщений из 46, показаны все 2 страниц
Оптимизация запроса выборки данных из базы
    #37793637
rdzviper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день

Вопрос по конструированию запросов.
Есть база источника данных, из нее запрашиваются значения по параметрам.
Значения лежат в одной таблице, в ней есть ключи какому параметру принадлежит значение, а так же метка времени, за которое это значение было.
Цикл опроса работает следующим образом:
В источник делается запрос с указанием ключей соответствующих параметров и меткой времени, с какой возвращать значения.
После разбора ответа метка времени делается равной самому старому из последних значений пришедших параметров.

У этого метода есть минус:
Когда прекращают обновляться значению по одному или нескольким параметрам-прекращает сдвигаться метка времени запроса.
Таким образом ответ с каждой итерацией растет, приходят значения которые нам уже не нужны, потому что мы их прочитали и вообще общая производительность падает.

Вроде понятно изложил. Кто может подсказать как оптимизировать алгоритм чтобы бороться с подобными ситуациями?
Первое что приходит на ум - делать запрос по каждому из параметров. Но это мало производительно при большом объеме получаемых параметров.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37793655
neoddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdzviperДобрый день

...

Вроде понятно изложил.

Ничего не понятно (мне)
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37793931
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdzviper,

В общем бред какой-то. Если речь идет о чтении данных - читайте по нужному периоду. При чем тут какой-то сдвиг метки?.. Что за сдвиг... В общем пост ниочем. Или разжевывайте как для идиотов, или сами думайте.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37794276
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Есть база источника данных, из нее запрашиваются значения по параметрам .
>В источник делается запрос с указанием ключей соответствующих параметров и меткой времени, с какой возвращать значения.
То есть типа такого
Код: sql
1.
2.
3.
select value from tabel
 where <куча условий на параметры>
  and ts>=:mytimestamp

?

>После разбора ответа метка времени делается равной самому старому из последних значений пришедших параметров.
"метка времени" где "делается равной ..."? у вас есть вторая таблица с метками времени, неким образом связанных с чем-то из исходной таблицы, или как?

>Когда прекращают обновляться значению по одному или нескольким параметрам-прекращает сдвигаться метка времени запроса.
>Таким образом ответ с каждой итерацией растет, приходят значения которые нам уже не нужны, потому что мы их прочитали и вообще общая производительность падает.
Почему он растёт, если нет обновлений --> нет новых записей?
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37794534
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdzviper,
Если вам нужны актуальные параметры? Так берите самые последние по времени и все
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37794593
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде понятно изложил. Кто может подсказать как оптимизировать алгоритм ?Нанять программиста ? :)
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37804520
rdzviper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, извиняюсь что долго не отвечал, уезжал на внедрение.

Думал что объяснить "на пальцах будет понятнее".


tanglir совершенно верно разобрался в алгоритме

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

Затем делается запрос, образно говоря
Код: sql
1.
2.
3.
select value from tabel
 where  parameter in [список id необходимых параметров]
  and ts>=:mytimestamp



Приходит ответ. Пришедшие значения укладываются в базу, обновляются метки времени, цикл запускается заново.

В идеальной ситуации, когда период чтения равен периоду появления одного значения по каждому параметру, в один цикл приходит одно значение по каждому параметру.

Такой механизм нужен чтобы обрабатывать нестандартные ситуации. Например сбор только запустили и необходимо собрать данные с определенной метки времени, или был сбой связи с источником и продолжительное время не было возможности получать данные. Данные необходимо иметь в нашей базе 1:1, то есть пропускать значения нельзя , поэтому Ivan Durak , брать только последние значения нельзя. Или, как вариант, городить логику и обрабатывать пропуски отдельным потоком.

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

LSV , а вы бесплатно не консультируете? поэтому 60% ваших сообщений на этом форуме в разделе Просто треп? ;)
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37804675
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdzviper,

Я так понимаю есть две БД и вы их пытаетесь таким методом синхронизировать? Грубо говоря рабочая база и база для отчетов, т.е. из первой во вторую время от времени переливаем информацию 1:1? Если да то почему ненастроить реплику на уровне БД и незаниматься самобичеванием?
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37809053
rdzviper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет, не 1:1
Для чего мы тогда делаем выборку по условиям?
Расскажите мне как настроить репликацию из interbase или m$sql в oracle, например?
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37809248
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdzviperРасскажите мне как настроить репликацию из interbase или m$sql в oracle, например?

Берётся репликатор, умеющий гетерогенную репликацию, читается документация, настраивается.
Реплицировать Interbase->Oracle умеют IBPhoenix Replicator, DBReplicator. MS SQL->Oracle -
Golden Gate или штатные Materialized View.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37810400
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdzviperнет, не 1:1 Т.е. в базе 1 есть документ расхода, а в базу 2 нетянем его? Че-та я наверное туплю, или как-то так ...
Для чего мы тогда делаем выборку по условиям? Собственно я незнаю, может вам так хочется...
Расскажите мне как настроить репликацию из interbase или m$sql в oracle, например? Ну собственно ответ дали постом выше. Если это сделать разово то вероятно проще нанять кого-то и даже невникать в процесс. А если нужно будет постоянно что-то тягать, ну тогда наверное стоит затариться книжками и на недельку засесть за тестовый сервачок и тренироваться на кошках, так сказать.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811006
rdzviper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотелось бы вернуться к исходному вопросу.
Есть запрос, есть описанная проблема в частном случае при работе этого запроса.
Может ли кто то подсказать, может пофантазировать даже, пути решения данной проблемы?
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811012
rdzviper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

кстати, чтобы отсечь разговоры в этом направлении, поиск по первому же продукту
https://www.ibphoenix.com/shop/category/2
необходимо на 40 баз получать в среднем по 3 источника

фанаты репликаторов могут на досуге заняться подсчетом
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811072
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdzviper,

вообще говоря timestamp это не дата, а просто уникальный номер изменения. Поэтому проблему можно решить достаточно просто. Вместо >= использовать >

Поскольку номер изменения уникальный, ничего не потеряется. А уже прочитанные данные перестанут таскаться туда сюда.


Код: sql
1.
2.
3.
select value from tabel
 where  parameter in [список id необходимых параметров]
  and ts>:mytimestamp
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811080
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уникальный в таблице, надо было добавить.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811142
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ах да, по этой же причине вот это:

"После разбора ответа метка времени делается равной самому старому из последних значений пришедших параметров"

тоже неправильно. Метку надо делать равной самому новому (большому) значению пришедшего timestamp
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811209
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdzviper,

А что приложение делает?
Вообще обычно никаких циклов не делают, данные запрашивают по требованию пользователя.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811300
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdzviperМожет ли кто то подсказать, может пофантазировать даже, пути решения данной проблемы?

У репликации, основанной на временных отметках только одна проблема: она совершенно
неработоспособна в многопользовательском окружении. А то, что описано в первом сообщении
это не проблема, а так - мелкий баг реализации изначально неработоспособного алгоритма.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811339
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovУ репликации, основанной на временных отметках только одна проблема: она совершенно
неработоспособна в многопользовательском окружении.


Вполне себе работоспособна. Делал года три назад для небольшой базы с сотней пользователей, все замечательно работает. Каждый пользователь сохраняет у себя max timestamp сервера на момент репликации, и при следующей репликации обновляется все, что больше сохраненного timestamp.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811348
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFlДелал года три назад для небольшой базы с сотней пользователей, все замечательно работает.

Уверен?

Сценарий:
1. Транзакция 1 меняет данные
2. Транзакция 2 меняет данные
3. Транзакция 2 коммитится
4. Транзакция 3 запускает репликационный запрос
5. Транзакция 1 коммитится.

Всё, изменения транзакции 1 никогда не будет отреплицированы, поскольку их таймштамп
меньше чем у уже отреплицированных изменений транзакции 2.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811381
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Сценарий:
1. Транзакция 1 меняет данные
2. Транзакция 2 меняет данные
3. Транзакция 2 коммитится
4. Транзакция 3 запускает репликационный запрос
5. Транзакция 1 коммитится.



Я программирую и делаю дизайн базы по старинке, между открытием трансакции и commit / rollback проходят доли секунды, и изменяемые данные в это время не читаются. В том числе и репликацией, которая тоже ждет окончания трансакции (по этому поводу я даже сильно ругался на новый MS SQL Native Driver, который по умолчанию открывает трансакцию сразу после коннекта). Но это я отвлекся.

У пользователя в локальной базе сохранен старый timestamp, для каждой таблицы. И без разницы, в какой последовательности коммитятся трансакции, полученные в таблице новые timestamp в измененных записях будут гарантированно больше, чем сохраненный у пользователя локально. Поэтому и данные реплицируются корректно.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811410
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFlизменяемые данные в это время не читаются

Эксклюзивная блокировка на всю таблицу? Да, в таком случае оно может работать. Как и при
использовании Dirty Read.

VFlУ пользователя в локальной базе сохранен старый timestamp, для каждой таблицы.

В вышеприведённом сценарии какой именно это будет timestamp? Из шага 1,2 или 4?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811453
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFlDimitry SibiryakovСценарий:
1. Транзакция 1 меняет данные
2. Транзакция 2 меняет данные
3. Транзакция 2 коммитится
4. Транзакция 3 запускает репликационный запрос
5. Транзакция 1 коммитится.



Я программирую и делаю дизайн базы по старинке, между открытием трансакции и commit / rollback проходят доли секунды, и изменяемые данные в это время не читаются. В том числе и репликацией, которая тоже ждет окончания трансакции (по этому поводу я даже сильно ругался на новый MS SQL Native Driver, который по умолчанию открывает трансакцию сразу после коннекта). Но это я отвлекся.

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

Я бы добавил пункт "четыре-с-половиной" - Транзакция 3 коммитится. И заблуждение сразу станет нагляднее.
В этом случае в локальную базу будет помещен "последний timestamp", соотвествующий транзакции 2, который будет БОЛЬШЕ, чем у для еще незакоммиченной 1-ой транзакции.
Без блокировок на всю голову таблицу система "меток времени" не работает. А с такими блокировками как-то плохо смотрится многопользовательская работа.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811463
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЭксклюзивная блокировка на всю таблицу? Да, в таком случае оно может работать. Как и при
использовании Dirty Read.


Нет, обходится без блокировки. Репликация делает

Код: sql
1.
SELECT Max(Table.TIMESTAMP), * FROM Server.dbo.Table AS Table WHERE Table.TIMESTAMP > :[сохраненный timestamp]



И если на таблице есть открытые трансакции с измененными данными, то такой селект становится в очередь и ждет, пока трансакции не завершатся.


Dimitry SibiryakovВ вышеприведённом сценарии какой именно это будет timestamp? Из шага 1,2 или 4?


Во время репликации каждой таблицы там находится Max(timestamp) этой таблицы. Полученное значение сохраняется в локальной базе в специальной таблице (поле типа bigint). И используется при следующей репликации как [сохраненный timestamp]. Т.е. не из шага 1,2 или 4, а из прошлой репликации. Которая делалась в момент без открытых трансакций. Есть конечно заморочки с удаленными и новыми данными, но они решаемы. Долго рассказывать :)
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811472
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFlесли на таблице есть открытые трансакции с измененными даннымиа если транзакция 1 уже открыта, но ещё не успела изменить данные?
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811479
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
SELECT Max(Table.TIMESTAMP), * FROM Server.dbo.Table AS Table WHERE Table.TIMESTAMP > :[сохраненный timestamp]



Это я конечно схематично показал, самому смешно стало. Делается через курсор, и Max TIMESTAMP находится в процессе обработки.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811486
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirа если транзакция 1 уже открыта, но ещё не успела изменить данные?

Тогда блокировки еще нет, и селект отрабатывает. Но и timestamp после коммита трансакции 1 будет больше, чем максимальный в данных селекта. Изменения, которые сделала транзакция 1 будут замечены в следующей репликации.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811517
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFlселект становится в очередь и ждет, пока трансакции не завершатся.

А с чего бы ему становиться в очередь-то?.. Писатели не блокируют читателей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811539
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПисатели не блокируют читателейа тут, похоже, блокируют, из-за чего репликация правильно и работает :)
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811543
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПисатели не блокируют читателей.


Вообще зависит от TRANSACTION ISOLATION LEVEL. READ COMMITED блокирует измененные записи на чтение, пока не произведен COMMIT
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811550
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFlREAD COMMITED блокирует измененные записи на чтение, пока не произведен COMMIT

Какой-то это неправильный READ COMMITTED. Это скорее NOREAD COMMITTED...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811561
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКакой-то это неправильный READ COMMITTED. Это скорее NOREAD COMMITTED...


Меня помнится тоже поначалу удивляло :) Но вообще логично - "читать закоммитенные данные". Т.е. не закоммитенные не читаются.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811591
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFltanglirа если транзакция 1 уже открыта, но ещё не успела изменить данные?

Тогда блокировки еще нет, и селект отрабатывает. Но и timestamp после коммита трансакции 1 будет больше, чем максимальный в данных селекта. Изменения, которые сделала транзакция 1 будут замечены в следующей репликации.
А если до коммита 1-ой (все-таки меняющей данные) транзакции пройдет коммит еще надцати других меняющих и реплицирующих транзакций?
НЕ РАБОТАЕТ!
Кроме клинического случая с "грязным чтением".
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811628
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvА если до коммита 1-ой (все-таки меняющей данные) транзакции пройдет коммит еще надцати других меняющих и реплицирующих транзакций?
НЕ РАБОТАЕТ!
Кроме клинического случая с "грязным чтением".

1. SELECT на репликацию проходит только если нет открытых трансакций с измененными данными.
2. Max(timestamp) SELECTа на репликацию сохраняется локально на клиенте, который делает репликацию.
3. Любые изменения после прохождения SELECTа на репликацию (неважно от скольких трансакций) имеют как следствие увеличение timestamp по сревнению с полученным SELECTом на репликацию Max(timestamp). И поэтому отлавливаются следующей репликацией.
4. РАБОТАЕТ! уже больше 3 лет :)
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811680
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFlsphinx_mvА если до коммита 1-ой (все-таки меняющей данные) транзакции пройдет коммит еще надцати других меняющих и реплицирующих транзакций?
НЕ РАБОТАЕТ!
Кроме клинического случая с "грязным чтением".

1. SELECT на репликацию проходит только если нет открытых трансакций с измененными данными.
2. Max(timestamp) SELECTа на репликацию сохраняется локально на клиенте, который делает репликацию.
3. Любые изменения после прохождения SELECTа на репликацию (неважно от скольких трансакций) имеют как следствие увеличение timestamp по сревнению с полученным SELECTом на репликацию Max(timestamp). И поэтому отлавливаются следующей репликацией.
4. РАБОТАЕТ! уже больше 3 лет :)

1. И кто же его запретит сделать? И как Вы узнаете, что открытые транзакции не успели изменили данные после момента любой такой проверки?
2. timestamp фиксируется в исходной таблице по UPDATE, а не по COMMIT. Если на сервере больше одного "пишушего" коннекта, НИКТО не гарантирует, что они коммитятся именно в порядке нарастания timestamp. И соответственно, совершенно никакой гарантии что именно в порядке нарастания timestamp данные будут реплицированы на получателя.
3. Ваш MAX(timestamp) на получателе НЕ ВИДИТ timestamp незакоммиченных и тем более не прореплицированных записей из исходной базы данных. Из п.2. напрямую следует НАРУШЕНИЕ порядка нарастания значения MAX(timestamp) на основе данных получателя.
4. Без блокировок ТАБЛИЧНОГО уровня для пишуших транзакций - НЕ РАБОТАЕТ. Даже для серверов-"блокировочников".
Либо у Вас система НЕ-МНОГОПОЛЬЗОВАТЕЛЬСКАЯ.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811684
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvесли до коммита 1-ой (все-таки меняющей данные) транзакции пройдет коммит еще надцати
других меняющих и реплицирующих транзакций?

Технически не сможет пройти. У VFI жёсткий блокировочник. Пока транзакция 1 не
закоммитится, остальные будут нервно курить в очереди.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811784
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mv1. И кто же его запретит сделать? И как Вы узнаете, что открытые транзакции не успели изменили данные после момента любой такой проверки?


Как вам правильно написали, сервер сам не даст сделать SELECT, если существуют открытые трансакции с измененными данными.
SET TRANSACTION ISOLATION LEVEL READ COMMITED в коннекте на репликацию, и SELECT ждет коммита на измененные данные. Это блокировка на чтение измененных и незакоммиченых данных. Речь идет о MS SQL Server, если что.


sphinx_mv2. timestamp фиксируется в исходной таблице по UPDATE, а не по COMMIT. Если на сервере больше одного "пишушего" коннекта, НИКТО не гарантирует, что они коммитятся именно в порядке нарастания timestamp. И соответственно, совершенно никакой гарантии что именно в порядке нарастания timestamp данные будут реплицированы на получателя.


нас в данном случае совершенно не интересует порядок UPDATE и COMMIT, которые будут произведенв после SELECTа на репликацию. Потому что см. выше - нет измененных данных без коммита на момент SELECTa.


sphinx_mv3. Ваш MAX(timestamp) на получателе НЕ ВИДИТ timestamp незакоммиченных и тем более не прореплицированных записей из исходной базы данных. Из п.2. напрямую следует НАРУШЕНИЕ порядка нарастания значения MAX(timestamp) на основе данных получателя.


еще раз - нет измененных данных без коммита на момент SELECTa. Все timestamp на момент SELECTа актуальные - или закоммитенные, или без изменения с момента открытия трансакции. Все что случится после SELECTa приведет к увеличению timestamp по сравнению с полученным SELECTом.


sphinx_mv4. Без блокировок ТАБЛИЧНОГО уровня для пишуших транзакций - НЕ РАБОТАЕТ. Даже для серверов-"блокировочников".
Либо у Вас система НЕ-МНОГОПОЛЬЗОВАТЕЛЬСКАЯ.


Блокировок ТАБЛИЧНОГО уровня нет, есть блокировка на чтение измененных записей в трансакции. Система многопользовательская, в среднем около 10 пользователей единомоментно непосредственно работают на сервере и около 100 клиентов с локальными копиями, каждый раз в пару дней делает репликации. База небольшая, как я уже писал.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811806
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFlSELECT ждет коммита на измененные данные

Чисто теоретически и в этом случае можно получить пропуск изменений в больших таблицах, но
вероятность ничтожна.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811836
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovsphinx_mvесли до коммита 1-ой (все-таки меняющей данные) транзакции пройдет коммит еще надцати
других меняющих и реплицирующих транзакций?

Технически не сможет пройти. У VFI жёсткий блокировочник. Пока транзакция 1 не
закоммитится, остальные будут нервно курить в очереди.

Если уровень изоляции не serializable , технически может пройти даже на "жестком блокировочнике".
И даже этот самый строгий уровень изоляции не гарантирует, что будут заблокированы ВСЕ записи в таблице - актуально для запросов с критериями отбора (как в обсуждаемом случае). Соотвественно на непересекающихся наборах записей одновременные транзации вполне себе могут ужиться, не мешая друг другу...
Однако при таком уровне изоляции говорить о нормальной работе "десятков" (не говоря уже о "сотнях" и "тысячах") пользователей, часто меняющих данные, становится практически невозможно - система начнет "умирать" уже на "единицах"...
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811870
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvИ даже этот самый строгий уровень изоляции не гарантирует, что будут заблокированы ВСЕ записи в таблице - актуально для запросов с критериями отбора (как в обсуждаемом случае). Соотвественно на непересекающихся наборах записей одновременные транзации вполне себе могут ужиться, не мешая друг другу...



Кстати тут как раз все "чисто". Критерий в SELECTе один - на timestamp, а он меняется гарантированно при любом изменении записи. И SELECT попадает на блокировку.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811904
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дополнение: Критерий в SELECTе один - на timestamp, а он меняется гарантированно при любом изменении записи так, что измененная запись попадает в выбоку SELECTа . И SELECT попадает на блокировку.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811951
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFlКритерий в SELECTе один - на timestamp
Это поле проиндексировано?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37811998
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В больших таблицах проиндексированно. Сейчас заглянул в лог репликации, последние 2 длительность:

начало репл. конец репл.
25.05.2012 12:10:36 25.05.2012 12:15:51
25.05.2012 11:36:07 25.05.2012 11:47:10


база 1,5 гига. Так что мне кажется неплохо 5-10 мин. С учетом того, что интернет у client через мобильную связь. Это было кстати условием - короткая репликация с плохой связью.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37812054
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFlВ больших таблицах проиндексированно.
При отсутствии индекса может быть возможен следующий вариант:

1. Репликационный запрос читает первую страницу из трёх
2. На второй он останавливается, ожидая окончания параллельного апдейта
3. Апдейт записи на первой странице
4. Апдейт записи на третьей странице
5. Вторая страница освобождается, запрос получает timestamp из записи на третьей странице,
который больше чем у записи из п.3 на первой. Запись с первой страницы выпадает из поля
зрения.

При наличии индекса, такое, вроде бы, невозможно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37812094
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
1. Репликационный запрос читает первую страницу из трёх
2. На второй он останавливается, ожидая окончания параллельного апдейта
3. Апдейт записи на первой странице
4. Апдейт записи на третьей странице
5. Вторая страница освобождается, запрос получает timestamp из записи на третьей странице,
который больше чем у записи из п.3 на первой. Запись с первой страницы выпадает из поля
зрения.

При наличии индекса, такое, вроде бы, невозможно.


Хм.. Теоретически наверно это возможно. Хотя с моей точки зрения это был бы баг в SQL Server. Надо будет прошерстить таблицы. Я давно в эту базу не заглядывал, не было поводов.
...
Рейтинг: 0 / 0
Оптимизация запроса выборки данных из базы
    #37815887
rdzviper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovЧисто теоретически и в этом случае можно получить пропуск изменений в больших таблицах, но
вероятность ничтожна.


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

Пропусков никогда не было при штатной работе, проверялось неоднократно. Ещё бы, при отставании по одному из параметров, мы значения остальных неоднократо перечитываем.
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Оптимизация запроса выборки данных из базы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]