Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ? (число прочтений - 3470 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
18. Августа 2011 :: 07:26
Печать  


Когда накладывается блокировка tab Sch-S
мои предположения :
1. select * ( именно из-за * ) во время выполнения запроса.
2. хинт (nolock) накладывает эту блокировку
3. во время компиляции запроса
4. какие-то другие причины.

В статье Блокировки в MS SQL Server 2000
http://www.rsdn.ru/article/db/mssqllocks.xml
описаны все блокировки и как их можно воспроизвести.
но не написанно как воспроизвести  tab Sch-S
Может кто знает как это сделать.

Что можно прочесть про subj ?

И еще один практический вопрос
хп из любой 1с
Код
Выбрать все
Create procedure _1sp__1SJOURN_ByIDDOC(@id CHAR(9)) AS
select * from _1SJOURN(NOLOCK) where IDDOC=@id 



Может если вместо select * расписать все поля явно
то блокировка tab Sch-S не будет наклавываться и ms sql будет чуть меньше загружен?
(такие же хп есть для всех справочников )
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #1 - 18. Августа 2011 :: 07:46
Печать  
Цитата:
Блокировки схем

В компоненте Database Engine блокировка изменения схемы (Sch-M) применяется с операциями языка DDL для таблиц, например при добавлении столбца или очистке таблицы. Пока удерживается блокировка изменения схемы (Sch-M), одновременный доступ к таблице запрещен. Это означает, что любые операции вне блокировки изменения схемы (Sch-M) будут запрещены до снятия блокировки.

Блокировка изменения схемы (Sch-M) применяется с некоторыми операциями языка обработки данных, например усечением таблиц, чтобы предотвратить одновременный доступ к таблице.

Блокировка стабильности схемы (Sch-S) применяется компонентом Database Engine при компиляции и выполнении запросов. Блокировка стабильности схемы (Sch-S) не влияет на блокировки транзакций, включая монопольные (X) блокировки. Поэтому другие транзакции (даже транзакции с монопольной блокировкой (X) для таблицы) могут продолжать работу во время компиляции запроса. Однако одновременные операции DDL и DML, которые запрашивают блокировки изменения схемы (Sch-M), не могут выполняться над таблицей.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #2 - 18. Августа 2011 :: 07:59
Печать  
Цитата:
Блокировка стабильности схемы (Sch-S) применяется компонентом Database Engine при компиляции и выполнении запросов.


Я это читал но как-то не очень убедительно ( потому что тогда таких блокировок Sch-S слишком мало если они накладываются на любое выполнение select)

Ну еще где-то в интернете видел в интернете экзотический пример когда Sch-S блокирует  insert.


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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #3 - 19. Августа 2011 :: 16:38
Печать  
Проведеные мной тесты показали что при выполнения запроса select

Если на таблицу указан хинт (nolock) то
включается блокировка (на эту таблицу ) tab Sch-S
Если нет хинта (nolock) то
то нет и блокировки  tab Sch-S

Как описаны поля таблицы через конкретные имена
или через * на эту блокировку никак не влияет.


Тестовый пример постараюсь выложить на следующей неделе.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #4 - 20. Августа 2011 :: 07:55
Печать  
За основу теста взята статья
Performance impact: Can SELECT (NOLOCK) block INSERTs?
автор Linchi Shea
http://sqlblog.com/blogs/linchi_shea/archive/2009/08/03/performance-impact-can-s...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #5 - 20. Августа 2011 :: 07:57
Печать  
Подготовка теста.Выберем какую либо базу и тесты будем проводить именно в ней
1 Шаг Создаем вспомагательную таблицу
Код
Выбрать все
-- create a test table
create table junk (
i int,
filler char(4000) not null default 'abc'
)
go
 



2 Шаг заполняем таблицу
Код
Выбрать все
-- populate it with 2000 rows
set nocount on
go
declare @i int
set @i = 1
while @i <= 2000
begin
  insert junk(i) values(@i)
  set @i = @i + 1
end
 



3 Шаг создаем индекс на таблице
Код
Выбрать все
create index ix_junk on junk(i)
go
 

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #6 - 20. Августа 2011 :: 07:58
Печать  
Далее будем выполнять тестовый пример

SELECT t1.* INTO #tmp
 FROM junk t1 (NOLOCK), junk t2 (NOLOCK)

В различных комбинациях * и (NOLOCK)

qa процесс =  53

На  втором qa (процесс =  54) всегда запускаем DBCC DBREINDEX(junk)
Запускаем сразу же после старта запроса на первом qa.

На третьем qa (процесс =  55) всегда запускаем INSERT Junk(i) VALUES(1)
Запускаем сразу же после старта запроса на втором qa.

На четвертом qa (процесс =  56) всегда запускаем sp_lock
Запускаем сразу же после старта запроса на третьем qa.
нас интересует dbid = 19

После завершения каждого теста удаляем временную таблицу
drop table #tmp
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #7 - 20. Августа 2011 :: 07:59
Печать  
тест 1
SELECT t1.* INTO #tmp
  FROM junk t1(nolock) , junk t2 (nolock)
  

test1_001.JPG ( 84 KB | Загрузки )
test1_001.JPG
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #8 - 20. Августа 2011 :: 08:00
Печать  
тест 2
SELECT t1.i ,t1.filler INTO #tmp
  FROM junk t1(nolock) , junk t2 (nolock)
  

test2_001.JPG ( 83 KB | Загрузки )
test2_001.JPG
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #9 - 20. Августа 2011 :: 08:00
Печать  
тест 3
SELECT t1.* INTO #tmp
  FROM junk t1 , junk t2
  

test3.JPG ( 89 KB | Загрузки )
test3.JPG
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #10 - 20. Августа 2011 :: 08:01
Печать  
тест 4
SELECT t1.i ,t1.filler INTO #tmp
  FROM junk t1 , junk t2
  

test4.JPG ( 90 KB | Загрузки )
test4.JPG
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #11 - 20. Августа 2011 :: 08:02
Печать  
После выполнения теста и его анализа делаем вывод :

При выполнения запроса select
Если на таблицу указан хинт (nolock) то
включается блокировка (на эту таблицу ) tab Sch-S
Если нет хинта (nolock) то
то нет и блокировки tab Sch-S

Как описаны поля таблицы через конкретные имена
или через * на эту блокировку никак не влияет
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #12 - 20. Августа 2011 :: 19:49
Печать  
Похоже, ты не уловил сути. INSERT блокирется во всех твоих тестах, и блокируется не Sch-S. А автор исходной статьи, по ходу, обкурился, учитывая, что эта подмена понятий не была первоапрельской шуткой.  Подмигивание
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Из-за чего в v77sql возникают блокировки изменения схемы  tab Sch-S ?
Ответ #13 - 22. Августа 2011 :: 05:26
Печать  
berezdetsky писал(а) 20. Августа 2011 :: 19:49:
Похоже, ты не уловил сути. INSERT блокирется во всех твоих тестах, и блокируется не Sch-S.

Согласен что блокировка идет не из-за Sch-S ( тут автор статьи не прав)
Но тем не менее если посмотреть пост 8
в строке 9 (sp_lock)  spid 55 (INSERT Junk(i) VALUES(1) )
ожидает блокировку IX на таблице Junk. Чем вызвано ожидание
этой блокировки мне не понятно. Могу предположить что есть на
таблице Junk блокировка BU( spid 53) и она не показывается помощью sp_lock.

Второе  этот тест позволяет  воспроизводить блокировку Sch-S
(т.к. время жиpни этой блокировки очень коротко) то воспроизвести в тесте эту блокировку достаточно проблематично.

Ну и в третьих этот тест показывает почему и когда накладывается блокировка Sch-S
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать