Переключение на Главную Страницу Страницы: 1 2 3 [4]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите новичку.. Проблема с запросом. (число прочтений - 19181 )
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Помогите новичку.. Проблема с запросом.
Ответ #45 - 05. Декабря 2008 :: 07:10
Печать  
Цитата:
вы мне мозг разрушили


Ничего, разрушение всегда способствует новому созиданию  Смех
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите новичку.. Проблема с запросом.
Ответ #46 - 08. Декабря 2008 :: 07:38
Печать  
Neo писал(а) 04. Декабря 2008 :: 14:40:
Цитата:
в первом qa пишем
begin tran
update ra... set  lineno_ = lineno_ + 1

в другом qa пишем
select top 100 * from ra...
то второй qa зависнет.


Это понятно, так как при апдейте блокировка всегда накладывается.

А вот если наоборот: в одном qa запустить select * from ra, а во втором - попробовать проапдейтить, интересно, что будет  Улыбка

Если select то и ничего не будет
ДАвай расмотрим ситуации
1. update ra .... where только одна запись.
update вне транзакции.
На время выполнения update создается неявная транзакция
с эклюзивной блокировкой на строку ( точнее на индекс key т.к. есть класт. индекс у ra)
и на очень которкое время select остановится

2 update в транзакции
т.е в первом qa пишем
begin tran
update ra .... where только одна запись.
ждем
во втором qa пишем ( select без хинтов )
select * from ra...
select остановиться т.к в первом qa стоит блокировка key на конкретную строку.

Neo для большего понимания я приведу несколько цитат по хинтам.

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите новичку.. Проблема с запросом.
Ответ #47 - 08. Декабря 2008 :: 08:05
Печать  
Цитата:
Принято считать, что указание (хинт,подсказка) является чем-то вроде дружеского совета,
но указания процессору запросов являются скорее директивой, чем предложением.
У sql Server нет выбора: после моего распоряжения оптимизатору запросов ( query optimizer )
использовать указание он будет, как верный слуга,твердо придерживаясь этого порядка.
SQL Server не станет обсуждать мое предложение или называть меня тупицей,
даже если выполнение запроса с моим указанием - ужасная идея.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите новичку.. Проблема с запросом.
Ответ #48 - 08. Декабря 2008 :: 08:14
Печать  
Цитата:
Хорошим примером использования указателя NOLOCK является ситуация, когда вы запускаете отчет,
которому не обязательно быть на 100% точным. Если он работает с изменяющимися таблицами,
эти изменения могут привести к тому, что оператор SELECT вынужден будет ждать завершения
других транзакций.Если вы используете указатель NOLOCK, то ваш запрос не будет ждать:
он прочтет "незафиксированные" записи и будет готов намного быстрее.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите новичку.. Проблема с запросом.
Ответ #49 - 08. Декабря 2008 :: 08:29
Печать  
Цитата:
WITH (NOLOCK). Эта подсказка должна находиться сразу же за псевдонимом таблицы раздела FROM.
Она заставляет SQL Server считывать данные из таблицы с указанным псевдонимом,
не применяя блокировок или каких-либо других мер для обеспечения непротиворечивости.
Блокировки считывания могут создать "узкое место", если их применять во время
активного обновления таблицы.
Эта подсказка предотвращает появление такой проблемы, возможно, за счет стоимости
непротиворечивого представления данных на какой-то конкретный момент времени
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите новичку.. Проблема с запросом.
Ответ #50 - 08. Декабря 2008 :: 08:36
Печать  
Цитата:
Запомните, что использование указателя блокировки, не поддерживающего некоторый оператор,
не вызывает генерацию ошибки.Например, вы можете использовать NOLOCK c UPDATE,
но SQL Server проигнорирует это указание - блокировка будет продолжаться.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите новичку.. Проблема с запросом.
Ответ #51 - 08. Декабря 2008 :: 08:43
Печать  
Цитата:
Конфликтующие между собой указания блокировки генерируют ошибку, как показано в следующем операторе

код мой. В qa запускаем
Код
Выбрать все
begin tran
select top 10 * from sc46 ( holdlock, nolock )
commit
 


sql вернет результат :

Server: Msg 1047, Level 15, State 1, Line 2
Conflicting locking hints specified.

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите новичку.. Проблема с запросом.
Ответ #52 - 09. Декабря 2008 :: 05:30
Печать  
Подсказка (NOLOCK) применяется только с оператором SELECT
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 3 [4] 
ОтправитьПечать