Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Индекс, блокировка и вьюшка  [new]
Не важно
Guest
Здравствуйте. Есть таблицы: Table1(ID, Code, ClientCode) PK(ID,Code); Client(ID, Code) PK(ID) на таблице Table1 сделан индекс по ClientCode, которое ссылается на Client(Code).

Есть вьюшка MyView примерно такого вида:
Select t1.ID,t1.Code, t2.Pole, c.Code
from Table1 t1 
join  Table2 t2 on t1.ID=t2.ID with(Index(Table1_ClientCode))
join  Client c on t1.ClientCode=c.Code


на вьюшке стоит триггер на добавление/изменение/удаление:
вида:
Update Table1 set Code=i.Code from @Inserted i where i.ID=Table1.ID

В чем цимус:
беру двух пользователей и под обоими прытаюсь обновить вьюшку в транзакции:
begin tran
update MyView set Code=newid()
commit tran
так при одновременном запуске транзакций. юзеры лочат друг друга хотя обновляют разные данные (транзакция запускается как Repeatable Read)
Если убрать из вьюшки with(Index(Table1_ClientCode)) то обновления проходят гладко.
В чем может быть дело?
21 дек 09, 13:54    [8095465]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Не важно
Guest
Microsoft SQL Server 2000 - 8.00.2055 (Intel X86) Dec 16 2008 19:46:53 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
21 дек 09, 13:56    [8095479]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Не важно

так при одновременном запуске транзакций. юзеры лочат друг друга хотя обновляют разные данные (транзакция запускается как Repeatable Read)
Если убрать из вьюшки with(Index(Table1_ClientCode)) то обновления проходят гладко.
В чем может быть дело?

1. Почему вдруг они обновляют разные данные, если ни update, ни Select запросы у них не отличаются ?
2. Ну так уберите этот хинт
3. sp_lock/sp_who2/sys.sysprocesses помогут вам узнать причину
21 дек 09, 14:13    [8095624]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Не важно
Guest
Так и думал что транзакция
Почему вдруг они обновляют разные данные, если ни update, ни Select запросы у них не отличаются ?
Update отличаются - забыл прописать. А селект один

читать так:
Юзер1
begin tran
update MyView set Code=newid() where ID=1
commit tran

Юзер2
begin tran
update MyView set Code=newid() where ID=2
commit tran

Без хинта запрос резко проседает в перфомансе, иначе бы и вопрос не стоял ))

автор
sp_lock/sp_who2/sys.sysprocesses помогут вам узнать причину

на что там смотреть ?
21 дек 09, 14:24    [8095718]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Не важно
Guest
Псмотрел sp_who2
Там написано примерно так:
user1 "updating" blkby:57 SID: 55
user2 "awayting command" SID: 57

что я и без того видел, запустив запросы.

Таким образом вопрос о том, что каким макаром индекс во вьюхе может влиять на блокировку таблиц при апдейте остается открытым.
21 дек 09, 14:56    [8095988]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

>update MyView set Code=newid() where ID=1

при этом сначала сканируется Table1_ClientCode (индекс вы явно указали, а
по условию where ID=1 он может только сканироваться). с наложением U-блокировок
на каждую строку. разумеется, второй процесс оказывается заблокированным -
первый уже держит X-блокировку на измененном ключе.

ну, собственно, вот это вот и можно увидеть, если планы выполнения
посмотреть и sp_lock.

Posted via ActualForum NNTP Server 1.4

21 дек 09, 14:58    [8096007]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Glory
Member

Откуда:
Сообщений: 104760
user2 "awayting command" SID: 57

И почему user2 не завершает транзакцию ?
21 дек 09, 14:58    [8096008]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Не важно
Guest
Экран и мои глаза говорят, что с директивой with(Index(Table1_ClientCode)) при апдейте накладывается блокировка уровня таблицы, а без него уровня строк. Но какая тут взаимосвязь - неясно
21 дек 09, 14:59    [8096020]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Не важно
Guest
Я не поставил Commit Tran. В реальности в транзакции происходит еще несколько апдейтов. А вообще цель этого маневра получить ситуацию, когда юзер пытается обновить запись, в тот момент когда другой юзер обновляет другие строки в этой же таблице.

Ясно что табличная блокировка при апдейте это явно не есть гут, осталось понять почему это происходит
21 дек 09, 15:02    [8096052]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Не важно
Я не поставил Commit Tran. В реальности в транзакции происходит еще несколько апдейтов. А вообще цель этого маневра получить ситуацию, когда юзер пытается обновить запись, в тот момент когда другой юзер обновляет другие строки в этой же таблице.

Ясно что табличная блокировка при апдейте это явно не есть гут, осталось понять почему это происходит

Причина ясна
При Repeatable Read сервер блокирует все, что читает. А раз планы запросов разные, то и блокировки разные.
21 дек 09, 15:05    [8096092]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Не важно
Guest
to daw:
Спасибо. чтото стало проясняться.

Glory
При Repeatable Read сервер блокирует все, что читает.

А разве он не построчные разделяемые блокировки накладывает. Он же не лечит "фантомное чтение" О_о
Без Repeatable Read та же петрушка.

Glory

Причина ясна. А раз планы запросов разные, то и блокировки разные.

Почему они должны быть разными? Не могу щас проверить, но я вот не вижу, из чего вытекает разность планов выполения двух одинаковых апдейтов.
21 дек 09, 15:13    [8096166]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Не важно

Glory

Причина ясна. А раз планы запросов разные, то и блокировки разные.

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

А вы думаете, что блокировки начинаются только внутри вашего триггера что ли ???
21 дек 09, 15:58    [8096567]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Не важно
Guest
А вы думаете, что блокировки начинаются только внутри вашего триггера что ли ???

Нет, но я к тому что в данном случае этот момент, по моему мнению, не принципиален.
я запускал запрос на тестовом сервере, где был только я и транзакция была сугубо такая:
begin tran
update MyView set Code=newid() where ID=2
commit tran
так что сторонним блокировкам там взяться неоткуда
21 дек 09, 17:16    [8097284]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Не важно
А вы думаете, что блокировки начинаются только внутри вашего триггера что ли ???

Нет, но я к тому что в данном случае этот момент, по моему мнению, не принципиален.
я запускал запрос на тестовом сервере, где был только я и транзакция была сугубо такая:
begin tran
update MyView set Code=newid() where ID=2
commit tran
так что сторонним блокировкам там взяться неоткуда

Дело не в сторонних блокировках. А втом, что перед update MyView where ID=2 серверу нужно сделать select MyView where ID=2. А с разными хинтами этот запрос будет выполняться по-разному
21 дек 09, 17:19    [8097310]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
Не важно
Guest
Скажите как можно побороть? я сейчас в некоем тупике. Без хинта запрос уходит в даун секунд на 20, но зато все обновляется. с хинтом все работает за 0,1 но стопорятся обновления.

Как то можно пнуть 2000 сервер под задницу, чтобы он увидел оптимальный план запроса?
24 дек 09, 13:18    [8112852]     Ответить | Цитировать Сообщить модератору
 Re: Индекс, блокировка и вьюшка  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Не важно,

пнуть сиквел можно только "правильным" запросом:)
24 дек 09, 13:48    [8113100]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить