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

Откуда:
Сообщений: 105
Добрый день.
Вопрос может и очень простой, но не нашел на просторах интернета.
Может кто знает как ведет себя sql сервер когда сканирует таблицу.
Ситуация:
таблица из 30 записей, изменены в открытых транзакциях 10 записей, ищем запись не входящую в список этих 10 измененных, сервер сканирует таблицу. Возникнет ли блокировка при сканировании когда сервер наткнется на одну из измененных записей или он считает, удостоверится, что это не она и пойдет дальше сканировать?

надеюсь объяснил суть вопроса понятно.
2 июл 13, 17:55    [14512334]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
Александр Волок (def1983)
Member

Откуда: Rotterdam
Сообщений: 4959
В вашем случае, большая вероятность, что все записи окажутся на одной странице.

Но обратите внимание на:
ru bol
ROWLOCK
Указывает, что вместо блокировки страниц или таблиц применяются блокировки строк. При указании блокировок строк в транзакциях, выполняемых на уровне изоляции SNAPSHOT, они применяются только в случае, когда подсказка ROWLOCK используется в сочетании с другими табличными подсказками, требующими блокировки, например UPDLOCK или HOLDLOCK.
2 июл 13, 18:04    [14512416]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
edyaN
Member

Откуда: Berlin
Сообщений: 185
STsarionov,

прежде чем считать страницу с данными сервер попытается наложить на нее блокировку, и будет ждать пока ее не получит. В Вашем случае будет ждать, пока другие процессы не снимут блокировку.
Это так в общем случае, но есть ньюансы.
2 июл 13, 18:04    [14512417]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
STsarionov,

Для вашего случая специально придумали хинт READPAST.
2 июл 13, 18:16    [14512488]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
STsarionov
Member

Откуда:
Сообщений: 105
Хинты не могу использовать, т.к. запросы автоматически формируются из ERP. А вопрос был задан к тому, имеет ли смысл наплодить на таблице индексов, чтобы данные не сканировались, а велся поиск по индексу, чем исключить возможность наткнуться на блокировки при сканировании таблицы? Хотя с другой стороны, ведь даже при поиске по индексу вместо сканирования, в итоге сервер попытается перейти и считать страницу данных на которую указывает индекс.
Необходимо каким-то образом максимально не дать процессам обращаться к одной и той же странице данных.. или данные раскидать по разным страницам. Но пока еще не придумал как.
3 июл 13, 08:50    [14514004]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
STsarionov,

Возможно, вам подойдет опция базы read_committed_snapshot. Дешево, прозрачно, менять ничего не надо.
3 июл 13, 09:20    [14514150]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
STsarionov
Member

Откуда:
Сообщений: 105
Ennor Tiegael
STsarionov,

Возможно, вам подойдет опция базы read_committed_snapshot. Дешево, прозрачно, менять ничего не надо.


версии данных для этой транзакции ведь тогда будут храниться в tempdb, попробую, табличка маленькая. Просто проблема с tempdb, 300гб и те периодически переполняются в процессе работы.
3 июл 13, 09:43    [14514314]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
STsarionov
Member

