Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 консистентное чтение из нескольких таблиц  [new]
valv
Member

Откуда:
Сообщений: 122
как прочитать из нескольких таблиц данные, консистентные на один и тот же момент времени? как бы срез во времени.
в ХП считываем по нескольку строк из постоянно изменяемых таблиц во временные таблицы, а затем работаем с этими временными таблицами. упрощенно это так:
insert into into #tb1 select a, b from tb1 where a = 1;
insert into into #tb2 select c, d from tb2 where c = 2;

первый селект из tb1 работает 120 ms,
за это время строки для второго селекта из tb2 изменяются,
данные неконсистентны.

ограничение: нельзя заблокировать таблицы на изменения;
например вот так работает правильно, но делать этого нельзя:
begin tran
update tb2 with (tablock) set с = с
...

все возможное для уменьшения времени чтения сделано.
БД SQL 2008 R2, snapshot read commited
4 мар 12, 15:49    [12191191]     Ответить | Цитировать Сообщить модератору
 Re: консистентное чтение из нескольких таблиц  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Посмотрите в сторону снапшотов
4 мар 12, 16:00    [12191222]     Ответить | Цитировать Сообщить модератору
 Re: консистентное чтение из нескольких таблиц  [new]
Crimean
Member

Откуда:
Сообщений: 13147
для снапшот ридед коммитед - надо читать все за 1 оператор. для "произвольного" согласованного чтения надо разрешать явный снапшот. тогда можно будет читать согласованно в несколько операторов. и не забывать открывать транзакцию
4 мар 12, 16:17    [12191281]     Ответить | Цитировать Сообщить модератору
 Re: консистентное чтение из нескольких таблиц  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Crimean
читать все за 1 оператор
Как я понимаю serializable даст тот же результат, а в частности и read commited может. При определённой структуре данных (кошерной).
При этом настроив правильно индексы - Можно удовлетворится и низким временем блокировки и консистентностью данных.

А в общем виде (на любой говно-базе) - согласен, тока снапы.
5 мар 12, 14:49    [12196555]     Ответить | Цитировать Сообщить модератору
 Re: консистентное чтение из нескольких таблиц  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Mnior
serializable даст тот же результат


если склероз не подводит, без снапшота - надо будет фейковый запрос в начале делать на все таблицы для согласованности
5 мар 12, 14:56    [12196632]     Ответить | Цитировать Сообщить модератору
 Re: консистентное чтение из нескольких таблиц  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Crimean
если склероз не подводит, без снапшота - надо будет фейковый запрос в начале делать на все таблицы для согласованности
Ну я основавыл рассуждения для "читать все за 1 оператор". Зачем для него ещё доп запросы?
Оператор сам по себе консистентен.
Serializable ставит
1. Диапазон блокировки, чтоб не пропустить вставки в середину
2. Держит на всё время запроса (транзакции)

Если нет диапазонов (чисто по ключам однострочно), и нет варинтов для возникновения фантомов, может и read commited подойти.
Всё равно заспрос на уровне всей логической строки то консистентен.
Если данные физически связаны, то блокировки на момент чтения не дадут менять данные.

Но если данные логически не связаны (это как?), то канечна только снапы.
Иначе база некошерна.
5 мар 12, 16:33    [12197651]     Ответить | Цитировать Сообщить модератору
 Re: консистентное чтение из нескольких таблиц  [new]
как вариант
Guest
valv,

если с одной стороны есть много пишуших запросов, а с другой много читающих, то наверно между ними должен появиться кто-то третий, олицетворяющий блокировку?
если, конечно, изменяемые данные можно как-то связать с читаемыми.
т.е. блокировать от записи только то что уже читается.
5 мар 12, 16:50    [12197881]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить