Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Блокировки (число прочтений - 8206 )
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Блокировки
Ответ #15 - 03. Апреля 2008 :: 14:30
Печать  
sml писал(а) 03. Апреля 2008 :: 13:41:
большинство из них - это прямые запросы к остаткам в режиме проведения документа. Есть ли риск получить кривые остатки, используя хинты nolock для регистров?
Я пока не рискнул.


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

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Блокировки
Ответ #16 - 04. Апреля 2008 :: 05:10
Печать  
vip писал(а) 03. Апреля 2008 :: 14:08:
sml
Ты постоянно употребляешь слово "блокировки".
Что ты вообще имеешь ввиду?

это когда юзвери блокируют друг друга, например, кто-то заблокировал журнал документов или регистр (даже на чтение). Я за вчера наблюдал за работой сервака и пришел к неутешительному выводу - запросы на серв лезут оч. неоптимальными. Большое количество (55 в сек) полных сканов (есть такой счетчик у скуля), а средняя очередь к диску, когда блокировка от 8 до 11. А знатоки говорят, что должна быть < 3.

Думаю одна из засад в этом запросе, скорее всего, он не оптимален:

Код
Выбрать все
"SELECT
|     $РегП.Фирма as [Фирма $Справочник.Фирмы],
|     $РегП.Товар AS [Товар $Справочник.Номенклатура],
|     $РегП.ПрихДокумент as [ПрихДокумент $Документ],
|     $РегП.Статус as Статус,
|     $РегП.Контрагент as [Контрагент $Справочник.Контрагенты],
|     $РегП.Поставщик as [Поставщик $Справочник.Контрагенты],
|     $РегП.Поставка as [Поставка $Документ],
|     $РегП.ОстатокТовара  AS ОстатокТовара,
|     $РегП.Стоимость  AS Стоимость,
|     $РегП.ПродСтоимость  AS ПродСтоимость,
|     $РегП.НДС  AS НДС,
|     $РегП.СтоимостьНП  AS СтоимостьНП,
|	  (CASE J.IDDocDef
|			WHEN $ВидДокумента.Перемещение THEN 'Перемещение'
|			WHEN $ВидДокумента.ВводОстатковТМЦ THEN 'ВводОстатковТМЦ'
|			WHEN $ВидДокумента.ПриходнаяНакладная THEN 'ПриходнаяНакладная'
|			WHEN $ВидДокумента.ВводОстатковРеализации THEN 'ВводОстатковРеализации'
|			WHEN $ВидДокумента.ВводПартийТоваров THEN 'ВводПартийТоваров'
|			WHEN $ВидДокумента.ВводОстатковВМагазинах THEN 'ВводОстатковВМагазинах'
|			WHEN $ВидДокумента.ПриходнаяРеализатора THEN 'ПриходнаяРеализатора'
|			WHEN $ВидДокумента.ОприходованиеИзлишков THEN 'ОприходованиеИзлишков'
|		ELSE ''
|		END)as ДокП_вид,
|	  J.DATE_TIME_IDDOC as ПозицияПартии
|  FROM
|     $РегистрИтоги.ПартииТоваров as РегП
|
|	LEFT JOIN _1sjourn J (NOLOCK) ON J.IDDOC = right($РегП.ПрихДокумент, 9)
| WHERE $РегП.ОстатокТовара >0
|			"+стрСтат+"
|			AND $РегП.Товар in (SELECT val from #STov)
|			AND Period = :ПредМесяц
| ORDER BY $РегП.Товар, J.DATE_TIME_IDDOC, $РегП.ПрихДокумент 

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


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Блокировки
Ответ #17 - 04. Апреля 2008 :: 07:13
Печать  
вот план запроса. Академики, подкиньте, пожалуйста, идейку, где копать???

Код
Выбрать все
		|--Bookmark Lookup(BOOKMARK: ([Bmk1001]), OBJECT: ([TorgSB_N].[dbo].[_1SJOURN] AS [J]))	1	4	3	Bookmark Lookup	Bookmark Lookup	BOOKMARK: ([Bmk1001]), OBJECT: ([TorgSB_N].[dbo].[_1SJOURN] AS [J])	[J].[IDDOCDEF], [J].[DATE_TIME_IDDOC]	1.0	6.2500001E-3	0.0000011	300	0.03251927	[RegP].[SP2654], [RegP].[SP1131], [RegP].[SP1132], [RegP].[SP2706], [RegP].[SP2707], [RegP].[SP3597], [RegP].[SP3601], [RegP].[SP1133], [RegP].[SP2655], [RegP].[SP2799], [RegP].[SP3286], [RegP].[SP3665], [J].[IDDOCDEF], [J].[DATE_TIME_IDDOC]	[NULL]	PLAN_ROW	0	1.0
		     |--Nested Loops(Left Outer Join, OUTER REFERENCES: ([RegP].[SP1132]))	1	5	4	Nested Loops	Left Outer Join	OUTER REFERENCES: ([RegP].[SP1132])	[NULL]	1.0	0.0	0.00001254	205	2.6268167E-2	[RegP].[SP2654], [RegP].[SP1131], [RegP].[SP1132], [RegP].[SP2706], [RegP].[SP2707], [RegP].[SP3597], [RegP].[SP3601], [RegP].[SP1133], [RegP].[SP2655], [RegP].[SP2799], [RegP].[SP3286], [RegP].[SP3665], [Bmk1001]	[NULL]	PLAN_ROW	0	1.0
			    |--Nested Loops(Left Semi Join, WHERE: ([RegP].[SP1131]=[Doc].[SP249]))	1	6	5	Nested Loops	Left Semi Join	WHERE: ([RegP].[SP1131]=[Doc].[SP249])	[NULL]	1.0	0.0	2.7815544E-4	175	0.01335981	[RegP].[SP2654], [RegP].[SP1131], [RegP].[SP1132], [RegP].[SP2706], [RegP].[SP2707], [RegP].[SP3597], [RegP].[SP3601], [RegP].[SP1133], [RegP].[SP2655], [RegP].[SP2799], [RegP].[SP3286], [RegP].[SP3665]	[NULL]	PLAN_ROW	0	1.0
			    |    |--Clustered Index Seek(OBJECT: ([TorgSB_N].[dbo].[RG1130].[PK_RG1130] AS [RegP]), SEEK: ([RegP].[PERIOD]='Apr  1 2008 12:00AM'),  WHERE: ([RegP].[SP1133]>0.00000) ORDERED FORWARD)	1	7	6	Clustered Index Seek	Clustered Index Seek	OBJECT: ([TorgSB_N].[dbo].[RG1130].[PK_RG1130] AS [RegP]), SEEK: ([RegP].[PERIOD]='Apr  1 2008 12:00AM'),  WHERE: ([RegP].[SP1133]>0.00000) ORDERED FORWARD	[RegP].[SP2654], [RegP].[SP1131], [RegP].[SP1132], [RegP].[SP2706], [RegP].[SP2707], [RegP].[SP3597], [RegP].[SP3601], [RegP].[SP1133], [RegP].[SP2655], [RegP].[SP2799], [RegP].[SP3286], [RegP].[SP3665]	1.0	6.3284999E-3	8.0320715E-5	175	6.4088209E-3	[RegP].[SP2654], [RegP].[SP1131], [RegP].[SP1132], [RegP].[SP2706], [RegP].[SP2707], [RegP].[SP3597], [RegP].[SP3601], [RegP].[SP1133], [RegP].[SP2655], [RegP].[SP2799], [RegP].[SP3286], [RegP].[SP3665]	[NULL]	PLAN_ROW	0	1.0
			    |    |--Clustered Index Seek(OBJECT: ([TorgSB_N].[dbo].[DT239].[PK_DT239] AS [Doc]), SEEK: ([Doc].[IDDOC]='  D4D2CEE') ORDERED FORWARD)	1	8	6	Clustered Index Seek	Clustered Index Seek	OBJECT: ([TorgSB_N].[dbo].[DT239].[PK_DT239] AS [Doc]), SEEK: ([Doc].[IDDOC]='  D4D2CEE') ORDERED FORWARD	[Doc].[SP249]	26.617744	6.3284999E-3	1.0785937E-4	62	6.6520781E-3	[Doc].[SP249]	[NULL]	PLAN_ROW	0	3.0
			    |--Index Seek(OBJECT: ([TorgSB_N].[dbo].[_1SJOURN].[IDDOC] AS [J]), SEEK: ([J].[IDDOC]=right(Convert([RegP].[SP1132]), 9)) ORDERED FORWARD)	1	12	5	Index Seek	Index Seek	OBJECT: ([TorgSB_N].[dbo].[_1SJOURN].[IDDOC] AS [J]), SEEK: ([J].[IDDOC]=right(Convert([RegP].[SP1132]), 9)) ORDERED FORWARD	[Bmk1001]	1.0	6.3284999E-3	7.9605998E-5	38	1.2895818E-2	[Bmk1001]	[NULL]	PLAN_ROW	0	3.0 

  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Блокировки
Ответ #18 - 04. Апреля 2008 :: 07:38
Печать  
Красавчик!  Смех
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Блокировки
Ответ #19 - 04. Апреля 2008 :: 07:46
Печать  
для ясности - то, что на входе:

Код
Выбрать все
SELECT
	  RegP.sp2654 as Firma,
     RegP.sp1131 AS Tovar,
	  RegP.sp1132 as PrihDoc,
	  RegP.sp2706 as Status,
	  RegP.sp2707 as Contragent,
	  RegP.sp3597 as Postav,
	  RegP.sp3601 as Postavka,
     RegP.sp1133  AS Ostat,
     RegP.sp2655  AS Stoim,
     RegP.sp2799  AS ProdStoim,
     RegP.sp3286  AS NDS,
     RegP.sp3665  AS NP,
	  (CASE J.IDDocDef
			WHEN 239 THEN 'Перемещение'
			WHEN 5598 THEN 'ВводОстатковТМЦ'
			WHEN 434 THEN 'ПриходнаяНакладная'
			WHEN 657 THEN 'ВводОстатковРеализации'
			WHEN 1160 THEN 'ВводПартийТоваров'
			WHEN 6272 THEN 'ВводОстатковВМагазинах'
			WHEN 493 THEN 'ПриходнаяРеализатора'
			WHEN 3831 THEN 'ОприходованиеИзлишков'
		ELSE ''
		END) as VidDoc,
	  J.DATE_TIME_IDDOC as Partia
  FROM
     rg1130 as RegP

	LEFT JOIN _1sjourn J (NOLOCK) ON J.IDDOC = right(RegP.sp1132, 9)
 WHERE RegP.sp1133 >0
			AND RegP.sp1131 in (SELECT Doc.sp249 from dt239 Doc (nolock)
				Where Doc.IDDoc = '  D4D2CEE')
			AND Period = '20080401'
 ORDER BY RegP.sp1131, J.DATE_TIME_IDDOC, RegP.sp1132 

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Блокировки
Ответ #20 - 04. Апреля 2008 :: 07:55
Печать  
И куда делось
Код
Выбрать все
AND $РегП.Товар in (SELECT val from #STov) 

?
  

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


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Блокировки
Ответ #21 - 04. Апреля 2008 :: 08:09
Печать  
berezdetsky писал(а) 04. Апреля 2008 :: 07:55:
И куда делось
Код
Выбрать все
AND $РегП.Товар in (SELECT val from #STov) 

?

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Блокировки
Ответ #22 - 04. Апреля 2008 :: 08:21
Печать  
Спрятал основной тормоз и теперь ждешь совета?  Круглые глаза Нет слов..

Добавь условия по измерениям, стоящим перед товаром, или включи отбор итогов по товару.
И исправь этот
Код
Выбрать все
RegP.sp1131 in (SELECT Doc.sp249 from dt239 Doc (nolock) Where Doc.IDDoc = '  D4D2CEE') 


- он порождает ненужный join. При том, что этот подзапрос возвращает всего одно значение, которое ты можешь передать непосредственно.
  

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


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Блокировки
Ответ #23 - 04. Апреля 2008 :: 08:24
Печать  
berezdetsky писал(а) 04. Апреля 2008 :: 08:21:
Спрятал основной тормоз и теперь ждешь совета?  Круглые глаза Нет слов..

Добавь условия по измерениям, стоящим перед товаром, или включи отбор итогов по товару.

отбор итогов по товару у меня включен давно.
Цитата:
И исправь этот
Код
Выбрать все
RegP.sp1131 in (SELECT Doc.sp249 from dt239 Doc (nolock) Where Doc.IDDoc = '  D4D2CEE') 


- он порождает ненужный join. При том, что этот подзапрос возвращает всего одно значение, которое ты можешь передать непосредственно.


это как я непостредственно передам список товаров  Нерешительный?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Блокировки
Ответ #24 - 04. Апреля 2008 :: 08:31
Печать  
sml писал(а) 04. Апреля 2008 :: 08:24:
отбор итогов по товару у меня включен давно.

Он не использовался в плане, который ты выкладывал до правки своего поста.

sml писал(а) 04. Апреля 2008 :: 08:24:
это как я непостредственно передам список товаров  Нерешительный?

Смущённый Тут я не прав - перепутал таблицы шапок и строк. Но стоит заменить IN на явный JOIN.
  

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


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Блокировки
Ответ #25 - 04. Апреля 2008 :: 08:52
Печать  
не могу план запроса  (с JOIN) привести - не влазит, и прикрепл файл почемуто не подцепляется  Нерешительный
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: Блокировки
Ответ #26 - 04. Апреля 2008 :: 09:59
Печать  
sml писал(а) 04. Апреля 2008 :: 05:10:
Код
Выбрать все
"SELECT
|     $РегП.Фирма as [Фирма $Справочник.Фирмы],
|     $РегП.Товар AS [Товар $Справочник.Номенклатура],
|     $РегП.ПрихДокумент as [ПрихДокумент $Документ],
|     $РегП.Статус as Статус,
|     $РегП.Контрагент as [Контрагент $Справочник.Контрагенты],
|     $РегП.Поставщик as [Поставщик $Справочник.Контрагенты],
|     $РегП.Поставка as [Поставка $Документ],
|     $РегП.ОстатокТовара  AS ОстатокТовара,
|     $РегП.Стоимость  AS Стоимость,
|     $РегП.ПродСтоимость  AS ПродСтоимость,
|     $РегП.НДС  AS НДС,
|     $РегП.СтоимостьНП  AS СтоимостьНП,
|	  (CASE J.IDDocDef
|			WHEN $ВидДокумента.Перемещение THEN 'Перемещение'
|			WHEN $ВидДокумента.ВводОстатковТМЦ THEN 'ВводОстатковТМЦ'
|			WHEN $ВидДокумента.ПриходнаяНакладная THEN 'ПриходнаяНакладная'
|			WHEN $ВидДокумента.ВводОстатковРеализации THEN 'ВводОстатковРеализации'
|			WHEN $ВидДокумента.ВводПартийТоваров THEN 'ВводПартийТоваров'
|			WHEN $ВидДокумента.ВводОстатковВМагазинах THEN 'ВводОстатковВМагазинах'
|			WHEN $ВидДокумента.ПриходнаяРеализатора THEN 'ПриходнаяРеализатора'
|			WHEN $ВидДокумента.ОприходованиеИзлишков THEN 'ОприходованиеИзлишков'
|		ELSE ''
|		END)as ДокП_вид,
|	  J.DATE_TIME_IDDOC as ПозицияПартии
|  FROM
|     $РегистрИтоги.ПартииТоваров as РегП
|
|	LEFT JOIN _1sjourn J (NOLOCK) ON J.IDDOC = right($РегП.ПрихДокумент, 9)
| WHERE $РегП.ОстатокТовара >0
|			"+стрСтат+"
|			AND $РегП.Товар in (SELECT val from #STov)
|			AND Period = :ПредМесяц
| ORDER BY $РегП.Товар, J.DATE_TIME_IDDOC, $РегП.ПрихДокумент 



Непонятки:
1) как проходит типизация документа,  
|     $РегП.ПрихДокумент as [ПрихДокумент $Документ],
если нет колонки ПрихДокумент_вид?; аналогично и  [Поставка $Документ]
2) зачем надо одновременно CASE, и колонку [ПрихДокумент $Документ]? ИМХО одно из них  лишнее

честно говоря я бы и в строке: $РегистрИтоги.ПартииТоваров as РегП тоже бы (NoLock) добавил
ну и в зависимости от того где и как используется результат запроса можно попытаться избавиться от лишних приведений к типам 1с "справочник" и "документ".
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Блокировки
Ответ #27 - 04. Апреля 2008 :: 10:07
Печать  
Может я что-то упустил - но разве уже не отпала необходимость использовать CASE для определения строкового представления вида документа???
Код
Выбрать все
$ВидДокументПредставление 

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


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Блокировки
Ответ #28 - 04. Апреля 2008 :: 12:24
Печать  
неужели, никто ничего дельного не подскажет.
Я помониторил профайлером реальную базу. Нашел, что запрос (первоначальный вариант с временной таблицей) для документа на 10 строк варился 37,5сек. Сама врем таблица формировалась 93мсек. Так что тормоза не в ней. Скорее всего тормоза связаны с журналом документов.  Смущённый
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Блокировки
Ответ #29 - 04. Апреля 2008 :: 15:03
Печать  
sml писал(а) 04. Апреля 2008 :: 12:24:
неужели, никто ничего дельного не подскажет.

Код
Выбрать все
FROM $РегистрИтоги.ПартииТоваров as РегП 


Вот здесь нет хинта, а это значит, что:
* запросом будут наложены блокировки (скорее всего по индексу, но это тоже долго);
* до конца выполнения запроса НИ КТО не сможет начать проведение, т.к. 1с хочет заблокировать всю таблицу перед проведением, а ей не дают.

А здесь
Код
Выбрать все
LEFT JOIN _1sjourn J (NOLOCK) ON J.IDDOC = right($РегП.ПрихДокумент, 9) 


ты попадаешь на сканирование.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать