Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
DELETE FROM T2 конечно же надо, в общем в SQL получился такой триггер:
USE [HRM_test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[on_delete_CRgActP579]
	ON [dbo].[_CRgActP579]
	INSTEAD OF DELETE
AS
BEGIN
	SET NOCOUNT ON;
	DELETE from T2
	FROM deleted AS T3
	LEFT JOIN _CRgActP579 AS T2
	ON T2._RecorderTRef=T3._RecorderTRef AND T2._RecorderRRef=T3._RecorderRRef AND T2._LineNo=T3._LineNo
END
6 дек 12, 19:43    [13590511]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
Для тех кто будет читать, в сообщении выше это уже полученный триггер, чтобы его получить надо ALTER на CREATE заменить (и почему на этом форуме нельзя сообщения свои редактировать??).

А я продолжил сегодня эксперименты. С этим триггером количество взаимоблокировок уменьшилось процентов на 80. Впечатляет, всем огромное спасибо за помощь!
Осталась еще блокировка в запросе, текст запроса:
		ВЫБРАТЬ РАЗЛИЧНЫЕ
			ОсновныеНачисления.Сотрудник КАК Сотрудник,
			ОсновныеНачисления.ПериодДействия КАК ПериодДействия
		ПОМЕСТИТЬ ВТ_СотрудникиПериодыДействия
		ИЗ
			РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК ОсновныеНачисления
		ГДЕ
			ОсновныеНачисления.Регистратор = &парамРегистратор
			И ОсновныеНачисления.Авторасчет
		
		ИНДЕКСИРОВАТЬ ПО
			Сотрудник,
			ПериодДействия
		;
		
		////////////////////////////////////////////////////////////////////////////////
		ВЫБРАТЬ
			ОсновныеНачисленияОрганизаций.Ссылка КАК ВидРасчета
		ПОМЕСТИТЬ ВТ_СписокВРПоДням
		ИЗ
			ПланВидовРасчета.ОсновныеНачисленияОрганизаций КАК ОсновныеНачисленияОрганизаций
		ГДЕ
			ОсновныеНачисленияОрганизаций.ВидВремени В (ЗНАЧЕНИЕ(Перечисление.ВидыВремени.ОтработанноеВПределахНормы), ЗНАЧЕНИЕ(Перечисление.ВидыВремени.ОтработанноеСверхНормы))
		
		ИНДЕКСИРОВАТЬ ПО
			ВидРасчета
		;
		
		////////////////////////////////////////////////////////////////////////////////
		ВЫБРАТЬ
			ОсновныеНачисленияОрганизаций.Ссылка КАК ВидРасчета
		ПОМЕСТИТЬ ВТ_СписокВРПоЧасам
		ИЗ
			ПланВидовРасчета.ОсновныеНачисленияОрганизаций КАК ОсновныеНачисленияОрганизаций
		ГДЕ
			ОсновныеНачисленияОрганизаций.ВидВремени В (ЗНАЧЕНИЕ(Перечисление.ВидыВремени.ОтработанноеСверхНормы), ЗНАЧЕНИЕ(Перечисление.ВидыВремени.ЧасовоеОтработанноеВПределахНормы))
		
		ИНДЕКСИРОВАТЬ ПО
			ВидРасчета
		;
		
		////////////////////////////////////////////////////////////////////////////////
		ВЫБРАТЬ
			ФактическийПериодДействия.НомерСтроки,
			ФактическийПериодДействия.Сторно,
			ФактическийПериодДействия.Сотрудник КАК Сотрудник,
			ФактическийПериодДействия.Организация КАК Организация,
			ФактическийПериодДействия.ПериодДействия КАК ПериодДействия,
			ФактическийПериодДействия.ПериодДействияНачало,
			ФактическийПериодДействия.ПериодДействияКонец,
			ФактическийПериодДействия.ПериодРегистрации
		ПОМЕСТИТЬ ВТ_ОсновныеФПД
		ИЗ
			РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.ФактическийПериодДействия(
					Регистратор = &парамРегистратор
						И Авторасчет) КАК ФактическийПериодДействия
		
		ИНДЕКСИРОВАТЬ ПО
			Сотрудник,
			Организация,
			ПериодДействия
		;
		
		////////////////////////////////////////////////////////////////////////////////
		ВЫБРАТЬ
			НесгруппированныеДанные.НомерСтроки КАК НомерСтроки,
			СУММА(НесгруппированныеДанные.ОтработаноДней) КАК ВсегоОтработаноДней,
			СУММА(НесгруппированныеДанные.ОтработаноЧасов) КАК ВсегоОтработаноЧасов
		ПОМЕСТИТЬ ВТВсегоОтработаноВремени
		ИЗ
			(ВЫБРАТЬ
				Основной.НомерСтроки КАК НомерСтроки,
				ВЫБОР
					КОГДА Вспомогательный.ВидРасчета.ВидВремени = ЗНАЧЕНИЕ(Перечисление.ВидыВремени.ОтработанноеСверхНормы)
						ТОГДА ВЫБОР
								КОГДА Вспомогательный.Сторно
									ТОГДА -1
								ИНАЧЕ 1
							КОНЕЦ * Вспомогательный.ОтработаноДней
					ИНАЧЕ ГрафикиРаботы.ОсновноеЗначение
				КОНЕЦ КАК ОтработаноДней,
				ВЫБОР
					КОГДА Вспомогательный.ВидРасчета.ВидВремени = ЗНАЧЕНИЕ(Перечисление.ВидыВремени.ОтработанноеСверхНормы)
						ТОГДА 0
					ИНАЧЕ ГрафикиРаботы.ДополнительноеЗначение
				КОНЕЦ КАК ОтработаноЧасов
			ИЗ
				ВТ_ОсновныеФПД КАК Основной
					ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.ФактическийПериодДействия(
							ВидРасчета В
									(ВЫБРАТЬ
										СписокВР.ВидРасчета
									ИЗ
										ВТ_СписокВРПоДням КАК СписокВР)
								И (Сотрудник, ПериодДействия) В
									(ВЫБРАТЬ
										ОсновныеНачисления.Сотрудник,
										ОсновныеНачисления.ПериодДействия
									ИЗ
										ВТ_СотрудникиПериодыДействия КАК ОсновныеНачисления)) КАК Вспомогательный
					ПО Основной.Сотрудник = Вспомогательный.Сотрудник
						И Основной.Организация = Вспомогательный.Организация
						И Основной.ПериодДействия = Вспомогательный.ПериодДействия
						И (Основной.Сторно = Вспомогательный.Сторно
							ИЛИ Вспомогательный.ВидРасчета.ВидВремени <> ЗНАЧЕНИЕ(Перечисление.ВидыВремени.ОтработанноеВПределахНормы))
						И Основной.ПериодРегистрации >= Вспомогательный.ПериодРегистрации
					ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботы
					ПО (Вспомогательный.ГрафикРаботы = ГрафикиРаботы.ГрафикРаботы)
						И (Вспомогательный.ВидРасчета.ВидВремени <> ЗНАЧЕНИЕ(Перечисление.ВидыВремени.ОтработанноеСверхНормы))
						И (ГрафикиРаботы.Месяц = Вспомогательный.ПериодДействия)
						И (ГрафикиРаботы.ВидУчетаВремени = ЗНАЧЕНИЕ(Перечисление.ВидыУчетаВремени.ПоДням))
						И (ГрафикиРаботы.Дата МЕЖДУ Основной.ПериодДействияНачало И Основной.ПериодДействияКонец)
						И (ГрафикиРаботы.Дата МЕЖДУ Вспомогательный.ПериодДействияНачало И Вспомогательный.ПериодДействияКонец)
			
			ОБЪЕДИНИТЬ ВСЕ
			
			ВЫБРАТЬ
				Основной.НомерСтроки,
				0,
				ВЫБОР
					КОГДА Вспомогательный.Сторно
						ТОГДА -1
					ИНАЧЕ 1
				КОНЕЦ * Вспомогательный.ОтработаноЧасов
			ИЗ
				ВТ_ОсновныеФПД КАК Основной
					ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.ФактическийПериодДействия(
							ВидУчетаВремени = ЗНАЧЕНИЕ(Перечисление.ВидыУчетаВремени.ПоЧасам)
								И ВидРасчета В
									(ВЫБРАТЬ
										СписокВР.ВидРасчета
									ИЗ
										ВТ_СписокВРПоЧасам КАК СписокВР)
								И (Сотрудник, ПериодДействия) В
									(ВЫБРАТЬ
										ОсновныеНачисления.Сотрудник,
										ОсновныеНачисления.ПериодДействия
									ИЗ
										ВТ_СотрудникиПериодыДействия КАК ОсновныеНачисления)) КАК Вспомогательный
					ПО Основной.Сотрудник = Вспомогательный.Сотрудник
						И Основной.Организация = Вспомогательный.Организация
						И Основной.ПериодДействия = Вспомогательный.ПериодДействия
						И (Вспомогательный.ПериодДействияНачало МЕЖДУ Основной.ПериодДействияНачало И Основной.ПериодДействияКонец)
						И (Вспомогательный.ПериодДействияКонец МЕЖДУ Основной.ПериодДействияНачало И Основной.ПериодДействияКонец)) КАК НесгруппированныеДанные
		
		СГРУППИРОВАТЬ ПО
			НесгруппированныеДанные.НомерСтроки
		
		ИНДЕКСИРОВАТЬ ПО
			НомерСтроки

Трассы вложил, сижу пока впухаю, тут сложнее видимо будет....

К сообщению приложен файл (ТрассировкаSQL2.zip - 8Kb) cкачать
7 дек 12, 06:22    [13591463]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
ЦУП показывает, что этот запрос транслируется в таком виде в MS SQL:
INSERT INTO #tt276 (_Q_007_F_000, _Q_007_F_001, _Q_007_F_002) SELECT
T1.Q_001_F_000_,
CAST(SUM(T1.Q_001_F_001_) AS NUMERIC(20, 8)),
CAST(SUM(T1.Q_001_F_002_) AS NUMERIC(20, 8))
FROM (SELECT
T2._Q_001_F_000 AS Q_001_F_000_,
CASE WHEN (T8._Fld415RRef = 0x9581A7D266A534894D0F053F3EBA188E) THEN (CASE WHEN T3.Storno_ = 0x01 THEN -1.0 ELSE 1.0 END * T3.Fld548_) ELSE T9._Fld5651 END AS Q_001_F_001_,
CAST(CASE WHEN (T8._Fld415RRef = 0x9581A7D266A534894D0F053F3EBA188E) THEN 0.0 ELSE T9._Fld5652 END AS NUMERIC(8, 2)) AS Q_001_F_002_
FROM #tt275 T2 WITH(NOLOCK)
LEFT OUTER JOIN (SELECT
T4._Period AS Period_,
T4._CalcKindRRef AS CalcKindRRef,
T4._ActionPeriod AS ActionPeriod_,
CASE WHEN T5._APDateFrom IS NULL THEN T4._APDateFrom ELSE T5._APDateFrom END AS APDateFrom_,
CASE WHEN T5._APDateTill IS NULL THEN T4._APDateTill ELSE T5._APDateTill END AS APDateTill_,
T4._Storno AS Storno_,
T4._Fld543RRef AS Fld543RRef,
T4._Fld545RRef AS Fld545RRef,
T4._Fld548 AS Fld548_,
T4._Fld557_TYPE AS Fld557_TYPE,
T4._Fld557_RTRef AS Fld557_RTRef,
T4._Fld557_RRRef AS Fld557_RRRef
FROM _CRg542 T4
LEFT OUTER JOIN _CRgActP579 T5
ON T4._RecorderTRef = T5._RecorderTRef AND T4._RecorderRRef = T5._RecorderRRef AND T4._LineNo = T5._LineNo
WHERE (T5._APDateFrom <> @P1 OR T5._APDateFrom IS NULL) AND (T4._CalcKindRRef IN
(SELECT
T6._Q_001_F_000RRef AS Q_003_F_000RRef
FROM #tt273 T6 WITH(NOLOCK)) AND EXISTS(SELECT
1
FROM #tt201 T7 WITH(NOLOCK)
WHERE (T4._Fld543RRef = T7._Q_000_F_000RRef) AND (T4._ActionPeriod = T7._Q_000_F_001)))) T3
LEFT OUTER JOIN _CKinds2 T8
ON T3.CalcKindRRef = T8._IDRRef
ON (((((T2._Q_001_F_002RRef = T3.Fld543RRef) AND (T2._Q_001_F_003RRef = T3.Fld545RRef)) AND (T2._Q_001_F_004 = T3.ActionPeriod_)) AND ((T2._Q_001_F_001 = T3.Storno_) OR (T8._Fld415RRef <> @P2))) AND (T2._Q_001_F_007 >= T3.Period_))
LEFT OUTER JOIN _InfoRg5645 T9
ON ((((((T3.Fld557_TYPE = T9._Fld5646_TYPE AND T3.Fld557_RTRef = T9._Fld5646_RTRef AND T3.Fld557_RRRef = T9._Fld5646_RRRef) AND (T8._Fld415RRef <> @P3)) AND (T9._Fld5647 = T3.ActionPeriod_)) AND (T9._Fld5649RRef = @P4)) AND ((T9._Fld5650 >= T2._Q_001_F_005) AND (T9._Fld5650 <= T2._Q_001_F_006))) AND ((T9._Fld5650 >= T3.APDateFrom_) AND (T9._Fld5650 <= T3.APDateTill_)))
UNION ALL SELECT
T10._Q_001_F_000 AS Q_001_F_000_,
CAST(@P5 AS NUMERIC(8, 2)),
(CASE WHEN T11.Storno_ = 0x01 THEN -1.0 ELSE 1.0 END * T11.Fld549_)
FROM #tt275 T10 WITH(NOLOCK)
LEFT OUTER JOIN (SELECT
T12._ActionPeriod AS ActionPeriod_,
CASE WHEN T13._APDateFrom IS NULL THEN T12._APDateFrom ELSE T13._APDateFrom END AS APDateFrom_,
CASE WHEN T13._APDateTill IS NULL THEN T12._APDateTill ELSE T13._APDateTill END AS APDateTill_,
T12._Storno AS Storno_,
T12._Fld543RRef AS Fld543RRef,
T12._Fld545RRef AS Fld545RRef,
T12._Fld549 AS Fld549_
FROM _CRg542 T12
LEFT OUTER JOIN _CRgActP579 T13
ON T12._RecorderTRef = T13._RecorderTRef AND T12._RecorderRRef = T13._RecorderRRef AND T12._LineNo = T13._LineNo
WHERE (T13._APDateFrom <> @P1 OR T13._APDateFrom IS NULL) AND (((T12._Fld559RRef = @P6) AND T12._CalcKindRRef IN
(SELECT
T14._Q_001_F_000RRef AS Q_005_F_000RRef
FROM #tt274 T14 WITH(NOLOCK))) AND EXISTS(SELECT
1
FROM #tt201 T15 WITH(NOLOCK)
WHERE (T12._Fld543RRef = T15._Q_000_F_000RRef) AND (T12._ActionPeriod = T15._Q_000_F_001)))) T11
ON (((((T10._Q_001_F_002RRef = T11.Fld543RRef) AND (T10._Q_001_F_003RRef = T11.Fld545RRef)) AND (T10._Q_001_F_004 = T11.ActionPeriod_)) AND ((T11.APDateFrom_ >= T10._Q_001_F_005) AND (T11.APDateFrom_ <= T10._Q_001_F_006))) AND ((T11.APDateTill_ >= T10._Q_001_F_005) AND (T11.APDateTill_ <= T10._Q_001_F_006)))) T1
GROUP BY T1.Q_001_F_000_'
7 дек 12, 06:32    [13591468]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
Вот граф этой блокировки:
Картинка с другого сайта.
7 дек 12, 07:31    [13591523]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
А вот последовательность действий которая привела к взаимоблокировке:Картинка с другого сайта.
7 дек 12, 07:36    [13591526]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
Благодаря статье я теперь начинаю понимать, что блокировки намерения при записи наборов записей, не дают прочитать данные. Но как они пересеклись эти данные, ведь организации разные - не совсем понятно. Как выходить из ситуации пока тоже не понятно, но похоже это надо в 1С менять алгоритм. Запрос видимо пытается прочитать данные которые ему не нужны - видимо лишние данные читает что ли? Пошел в отладку...
7 дек 12, 07:41    [13591529]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
С этой взаимоблокировкой я похоже справился подправлением запроса:
.
.
.
			ИЗ
				ВТ_ОсновныеФПД КАК Основной
					ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.ФактическийПериодДействия(
							ВидРасчета В
									(ВЫБРАТЬ
										СписокВР.ВидРасчета
									ИЗ
										ВТ_СписокВРПоДням КАК СписокВР)
								И (Сотрудник, ПериодДействия) В
									(ВЫБРАТЬ
										ОсновныеНачисления.Сотрудник,
										ОсновныеНачисления.ПериодДействия
									ИЗ
										ВТ_СотрудникиПериодыДействия КАК ОсновныеНачисления)
								И Регистратор = &парамРегистратор) КАК Вспомогательный       //вот тут
					ПО Основной.Сотрудник = Вспомогательный.Сотрудник
						И Основной.Организация = Вспомогательный.Организация
						И Основной.ПериодДействия = Вспомогательный.ПериодДействия
						И (Основной.Сторно = Вспомогательный.Сторно
							ИЛИ Вспомогательный.ВидРасчета.ВидВремени <> ЗНАЧЕНИЕ(Перечисление.ВидыВремени.ОтработанноеВПределахНормы))
						И Основной.ПериодРегистрации >= Вспомогательный.ПериодРегистрации
					ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботы
					ПО (Вспомогательный.ГрафикРаботы = ГрафикиРаботы.ГрафикРаботы)
						И (Вспомогательный.ВидРасчета.ВидВремени <> ЗНАЧЕНИЕ(Перечисление.ВидыВремени.ОтработанноеСверхНормы))
						И (ГрафикиРаботы.Месяц = Вспомогательный.ПериодДействия)
						И (ГрафикиРаботы.ВидУчетаВремени = ЗНАЧЕНИЕ(Перечисление.ВидыУчетаВремени.ПоДням))
						И (ГрафикиРаботы.Дата МЕЖДУ Основной.ПериодДействияНачало И Основной.ПериодДействияКонец)
						И (ГрафикиРаботы.Дата МЕЖДУ Вспомогательный.ПериодДействияНачало И Вспомогательный.ПериодДействияКонец)
			
			ОБЪЕДИНИТЬ ВСЕ
			
			ВЫБРАТЬ
				Основной.НомерСтроки,
				0,
				ВЫБОР
					КОГДА Вспомогательный.Сторно
						ТОГДА -1
					ИНАЧЕ 1
				КОНЕЦ * Вспомогательный.ОтработаноЧасов
			ИЗ
				ВТ_ОсновныеФПД КАК Основной
					ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.ФактическийПериодДействия(
							ВидУчетаВремени = ЗНАЧЕНИЕ(Перечисление.ВидыУчетаВремени.ПоЧасам)
								И ВидРасчета В
									(ВЫБРАТЬ
										СписокВР.ВидРасчета
									ИЗ
										ВТ_СписокВРПоЧасам КАК СписокВР)
								И (Сотрудник, ПериодДействия) В
									(ВЫБРАТЬ
										ОсновныеНачисления.Сотрудник,
										ОсновныеНачисления.ПериодДействия
									ИЗ
										ВТ_СотрудникиПериодыДействия КАК ОсновныеНачисления)
								И Регистратор = &парамРегистратор) КАК Вспомогательный           //и вот тут
					ПО Основной.Сотрудник = Вспомогательный.Сотрудник
						И Основной.Организация = Вспомогательный.Организация
						И Основной.ПериодДействия = Вспомогательный.ПериодДействия
						И (Вспомогательный.ПериодДействияНачало МЕЖДУ Основной.ПериодДействияНачало И Основной.ПериодДействияКонец)
						И (Вспомогательный.ПериодДействияКонец МЕЖДУ Основной.ПериодДействияНачало И Основной.ПериодДействияКонец)) КАК НесгруппированныеДанные
		
		СГРУППИРОВАТЬ ПО
			НесгруппированныеДанные.НомерСтроки
		
		ИНДЕКСИРОВАТЬ ПО
			НомерСтроки";
добавил в параметры виртуальной таблицы еще условие по регистратору в двух местах - насчет корректности расчета с расчетчиками еще не проверял, но взаимоблокировка ушла!
Но вернулась взаимоблокировка по удалению в том же запросе как и с начала топика:
DELETE FROM T2
FROM #tt170 T1 WITH(NOLOCK)
INNER JOIN _CRgActP579 T2
ON T2._RecorderTRef = T1._RecorderTRef AND T2._RecorderRRef = T1._RecorderRRef AND T2._LineNo = T1._LineNo
WHERE T2._RecorderTRef = T1._RecorderTRef AND T2._RecorderRRef = T1._RecorderRRef AND T2._LineNo = T1._LineNo
Спрашиватся - какого фига не сработал триггер?!
7 дек 12, 10:35    [13592341]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
aleks2
Guest
JohnySC
Но как они пересеклись эти данные, ведь организации разные - не совсем понятно.


Например, индекс "не по организациям". И фсе, фсе курят и ждут перестроения.

Ни парьтесь, разнесите свои организации по разным базам. И фсе.
7 дек 12, 11:46    [13592998]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
aleks2
Ни парьтесь, разнесите свои организации по разным базам. И фсе.
Низя, совсем низя, у них тут централизованная бухгалтерия же, им нужен сводный отчет по ЗП по всем организациям, если б так все было просто, то не парился бы.
Сейчас меня больше всего волнует вопрос как может не выполняться триггер?!
7 дек 12, 11:56    [13593113]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
aleks2
Guest
JohnySC
Сейчас меня больше всего волнует вопрос как может не выполняться триггер?!

1. Триггер - савсем не пилюля от блокировок.
2. А InsteadOfTrigger и вовсе не подарочек.

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

3. Ну... инспектируйте свою базу. Фсе индексы (кластерные тоже) должны начинаться с Организации.
7 дек 12, 12:13    [13593254]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
aleks2
1. Триггер - савсем не пилюля от блокировок.
Ну это и так понятно. Мне не понятно почему он не выполняется и как это выяснить, например в профайлере событий связанных с триггерами вообще не вижу :-(
aleks2
2. А InsteadOfTrigger и вовсе не подарочек.
А чем он плох? Можно в трех словах? Или ссылочку? Что-то с ходу не нашел...
aleks2
3. Ну... инспектируйте свою базу. Фсе индексы (кластерные тоже) должны начинаться с Организации.
В этой таблице нет организации как таковой, но первым полем в индексе стоит _RecorderRRef как я понял это ссылка на документ, что собственно и является аналогом организации, т.к. документ может быть создан только по одной организации.
7 дек 12, 12:38    [13593476]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
invm
Member

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

Триггер не может не выполняться. Просто он стал выполняться с другим планом.
7 дек 12, 12:48    [13593571]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
invm, спасибо, понял в чем причина. Разобрал за выходные Ваши примеры, которые Вы размещали тут тогда получается, что лучше чем триггеры городить, лучше индексами озаботиться, чтобы обеспечить последовательный порядок доступа к данным. У таблицы _CRgActP579 индекс обычный, его я конечно могу легко заменить на кластерный (если не ошибаюсь - это не повредит логике приложения, а наоборот даже ускорит работу). А вот как сделать кластерный индекс у временной таблицы не пойму, ведь я не знаю какой запрос создает её перед удалением(поэтому не знаю к какому действию присобачить триггер after), а триггера before у MS SQL 2008 R2 нет...
10 дек 12, 07:06    [13604135]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
aleks2
Guest
JohnySC
А вот как сделать кластерный индекс у временной таблицы не пойму, ведь я не знаю какой запрос создает её перед удалением(поэтому не знаю к какому действию присобачить триггер after), а триггера before у MS SQL 2008 R2 нет...

1. А вот нафега вам это? Временная #таблица не используется с ДРУГИХ connections => взаимоблокировки на ней невозможны.
2. Но если очень хоцца - ALTER TABLE/CREATE INDEX в любой момент ее существования.
10 дек 12, 07:45    [13604167]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
1. Ну как нафига-то? invm приводил прекрасные примеры, что если таблицы перед соединением проиндексировать, то уменьшается вероятность доступа к данным в разном порядке - соответственно уберется взаимоблокировка.
2. Это я понимаю, но как мне вклиниться в момент ее жизни, ведь я могу поймать триггером запрос на удаление из проблемной таблицы только instead или after, а нафига оно мне с заменой или после, ведь мне надо перед запросом создать индекс, а откуда там временная таблица на удаление пришла мне неизвестно чтоб к тому запросу триггер after присобачить.
10 дек 12, 08:52    [13604280]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
aleks2
А вот нафега вам это? Временная #таблица не используется с ДРУГИХ connections => взаимоблокировки на ней невозможны.
меня и не интересуют блокировки на временной, меня интересуют блокировки на реальной таблице, из которой удаляются данные скиданные во временную, и так как они не отсортированы, то доступ к данным в реальной таблице идет в неправильном порядке.
10 дек 12, 08:57    [13604297]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
JohnySC
тогда получается, что лучше чем триггеры городить, лучше индексами озаботиться, чтобы обеспечить последовательный порядок доступа к данным.
Если внимательно посмотрите на план выполнения этого триггера, то заметите, что доступ к таблице deleted идет в порядке кластерного индекса. В противном случае триггер был бы бесполезен. Т.е. триггер -- костыль, компенсирующий невозможность создания кластерного индекса на временной таблице.

Если управление транзакциями осуществляется с клиента, рассмотрите возможность автоматического рестарта транзакции, если она была выбрана жертвой взаимоблокировки.
10 дек 12, 09:59    [13604485]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
invm, сейчас когда вернулись взаимоблокировки по удалению, я сделал кластерный индекс на таблицу и получил вот такой план выполнения одного из запросов удаления:
+
+-------+----------+--------------+------------+-------------+------------+------------------+--------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Rows  | Executes | EstimateRows | EstimateIO | EstimateCPU | AvgRowSize | TotalSubtreeCost | EstimateExecutions | StmtText                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
+-------+----------+--------------+------------+-------------+------------+------------------+--------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 4     | 1        | 1.05E+003    | 0.0484     | 0.00105     | 9          | 1.19             | 1                  |   |--Clustered Index Insert(OBJECT:([_CRgActP579]), SET:([STREAM].[Act] = [Act1012],[STREAM].[_RecorderTRef] = [HRM_test].[dbo].[_CRgActP579].[_RecorderTRef] as [T2].[_RecorderTRef],[STREAM].[_RecorderRRef] = [HRM_test].[dbo].[_CRgActP579].[_RecorderRRef] as [T2].[_RecorderRRef],[STREAM].[_LineNo] = [HRM_test].[dbo].[_CRgActP579].[_LineNo] as [T2].[_LineNo],[STREAM].[_APDateFrom] = [HRM_test].[dbo].[_CRgActP579].[_APDateFrom] as [T2].[_APDateFrom],[STREAM].[_APDateTill] = [HRM_test].[dbo].[_CRgActP579].[_APDateTill] as [T2].[_APDateTill]))                                           |
| 0     | 0        | 1.05E+003    | 0          | 0.000105    | 52         | 1.14             | 1                  |        |--Compute Scalar(DEFINE:([Act1012]=(3)))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| 4     | 1        | 1.05E+003    | 0          | 0.000105    | 48         | 1.14             | 1                  |             |--Top(ROWCOUNT est 0)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| 4     | 1        | 1.05E+003    | 0.266      | 0.258       | 48         | 1.14             | 1                  |                  |--Merge Join(Right Semi Join, MANY-TO-MANY MERGE:([T1].[_RecorderTRef], [T1].[_RecorderRRef], [T1].[_LineNo])=([T2].[_RecorderTRef], [T2].[_RecorderRRef], [T2].[_LineNo]), RESIDUAL:([HRM_test].[dbo].[_CRgActP579].[_RecorderTRef] as [T2].[_RecorderTRef]=[tempdb].[dbo].[#tt61].[_RecorderTRef] as [T1].[_RecorderTRef] AND [HRM_test].[dbo].[_CRgActP579].[_RecorderRRef] as [T2].[_RecorderRRef]=[tempdb].[dbo].[#tt61].[_RecorderRRef] as [T1].[_RecorderRRef] AND [HRM_test].[dbo].[_CRgActP579].[_LineNo] as [T2].[_LineNo]=[tempdb].[dbo].[#tt61].[_LineNo] as [T1].[_LineNo])) |
| 891   | 1        | 891          | 0.0113     | 0.0137      | 32         | 0.0315           | 1                  |                       |--Sort(DISTINCT ORDER BY:([T1].[_RecorderTRef] ASC, [T1].[_RecorderRRef] ASC, [T1].[_LineNo] ASC))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| 891   | 1        | 891          | 0.00535    | 0.00114     | 32         | 0.00648          | 1                  |                       |    |--Table Scan(OBJECT:([tempdb].[dbo].[#tt61] AS [T1]))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| 63879 | 1        | 9.67E+004    | 0.475      | 0.107       | 48         | 0.581            | 1                  |                       |--Clustered Index Scan(OBJECT:([HRM_test].[dbo].[_CRgActP579].[_CRgActP579_Clastered] AS [T2]), ORDERED FORWARD)                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
+-------+----------+--------------+------------+-------------+------------+------------------+--------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
как я понял это выживший запрос, потому, что на второй, который "жертва" ЦУП не дает плана выполнения
10 дек 12, 17:30    [13608463]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
invm
Member

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

Это запрос на вставку, а не удаление.
10 дек 12, 18:43    [13608999]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
invm, да, простите не посмотрел, значит у меня планов удаления вообще нет...
10 дек 12, 21:13    [13609491]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
Так и не смог добиться от ЦУПа плана выполнения запроса на удаление, видимо триггер мешает, чтоли. Вернул бэкап экспериментальной базы, добавил изменения только на уровне 1С. В СУБД все изменения отменились, триггер тоже удалился, и теперь вот ЦУП мне показал план выполнения запроса на удаление:
+
+-------+----------+--------------+------------+-------------+------------+------------------+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Rows  | Executes | EstimateRows | EstimateIO | EstimateCPU | AvgRowSize | TotalSubtreeCost | EstimateExecutions | StmtText                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
+-------+----------+--------------+------------+-------------+------------+------------------+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 0     | 1        | 1.08E+003    | 0.0847     | 0.00215     | 9          | 1.11             | 1                  |   |--Table Delete(OBJECT:([HRM_test].[dbo].[_CRgActP495] AS [T2]), OBJECT:([HRM_test].[dbo].[_CRgActP495].[_CRgActP495_ByRecorder_RN] AS [T2]) WITH UNORDERED PREFETCH)                                                                                                                                                                                                                                                                                                                                                                                                                                |
| 0     | 1        | 1.08E+003    | 0          | 0.000108    | 15         | 1.03             | 1                  |        |--Top(ROWCOUNT est 0)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| 0     | 1        | 1.08E+003    | 0.246      | 0.278       | 15         | 1.03             | 1                  |             |--Merge Join(Right Semi Join, MANY-TO-MANY MERGE:([T1].[_RecorderTRef], [T1].[_RecorderRRef], [T1].[_LineNo])=([T2].[_RecorderTRef], [T2].[_RecorderRRef], [T2].[_LineNo]), RESIDUAL:([HRM_test].[dbo].[_CRgActP495].[_RecorderTRef] as [T2].[_RecorderTRef]=[tempdb].[dbo].[#tt61].[_RecorderTRef] as [T1].[_RecorderTRef] AND [HRM_test].[dbo].[_CRgActP495].[_RecorderRRef] as [T2].[_RecorderRRef]=[tempdb].[dbo].[#tt61].[_RecorderRRef] as [T1].[_RecorderRRef] AND [HRM_test].[dbo].[_CRgActP495].[_LineNo] as [T2].[_LineNo]=[tempdb].[dbo].[#tt61].[_LineNo] as [T1].[_LineNo])) |
| 787   | 1        | 787          | 0.0113     | 0.0119      | 32         | 0.0295           | 1                  |                  |--Sort(DISTINCT ORDER BY:([T1].[_RecorderTRef] ASC, [T1].[_RecorderRRef] ASC, [T1].[_LineNo] ASC))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| 787   | 1        | 787          | 0.00535    | 0.00102     | 32         | 0.00637          | 1                  |                  |    |--Table Scan(OBJECT:([tempdb].[dbo].[#tt61] AS [T1]))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| 72135 | 1        | 1.06E+005    | 0.356      | 0.116       | 40         | 0.473            | 1                  |                  |--Index Scan(OBJECT:([HRM_test].[dbo].[_CRgActP495].[_CRgActP495_ByRecorder_RN] AS [T2]), ORDERED FORWARD)                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
+-------+----------+--------------+------------+-------------+------------+------------------+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
11 дек 12, 17:32    [13614436]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
Продолжаю разбор "залётов" на уровне кода 1С - тут и так куча причин взаимоблокировок...
11 дек 12, 17:41    [13614514]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
У меня идея:
1) добавить в регистр еще одно измерение "Организация" (поставить его на первое место),
2) создать составной (кластерный?) индекс из полей-измерений регистра (если платформа сама не делает)
3) проапдэйтить поле чтобы небыло пустых значений
4) переписать добавление записей в регистр (добавить использование измерения "организация"
5) переписать запрос на удаление так, чтобы организация участвовала в джойне с временной таблицей (хотя я предполагаю что внутренние механизмы платформы сами все подкорректируют при составлении запроса на удаление из регистра, если там будет наличествовать измерение "организация")
12 дек 12, 10:10    [13617013]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
JohnySC
Member

Откуда:
Сообщений: 33
Хорошая идея, спасибо, но я ее уже проработал :-) я как раз про это и писал в предыдущих сообщениях, что в коде Зарплаты 1С есть места где могут образовываться взаимоблокировки.
Дело в том, что в этом регистре есть измерение "Организация" и есть поле "Регистратор", т.е. документ, который прописывает движения в регистр. Т.к. документ может в себе содержать начисления только для одной организации, то они применительно к блокировкам практически равноправны. Проинспектировав код на котором вылезают взаимоблокировки, я обнаружил, что при обращении к регистру отбор идет только по регистратору, и это навело меня на мысль, что для СУБД может не хватать этого отбора, для уменьшения количества блокируемых данных. Поэтому добавил экспериментально отбор еще и по организации - результатов никаких...
Еще заметил, что во взаимоблокировках как гранула блокировки выступает страница - убрал в индексах возможность блокировки страниц - взаимоблокировки остались теми же, но гранулярность стала "ключ". Никак до меня не доходит как код может блокировать чужие данные... Еще конечно лажу по коду в 1С, потому что там многоэтажные запросы, и вполне может быть, что где-то ошибка закралась... Как бы посмотреть при отладке какие данные подвергаются блокировкам и в каком режиме - может кто подскажет? Научился уже отлаживая код в 1С пошагово, смотреть в профайлере какие она в SQL запросы отправляет, но вот какие они данные блокируют - не совсем пока понятно как посмотреть.
12 дек 12, 17:12    [13621049]     Ответить | Цитировать Сообщить модератору
 Re: 1C 8 Зарплата бюджетного учреждения - взаимоблокировки на MS SQL 2008r2  [new]
Гость333
Member

Откуда:
Сообщений: 3683
JohnySC
какие они данные блокируют - не совсем пока понятно как посмотреть.

sys.dm_tran_locks
12 дек 12, 17:16    [13621080]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить