|
|
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. Это я конечно схематично показал, самому смешно стало. Делается через курсор, и Max TIMESTAMP находится в процессе обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 13:24 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
tanglirа если транзакция 1 уже открыта, но ещё не успела изменить данные? Тогда блокировки еще нет, и селект отрабатывает. Но и timestamp после коммита трансакции 1 будет больше, чем максимальный в данных селекта. Изменения, которые сделала транзакция 1 будут замечены в следующей репликации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 13:28 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
VFlселект становится в очередь и ждет, пока трансакции не завершатся. А с чего бы ему становиться в очередь-то?.. Писатели не блокируют читателей. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 13:38 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovПисатели не блокируют читателейа тут, похоже, блокируют, из-за чего репликация правильно и работает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 13:46 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovПисатели не блокируют читателей. Вообще зависит от TRANSACTION ISOLATION LEVEL. READ COMMITED блокирует измененные записи на чтение, пока не произведен COMMIT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 13:47 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
VFlREAD COMMITED блокирует измененные записи на чтение, пока не произведен COMMIT Какой-то это неправильный READ COMMITTED. Это скорее NOREAD COMMITTED... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 13:49 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovКакой-то это неправильный READ COMMITTED. Это скорее NOREAD COMMITTED... Меня помнится тоже поначалу удивляло :) Но вообще логично - "читать закоммитенные данные". Т.е. не закоммитенные не читаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 13:52 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
VFltanglirа если транзакция 1 уже открыта, но ещё не успела изменить данные? Тогда блокировки еще нет, и селект отрабатывает. Но и timestamp после коммита трансакции 1 будет больше, чем максимальный в данных селекта. Изменения, которые сделала транзакция 1 будут замечены в следующей репликации. А если до коммита 1-ой (все-таки меняющей данные) транзакции пройдет коммит еще надцати других меняющих и реплицирующих транзакций? НЕ РАБОТАЕТ! Кроме клинического случая с "грязным чтением". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 14:05 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
sphinx_mvА если до коммита 1-ой (все-таки меняющей данные) транзакции пройдет коммит еще надцати других меняющих и реплицирующих транзакций? НЕ РАБОТАЕТ! Кроме клинического случая с "грязным чтением". 1. SELECT на репликацию проходит только если нет открытых трансакций с измененными данными. 2. Max(timestamp) SELECTа на репликацию сохраняется локально на клиенте, который делает репликацию. 3. Любые изменения после прохождения SELECTа на репликацию (неважно от скольких трансакций) имеют как следствие увеличение timestamp по сревнению с полученным SELECTом на репликацию Max(timestamp). И поэтому отлавливаются следующей репликацией. 4. РАБОТАЕТ! уже больше 3 лет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 14:18 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
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. Без блокировок ТАБЛИЧНОГО уровня для пишуших транзакций - НЕ РАБОТАЕТ. Даже для серверов-"блокировочников". Либо у Вас система НЕ-МНОГОПОЛЬЗОВАТЕЛЬСКАЯ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 14:37 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
sphinx_mvесли до коммита 1-ой (все-таки меняющей данные) транзакции пройдет коммит еще надцати других меняющих и реплицирующих транзакций? Технически не сможет пройти. У VFI жёсткий блокировочник. Пока транзакция 1 не закоммитится, остальные будут нервно курить в очереди. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 14:38 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
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 клиентов с локальными копиями, каждый раз в пару дней делает репликации. База небольшая, как я уже писал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 15:13 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
VFlSELECT ждет коммита на измененные данные Чисто теоретически и в этом случае можно получить пропуск изменений в больших таблицах, но вероятность ничтожна. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 15:17 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovsphinx_mvесли до коммита 1-ой (все-таки меняющей данные) транзакции пройдет коммит еще надцати других меняющих и реплицирующих транзакций? Технически не сможет пройти. У VFI жёсткий блокировочник. Пока транзакция 1 не закоммитится, остальные будут нервно курить в очереди. Если уровень изоляции не serializable , технически может пройти даже на "жестком блокировочнике". И даже этот самый строгий уровень изоляции не гарантирует, что будут заблокированы ВСЕ записи в таблице - актуально для запросов с критериями отбора (как в обсуждаемом случае). Соотвественно на непересекающихся наборах записей одновременные транзации вполне себе могут ужиться, не мешая друг другу... Однако при таком уровне изоляции говорить о нормальной работе "десятков" (не говоря уже о "сотнях" и "тысячах") пользователей, часто меняющих данные, становится практически невозможно - система начнет "умирать" уже на "единицах"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 15:25 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
sphinx_mvИ даже этот самый строгий уровень изоляции не гарантирует, что будут заблокированы ВСЕ записи в таблице - актуально для запросов с критериями отбора (как в обсуждаемом случае). Соотвественно на непересекающихся наборах записей одновременные транзации вполне себе могут ужиться, не мешая друг другу... Кстати тут как раз все "чисто". Критерий в SELECTе один - на timestamp, а он меняется гарантированно при любом изменении записи. И SELECT попадает на блокировку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 15:32 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
дополнение: Критерий в SELECTе один - на timestamp, а он меняется гарантированно при любом изменении записи так, что измененная запись попадает в выбоку SELECTа . И SELECT попадает на блокировку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 15:43 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
VFlКритерий в SELECTе один - на timestamp Это поле проиндексировано? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 15:56 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
В больших таблицах проиндексированно. Сейчас заглянул в лог репликации, последние 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 через мобильную связь. Это было кстати условием - короткая репликация с плохой связью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 16:09 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
VFlВ больших таблицах проиндексированно. При отсутствии индекса может быть возможен следующий вариант: 1. Репликационный запрос читает первую страницу из трёх 2. На второй он останавливается, ожидая окончания параллельного апдейта 3. Апдейт записи на первой странице 4. Апдейт записи на третьей странице 5. Вторая страница освобождается, запрос получает timestamp из записи на третьей странице, который больше чем у записи из п.3 на первой. Запись с первой страницы выпадает из поля зрения. При наличии индекса, такое, вроде бы, невозможно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 16:27 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov 1. Репликационный запрос читает первую страницу из трёх 2. На второй он останавливается, ожидая окончания параллельного апдейта 3. Апдейт записи на первой странице 4. Апдейт записи на третьей странице 5. Вторая страница освобождается, запрос получает timestamp из записи на третьей странице, который больше чем у записи из п.3 на первой. Запись с первой страницы выпадает из поля зрения. При наличии индекса, такое, вроде бы, невозможно. Хм.. Теоретически наверно это возможно. Хотя с моей точки зрения это был бы баг в SQL Server. Надо будет прошерстить таблицы. Я давно в эту базу не заглядывал, не было поводов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2012, 16:37 |
|
||
|
Оптимизация запроса выборки данных из базы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЧисто теоретически и в этом случае можно получить пропуск изменений в больших таблицах, но вероятность ничтожна. У нас в базах нету апдейта. Тем не менее значения по каждому из параметров пишутся разными транзакциями, асинхронно, и, может быть с разным отставанием от текущего времени. Поэтому, в отличии от VFl , мы помним метку времени по каждому параметру. Пропусков никогда не было при штатной работе, проверялось неоднократно. Ещё бы, при отставании по одному из параметров, мы значения остальных неоднократо перечитываем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2012, 11:16 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37811561&tid=1541657]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
150ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 203ms |
| total: | 462ms |

| 0 / 0 |