Откуда:
Сообщений: 105
не подходит такой уровень изоляции, 20-30гб в одной транзакции, у меня в первые же минуты работы tempdb переполняется:(
может первичный ключ в таблице построить из guid, это не разнесет данные по разным страницам максимально?
3 июл 13, 09:58    [14514442]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
STsarionov,

RCSI нельзя включить для конкретной транзакции.
3 июл 13, 10:00    [14514457]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
STsarionov
Member

Откуда:
Сообщений: 105
STsarionov
не подходит такой уровень изоляции, 20-30гб в одной транзакции, у меня в первые же минуты работы tempdb переполняется:(
может первичный ключ в таблице построить из guid, это не разнесет данные по разным страницам максимально?


кластерный индекс имелось ввиду
3 июл 13, 10:02    [14514474]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
STsarionov,

У вас tempdb весит 300 гиг? Тогда я бы был поосторожнее, потому что эта опция - на всю БД, а не на отдельные таблицы.
3 июл 13, 10:03    [14514486]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
STsarionov
Member

Откуда:
Сообщений: 105
Ennor Tiegael
STsarionov,

У вас tempdb весит 300 гиг? Тогда я бы был поосторожнее, потому что эта опция - на всю БД, а не на отдельные таблицы.


да я уже протестил, отвалилось очень быстро:)
300гиг и ему еще мало, все на курсорах, средний размер курсора 500-600мб(есть наамного тяжелее), 200-300 потоков.. в общем вполне себе тяжелое все.
3 июл 13, 10:14    [14514562]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
STsarionov,

При таких объемах лучше всего будет обратиться к разработчику системы, чтобы он дал / предусмотрел возможность указания хинтов. Потому что READPAST все решит.
3 июл 13, 10:19    [14514601]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
STsarionov
Member

Откуда:
Сообщений: 105
Ennor Tiegael
STsarionov,

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


это аксапта, с ними не договориться, этот хинт она не поддерживает. Буду пытаться лобировать рефакторинг кода, чтобы эта таблица не была узким местом.
Спасибо за помощь.
3 июл 13, 14:30    [14516665]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
Denis Reznik
Member

Откуда: Киев
Сообщений: 156
STsarionov,

А всё-же, кластерный индекс пробовали построить? Для верности при создании индекса можно поставить опцию ALLOW_PAGE_LOCKS = OFF. Если я всё правильно понял, то должно помочь. При изменении данных будут блокироваться только те строки, которые изменяются. Если вы при этом будете запрашивать по условию те строки, которые не участвуют в транзакциях, то они вернутся без проблем.
3 июл 13, 21:21    [14519115]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
STsarionov
А вопрос был задан к тому, имеет ли смысл наплодить на таблице индексов, чтобы данные не сканировались, а велся поиск по индексу, чем исключить возможность наткнуться на блокировки при сканировании таблицы?
Было бы очень прикольно. Особенно в связи с тем что уже можно считывать "изменённые" данные теми же значениями, при определённых условиях.

STsarionov
ALLOW_PAGE_LOCKS = OFF. Если я всё правильно понял, то должно помочь. При изменении данных будут блокироваться только те строки, которые изменяются.
Ну это может даже всё и ухудшить. :)
В вашем случае очень даже вероятно.

Хинты и смена изоляции транзакции это чаще "не хочу решить проблему, продавлю хинтами" или "коряво спроектирована система".
Желательно чтобы вообще не был логический доступ к изменяемым данным.
Ехать на лошади в разные стороны?

Запишите логический смысл этих двух процессов (чтение и изменение одних и тех же данных) в терминах предметной области и всё становится очевидным. :)
3 июл 13, 23:52    [14519637]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Какие есть средства установления физических барьеров/границ для нормально логически разделённых данных?
* Логические условия
* Физически не связанные/разделённые сущности (атомы)

Физически разделяют строками и индексами (таблицами). (ну там ещё страницами и секциями - но это подводные камни реализации)
Упорядочивание - многоуровневое разделение атомарных групп строк - логическая гибкость.

К примеру логическое условие Filed > Const для процесса изменения и Filed < Const для чтения - не приведёт к конфликтам, на индексе.

Необходимое свойство - условие разделения должно находится за пределами изменяемых сущностей.
К примеру условие по другой (не изменяемой) таблице не будет подвержено негативному свойству изменения (локировки).
Столбец по идее также может быть физической границей, если он не изменяется в процессе и также отделён индексом (как "отдельная" таблица).

Изменение должно быть многоступенчатым (несколько сущностей с отношениями порядка) - для выставления барьеров.
На самом деле локировки/транзакции это и есть данный процесс. А блокировки говорят о нарушении принципов.

KO

PS: Версионность никак не обходит это физическое явление природы (цепи маркова), а использует немного другой механизм границ - время-место, и немного запутывает и скрывает проблемы.
Это легко понять осмыслив момент коммита в терминах предметной области по отношению к запросам "до" и "после".
4 июл 13, 00:33    [14519737]     Ответить | Цитировать Сообщить модератору
 Re: как работает механизм блокировок при сканировании таблицы  [new]
MSSQLBug
Guest
STsarionov,
Вообще-то Axapta поддерживает READPAST как минимум с 3.0, а может и раньше.
Задаётся методом Таблица.readPast(true).
4 июл 13, 12:44    [14521604]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить