Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как обойти блокировку таблиц итогов по регистрам RG####? (число прочтений - 10826 )
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Как обойти блокировку таблиц итогов по регистрам RG####?
23. Сентября 2009 :: 12:08
Печать  
Типа продолжение.

Есть:
1. 1С SQL 7.70.0.25.
2. Microsoft SQL Server  2000 - 8.00.2055 (Intel X86).
3. В процесе разработки собственного механизма блокировок возникла следующая проблемма. Необходимо при проведении документа который участвует в опер. учете (формирует движения по регистрам) разработать механизм исключающий взаимоблокировки.

Взаимоблокировки возникают при вызове хран. процедур вида "_1sp_RG####_Change" где есть тот же "Update RG####".

Спасибо.
  
Наверх
ICQ  
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #1 - 23. Сентября 2009 :: 13:29
Печать  
Да наверное точно так же, как и с бухитогами. Принципиальной разницы-то нет.

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #2 - 23. Сентября 2009 :: 13:42
Печать  
Принципиальная разница как раз есть - у регистров всё гораздо проще и с UPDATE бороться не нужно.

Как-то вы странно к вопросу подходите..  Озадачен
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #3 - 23. Сентября 2009 :: 13:43
Печать  
classic писал(а) 23. Сентября 2009 :: 13:29:
Да наверное точно так же, как и с бухитогами. Принципиальной разницы-то нет.

Как быстро потом таблицы сливать - вот вопросУлыбка

1.И чего когда сливать будете откуда и куда таблицы тоже надо блокировать.
2.Как считать остатки между этими событиями когда данные в двух
таблицах.Все запросы переписывать через новый способ.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #4 - 23. Сентября 2009 :: 13:45
Печать  
Да и не панацея избавиться от блокировок,
в целом это в принципе невозможно,
а задача их правильно устанавливать.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #5 - 23. Сентября 2009 :: 13:54
Печать  
classic писал(а) 23. Сентября 2009 :: 13:29:
Да наверное точно так же, как и с бухитогами. Принципиальной разницы-то нет.

Как быстро потом таблицы сливать - вот вопросУлыбка


Идея как сливать бух. итоги уже реализована (конечно в тест. варианте). Если интересно могу поделиться.
Насчет опер. итогов думаю будет что то аналогичное.
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #6 - 23. Сентября 2009 :: 13:56
Печать  
berezdetsky писал(а) 23. Сентября 2009 :: 13:42:
Принципиальная разница как раз есть - у регистров всё гораздо проще и с UPDATE бороться не нужно.

Как-то вы странно к вопросу подходите..  Озадачен


Это как же, как раз проблема с UPDATE и имеет место. Два документа по одним и тем же измерениям, по одному и тому же периоду "хотят" проапдейтить итог. Взаимоблокировка не избежна... Или я чего то не понимаю?
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #7 - 23. Сентября 2009 :: 14:08
Печать  
Z1 писал(а) 23. Сентября 2009 :: 13:43:
1.И чего когда сливать будете откуда и куда таблицы тоже надо блокировать.
2.Как считать остатки между этими событиями когда данные в двух
таблицах.Все запросы переписывать через новый способ.


Есть такой вариант:
1. В таб. "RG" добавить два поля:
а).
Код
Выбрать все
[ROW_ID] [int] IDENTITY(1,1) NOT NULL 

.
б).
Код
Выбрать все
[FlaIns] [tinyint] NOT NULL CONSTRAINT [DF_RG####_FlaIns]  DEFAULT (0) 

это признак того что это "не апдейт", а "инсет" итог. Который необходимо свернуть.
2. Также в таблице "RG" изменить индекс (добавить в него поле [ROW_ID]).
3. Изменить текст хр. проц. "_1sp_RG####_Change на
Код
Выбрать все
insert into RG#### values(@per,@p1,@p2, ..., 1) 

, где 1 это значение поля [FlaIns].
4. Периодически "сворачивать" итоги.
При этом итоги считаються в он лайн (тоисть в период между сворачиванием) без дополнительных затрат.

Как?

« Последняя редакция: 23. Сентября 2009 :: 15:36 - chicago »  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #8 - 23. Сентября 2009 :: 14:08
Печать  
chicago писал(а) 23. Сентября 2009 :: 13:56:
berezdetsky писал(а) 23. Сентября 2009 :: 13:42:
Принципиальная разница как раз есть - у регистров всё гораздо проще и с UPDATE бороться не нужно.

Как-то вы странно к вопросу подходите..  Озадачен


Это как же, как раз проблема с UPDATE и имеет место. Два документа по одним и тем же измерениям, по одному и тому же периоду "хотят" проапдейтить итог. Взаимоблокировка не избежна... Или я чего то не понимаю?


Что то ты не того говоришь
Ситуация1
Есть Док1 в нем товар1 склад1 приход +100
Есть Док2 в нем товар1 склад1 приход +300
Начинаем их одновременно проводить
Пусть Док1 начал раньше
1. update rg +100
2.Пока не закончиться транзакция по Док1 Док2
ждет для update по блокировке индекса
3.Док1 завершили
4.Док2 делает Док2 + 300
Все ок
никаких взаимоблокировок нет в принципе

Единстевенное но
в rg нет этого движения
1. док1 начинает делать update
update не удалось
2. док2 начинает делать update
update не удалось
3. док1 делает insert все ок
4док2 делает insert и вываливается по ошибке так как индекс не уникальный.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #9 - 23. Сентября 2009 :: 14:13
Печать  
Ситуация2
Есть Док1 в нем
товар1 склад1 приход +100
товар2 склад1 приход +100

Есть Док2 в нем
товар2 склад1 приход +300
товар1 склад1 приход +300
Начинаем их одновременно проводить
Пусть Док1 начал раньше
1. update rg +100 товар1 в док1 по первой строке
2. update rg +300 товар2 в док2 по первой строке
3. update rg +100 товар2 в док1 по второй строке
взаимоблокировка с 1 ждем освобождения 1
4. update rg +300 товар1 в док1 по второй строке
взаимоблокировка с 2 ждем освобождения 2
3 и 4 вместе дают взаимоблокировку
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #10 - 23. Сентября 2009 :: 14:19
Печать  
(chicago)
пост 7 не осилил.
также не понятно о каких таблицах речь о доп таблицах
или о родных 1с.
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #11 - 23. Сентября 2009 :: 14:54
Печать  
chicago писал(а) 23. Сентября 2009 :: 13:54:
Идея как сливать бух. итоги уже реализована (конечно в тест. варианте). Если интересно могу поделиться.

Поделись, если не жалко. А то я совсем в лоб задачу решил. В целом надежно, но долго работает.

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


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #12 - 23. Сентября 2009 :: 16:05
Печать  
Z1 писал(а) 23. Сентября 2009 :: 14:08:
Что то ты не того говоришь
Ситуация1
Есть Док1 в нем товар1 склад1 приход +100
Есть Док2 в нем товар1 склад1 приход +300
Начинаем их одновременно проводить
Пусть Док1 начал раньше
1. update rg +100
2.Пока не закончиться транзакция по Док1 Док2
ждет для update по блокировке индекса
3.Док1 завершили
4.Док2 делает Док2 + 300
Все ок
никаких взаимоблокировок нет в принципе

Единстевенное но
в rg нет этого движения
1. док1 начинает делать update
update не удалось
2. док2 начинает делать update
update не удалось
3. док1 делает insert все ок
4док2 делает insert и вываливается по ошибке так как индекс не уникальный.


1. Да все это как раз и делается, что бы Док2 "не ждал" завершения транзакции Док1 (это о Ситуации1), а мог проводится паралельно с Док1 ибо таких "Док2" может быть весьма не мало.
2. На счет "все ок никаких взаимоблокировок нет в принципе" немогу согласиться, но спорить не буду.

  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #13 - 23. Сентября 2009 :: 16:09
Печать  
Z1 писал(а) 23. Сентября 2009 :: 14:19:
(chicago)
пост 7 не осилил.
также не понятно о каких таблицах речь о доп таблицах
или о родных 1с.


А я вопрос не "осилил" где в моем посте №7 идет речь о "доп таблицах"? Озадачен
Речь идет только о "родных 1с" таблицах.
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #14 - 23. Сентября 2009 :: 16:26
Печать  
classic писал(а) 23. Сентября 2009 :: 14:54:
Поделись, если не жалко. А то я совсем в лоб задачу решил. В целом надежно, но долго работает.


Пожалуйста
Код
Выбрать все
BEGIN TRAN

SET NOCOUNT ON
SET LOCK_TIMEOUT 500
DECLARE @РезБло smallint
SELECT @РезБло = 1
FROM dbo._1SBKTTLC AS ТабБло WITH (TABLOCKX, HOLDLOCK)
IF @РезБло <> 1
ROLLBACK TRAN
DECLARE @DATE_Ins DATETIME
DECLARE @ACCDTID_Ins CHAR(9)
DECLARE @ACCKTID_Ins CHAR(9)
DECLARE @CURRID_Ins CHAR(9)
DECLARE @KIND_Ins CHAR(1)
DECLARE @OB1_Ins NUMERIC(14, 4)
DECLARE @OB2_Ins NUMERIC(14, 4)
DECLARE @OB3_Ins NUMERIC(14, 4)
DECLARE @DTFLAGS_Ins TINYINT
DECLARE @KTFLAGS_Ins TINYINT
DECLARE TabCur CURSOR FOR
	SELECT
		DATE
		, ACCDTID
		, ACCKTID
		, CURRID
		, KIND
		, SUM(OB1) AS OB1
		, SUM(OB2) AS OB2
		, SUM(OB3) AS OB3
		, DTFLAGS
		, KTFLAGS
	FROM dbo._1SBKTTLC_Ins AS _1SBKTTLC_Ins WITH (TABLOCKX, HOLDLOCK)
	GROUP BY
		DATE
		, ACCDTID
		, ACCKTID
		, CURRID
		, KIND
		, DTFLAGS
		, KTFLAGS
	HAVING
		(SUM(OB1) <> 0) OR
        (SUM(OB2) <> 0) OR
        (SUM(OB3) <> 0)
OPEN TabCur
WHILE @@FETCH_STATUS = 0
BEGIN
	FETCH NEXT FROM TabCur INTO
	@DATE_Ins
	, @ACCDTID_Ins
	, @ACCKTID_Ins
	, @CURRID_Ins
	, @KIND_Ins
	, @OB1_Ins
	, @OB2_Ins
	, @OB3_Ins
	, @DTFLAGS_Ins
	, @KTFLAGS_Ins
	UPDATE dbo._1SBKTTLC
		SET
			OB1 = OB1 + @OB1_Ins,
			OB2 = OB2 + @OB2_Ins,
			OB3 = OB3 + @OB3_Ins,
			DTFLAGS = @DTFLAGS_Ins,
			KTFLAGS = @KTFLAGS_Ins
		WHERE
			(DATE = @DATE_Ins) AND
			(KIND = @KIND_Ins) AND
			(ACCKTID = @ACCKTID_Ins) AND
			(ACCDTID = @ACCDTID_Ins) AND
			(CURRID = @CURRID_Ins)
	IF @@ROWCOUNT = 0 BEGIN
		INSERT INTO dbo._1SBKTTLC VALUES
		(
			@DATE_Ins, @ACCDTID_Ins, @ACCKTID_Ins, @CURRID_Ins, @KIND_Ins, @OB1_Ins, @OB2_Ins, @OB3_Ins, @DTFLAGS_Ins, @KTFLAGS_Ins
		)
	END
END
CLOSE TabCur
DEALLOCATE TabCur
DELETE FROM dbo._1SBKTTLC_Ins
COMMIT TRAN
SET NOCOUNT OFF
 



Никаких гарантий, что это правильно и будет быстрее.
  
Наверх
ICQ  
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #15 - 24. Сентября 2009 :: 05:03
Печать  
chicago писал(а) 23. Сентября 2009 :: 16:26:
Никаких гарантий, что это правильно и будет быстрее.

Спасибо! Так и знал, что одним update тут не обойтисьУлыбка. Заодно и с курсорами разберусь, был такой пробел в знанияхУлыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #16 - 24. Сентября 2009 :: 05:22
Печать  
Для начала прочтите прошлогодний опыт
http://www.1cpp.ru/forum/YaBB.pl?num=1226039405
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #17 - 24. Сентября 2009 :: 05:29
Печать  
Цитата:
это признак того что это "не апдейт", а "инсет" итог. Который необходимо свернуть.
2. Также в таблице "RG" изменить индекс (добавить в него поле [ROW_ID]).

тем самым "убъете" индексацию 1с. Скорость поиска итогов очень
сильно упадет. Речь идет о индексации по первому измерению.



Цитата:
4. Периодически "сворачивать" итоги.
При этом итоги считаються в он лайн (тоисть в период между сворачиванием) без дополнительных затрат.

Пока итоги не свернуты как получать итоги - это надо переписать все запросы.
Во время сворачивания итогов ты все равно вынужден будешь ставить блокировку на всю таблицу rg.
« Последняя редакция: 24. Сентября 2009 :: 06:53 - Z1 »  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #18 - 24. Сентября 2009 :: 05:58
Печать  
Критика решения из #14
Код
Выбрать все
SELECT @РезБло = 1
FROM dbo._1SBKTTLC AS ТабБло WITH (TABLOCKX, HOLDLOCK)
 


тем самым вы наложили блокировку на всю талицу _1SBKTTLC
т.е ни о каком "Как обойти блокировку таблицы _1SBKTTLC?" не может быть и речи
до конца транзакции остальные проведения ждут.

т.к @РезБло = 1 то оператор просто лишний
Код
Выбрать все
IF @РезБло <> 1
ROLLBACK TRAN
 



Ваше решение дает выигрыш за счет локал свертки.
Т.е поясню предположим есть 100 строк с проводками документ проведен.
Вы меняете только одну строку . например сумму со 100 до 150
В вашей итоговой таблице останется только одна ненулевая строка с суммой 50. Предполагается что документ дает теже самые проводки.
и только будет одна строка изменяющая итоговую таблицу _1SBKTTLC.
За счет этого и выигрыш. но при этом все блокируется.
Еще большего выигрыша можно достичь переписав #14 без курсора и в доп таблицу добавив @@SPID
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #19 - 24. Сентября 2009 :: 06:05
Печать  
Z1 писал(а) 24. Сентября 2009 :: 05:58:
Критика решения из #14
...
тем самым вы наложили блокировку на всю талицу _1SBKTTLC
т.е ни о каком "Как обойти блокировку таблицы _1SBKTTLC?" не может быть и речи
до конца транзакции остальные проведения ждут.


Эта процедура запускается раз в сутки. Ночью. Когда в базе никого нет. А если вдруг есть - то пусть ждет, потому что днем работать нужно.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #20 - 24. Сентября 2009 :: 06:17
Печать  
classic писал(а) 24. Сентября 2009 :: 06:05:
Z1 писал(а) 24. Сентября 2009 :: 05:58:
Критика решения из #14
...
тем самым вы наложили блокировку на всю талицу _1SBKTTLC
т.е ни о каком "Как обойти блокировку таблицы _1SBKTTLC?" не может быть и речи
до конца транзакции остальные проведения ждут.


Эта процедура запускается раз в сутки. Ночью. Когда в базе никого нет. А если вдруг есть - то пусть ждет, потому что днем работать нужно.

ну получается наверное надо выкладывать решение в виде тестовой конфигурации, а то как сейчас можно все по разному интерпритировать один и тот же текст.

Тогда получается следущее : итоги Вам надо получать не по одной таблице а по двум.
А во вторых предположим что есть документ в нем 100 строк
и 100 проводок.
Я этот документ ничего не меняя перепроведу 200 раз ( зачем не спрашивайте ) тогда в доп таблице
у нас будет 200*100*2 = 40 000 лишних строк которые в сумме будут давать 0.
При массовой работе (по крайней мере у нас ) в документы записывается потом всякий мусор с точки зрения проводок,движений.
Какой нибудь комментарий, назначение платежа,фио водителя,
номер машины и.т.д доп свебения о товаре реальной отгрузке.

Опять же вопрос когда Вы считаете итоги по новому алгоритму Вы эту доп таблицу блокируете или нет ? (проблема грязного чтения )


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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #21 - 24. Сентября 2009 :: 06:36
Печать  
посмотрел бегло текст _1sp__1SBKTTL_ChangeTotal
опять двадцатьпять
Цитата:
    OBDT1=case when abs(OBDT1+@ObDt1)>99999999999.999 then 99999999999.999 else OBDT1+@ObDt1 end,
    OBDT2=case when abs(OBDT2+@ObDt2)>99999999999.999 then 99999999999.999 else OBDT2+@ObDt2 end,
    OBDT3=case when abs(OBDT3+@ObDt3)>99999999999.999 then 99999999999.999 else OBDT3+@ObDt3 end,
    OBKT1=case when abs(OBKT1+@ObKT1)>99999999999.999 then 99999999999.999 else OBKT1+@ObKT1 end,
    OBKT2=case when abs(OBKT2+@ObKT2)>99999999999.999 then 99999999999.999 else OBKT2+@ObKT2 end,
    OBKT3=case when abs(OBKT3+@ObKT3)>99999999999.999 then 99999999999.999 else OBKT3+@ObKT3 end,
    SD   =case when abs(SD   +@Sd   )>99999999999.999 then 99999999999.999 else SD   +@Sd    end

Если переполнение идет в минус то чудным образом меняем минус на плюс. Если кто-то скажет что ситуация практически нереальная тогда этот фрагмент кода просто мусор который смело можно удалить ( а сейчас просто теряем время на нереальные проверки )
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #22 - 24. Сентября 2009 :: 06:41
Печать  
Z1 писал(а) 24. Сентября 2009 :: 05:29:
тем самым "убъете" индексацию 1с. Скорость поиска итогов очень
сильно упадет. Речь идет о индексации по первому измерению.


1. Уточню:
индекс до изменений состоит из:
Код
Выбрать все
[PERIOD] ASC,
[SP1] ASC,
[SP2] ASC,
... 


индекс после изменений:
Код
Выбрать все
[PERIOD] ASC,
[SP1] ASC,
[SP2] ASC,
...
[ROW_ID] ASC 

.
2. Пробовал посмотреть статистику выполнения простого запроса (смотри вложение _03), где сверху до изменений (без ROW_ID), внизу с ROW_ID. Да есть "падение", но это десятые милисекунды. Не уж то это и есть "скорость поиска итогов очень
сильно упадет"?
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #23 - 24. Сентября 2009 :: 06:51
Печать  
вопрос по индексу снимается
я почему то подумал( слишком быстро прочитал) что Вы создадите
индекс
[ROW_ID] ASC,
[PERIOD] ASC,
[SP1] ASC,
[SP2] ASC
...

off Кстати что это за среда в которой рисуночек создан.
похоже на manegment studio но все равно научите что за среда и что за команда.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #24 - 24. Сентября 2009 :: 07:00
Печать  
Z1 писал(а) 24. Сентября 2009 :: 05:29:
Пока итоги не свернуты как получать итоги - это надо переписать все запросы.


Зачем? Ну чесно, не понимаю зачем переписывать запросы? Все запросы к регистру (к RG):
- имеют условие на [PERIOD];
- все имеют агрегацию по измерениям.

Z1 писал(а) 24. Сентября 2009 :: 05:29:
Во время сворачивания итогов ты все равно вынужден будешь ставить блокировку на всю таблицу rg.


Да буду вынужден, что бы перестраховатся. Сворачивание итогов будет происходить в час миним нагрузки на БД, ночю к примеру.
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #25 - 24. Сентября 2009 :: 07:16
Печать  
Z1 писал(а) 24. Сентября 2009 :: 06:51:
off Кстати что это за среда в которой рисуночек создан.
похоже на manegment studio но все равно научите что за среда и что за команда.


Совершенно верно, это и есть "Microsoft SQL Server Management Studio Express 9.00.2047.00".

Ну а на счет рисунка, то там же и есть опция "Include Client Statistics".
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #26 - 24. Сентября 2009 :: 07:17
Печать  
chicago писал(а) 24. Сентября 2009 :: 07:16:
Z1 писал(а) 24. Сентября 2009 :: 06:51:
off Кстати что это за среда в которой рисуночек создан.
похоже на manegment studio но все равно научите что за среда и что за команда.


Совершенно верно, это и есть "Microsoft SQL Server Management Studio Express 9.00.2047.00".

Ну а на счет рисунка, то там же и есть опция "Include Client Statistics".

и это работает даже для баз sql200 ?
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #27 - 24. Сентября 2009 :: 07:26
Печать  
Z1 писал(а) 24. Сентября 2009 :: 05:58:
Критика решения из #14
Код
Выбрать все
SELECT @РезБло = 1
FROM dbo._1SBKTTLC AS ТабБло WITH (TABLOCKX, HOLDLOCK)
 


тем самым вы наложили блокировку на всю талицу _1SBKTTLC
т.е ни о каком "Как обойти блокировку таблицы _1SBKTTLC?" не может быть и речи
до конца транзакции остальные проведения ждут.


Да совершенно верно именно - "наложил блокировку на всю талицу" это перестраховка, повторюсь все механизмы сворачивания будут происходить в час мин. нагрузки (когда никакого паралелизма и не нужно) или вообще в монопольном режиме. Сразу угадать сложно, это всего лиш возможная модель.

Z1 писал(а) 24. Сентября 2009 :: 05:58:
т.к @РезБло = 1 то оператор просто лишний
Код
Выбрать все
IF @РезБло <> 1
ROLLBACK TRAN
 




Совершенно согласен. Это был изначальный вариант.

Z1 писал(а) 24. Сентября 2009 :: 05:58:
Ваше решение дает выигрыш за счет локал свертки.
Т.е поясню предположим есть 100 строк с проводками документ проведен.
Вы меняете только одну строку . например сумму со 100 до 150
В вашей итоговой таблице останется только одна ненулевая строка с суммой 50. Предполагается что документ дает теже самые проводки.
и только будет одна строка изменяющая итоговую таблицу _1SBKTTLC.
За счет этого и выигрыш. но при этом все блокируется.
Еще большего выигрыша можно достичь переписав #14 без курсора и в доп таблицу добавив @@SPID


Ок, давайте пока примем за правило то, что свертка должна происходить только в монопольном режиме, эти вопросы отпадают автоматически.
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #28 - 24. Сентября 2009 :: 07:32
Печать  
Z1 писал(а) 24. Сентября 2009 :: 07:17:
и это работает даже для баз sql200 ?


Не могу утверждать с уверенн. 100% что всегда, но pvase это удалось "схрестить", чем я и успешно пользуюсь по сей день.
А также там есть аналог BOL, даже на рус. языке (при том что он и обновляем). Не идеал., но во многом лучший инстр. чем тот что в поставке с MS SQL Server 2000.
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #29 - 24. Сентября 2009 :: 07:33
Печать  
classic писал(а) 24. Сентября 2009 :: 06:05:
Z1 писал(а) 24. Сентября 2009 :: 05:58:
Критика решения из #14
...
тем самым вы наложили блокировку на всю талицу _1SBKTTLC
т.е ни о каком "Как обойти блокировку таблицы _1SBKTTLC?" не может быть и речи
до конца транзакции остальные проведения ждут.


Эта процедура запускается раз в сутки. Ночью. Когда в базе никого нет. А если вдруг есть - то пусть ждет, потому что днем работать нужно.


Типа того. Улыбка
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #30 - 24. Сентября 2009 :: 07:51
Печать  
chicago писал(а) 24. Сентября 2009 :: 07:00:
Z1 писал(а) 24. Сентября 2009 :: 05:29:
Пока итоги не свернуты как получать итоги - это надо переписать все запросы.


Зачем? Ну чесно, не понимаю зачем переписывать запросы? Все запросы к регистру (к RG):
- имеют условие на [PERIOD];
- все имеют агрегацию по измерениям.

Z1 писал(а) 24. Сентября 2009 :: 05:29:
Во время сворачивания итогов ты все равно вынужден будешь ставить блокировку на всю таблицу rg.


Да буду вынужден, что бы перестраховатся. Сворачивание итогов будет происходить в час миним нагрузки на БД, ночю к примеру.


Про агрегацию не понял только что проверил
есть код
Код
Выбрать все
	Зн = Регистр.ОстаткиТоваров.Остаток(Товар,СтрокаСклад,СклЯчейка,"ОстатокТовара");
	Сообщить("Товар = " + "'" + Глоб_meta.ЗначениеВСтрокуБД(Товар)  + "'");
	Сообщить("СтрокаСклад = " + "'" + Глоб_meta.ЗначениеВСтрокуБД(СтрокаСклад)  + "'");
	Сообщить("СклЯчейка = " + "'" + Глоб_meta.ЗначениеВСтрокуБД(СклЯчейка)  + "'");
	Сообщить("Зн = " + Зн);
 


вот что выполнил sql ( profiler)
declare @P1 numeric(18,5)
set @P1=5.95700
exec _1sp_RG99_Select 'Dec  1 2009 12:00:00:000AM', '   13KОФИ', '     BСКЛ', '   1CMZZZ', @P1 output
select @P1

вот что получил в 1с
Товар = '   13KОФИ'
СтрокаСклад = '     BСКЛ'
СклЯчейка = '   1CMZZZ'
Зн = 5.957

Агрегации не вижу.
Если я правильно понимаю всю Вашу идею то Ваш вариант
вернет в 1с первую попавшиюся строку удовлетворяющую этому условию.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #31 - 24. Сентября 2009 :: 08:05
Печать  
Z1 писал(а) 24. Сентября 2009 :: 06:17:
ну получается наверное надо выкладывать решение в виде тестовой конфигурации, а то как сейчас можно все по разному интерпритировать один и тот же текст.


Согласен, вероятно и поэтому возникает много разных "интерпретаций", но в этом и есть свой "+". Если конечно успею, то за выходные можно и что то представить в качестве тест. конф.

Z1 писал(а) 24. Сентября 2009 :: 06:17:
Тогда получается следущее : итоги Вам надо получать не по одной таблице а по двум.


Да так и есть (если речь идет о бух. итогах), есть таблица "свернутых" итогов (штатная 1С) и таблица "не свернутых", так называемая таблица итогов "по инсету". В он лайн режиме все эти таблицы динамически свернути в предсталении, что бы не переписывать запросы к бух итогам. Да тут есть свои "но":
- даное представление пока не удается индексировать, так как там есть "UNION";
- да это может работать несколько медленнее;
- и много еще чего.

Но пока это работает.

Z1 писал(а) 24. Сентября 2009 :: 06:17:
А во вторых предположим что есть документ в нем 100 строк
и 100 проводок.
Я этот документ ничего не меняя перепроведу 200 раз ( зачем не спрашивайте ) тогда в доп таблице
у нас будет 200*100*2 = 40 000 лишних строк которые в сумме будут давать 0.


Да это может быть 100 и более инсетов в таблицу итогов "по инсету" "которые в сумме будут давать 0". Да с точки зрения логики это "лишнене", но пока лучшего решения я не знаю. Озадачен

Но в расматр. конф. проводки всех док. сворачиваются, среднестатистически док. из 100 строк это как правило 5-10 свернутих проводок. Ну разве банк. выписка в которой эти строки просто нельзя свернуть.

Z1 писал(а) 24. Сентября 2009 :: 06:17:
При массовой работе (по крайней мере у нас ) в документы записывается потом всякий мусор с точки зрения проводок,движений.
Какой нибудь комментарий, назначение платежа,фио водителя,
номер машины и.т.д доп свебения о товаре реальной отгрузке.


Стараемся не очень "мусорить". Улыбка

Z1 писал(а) 24. Сентября 2009 :: 06:17:
Опять же вопрос когда Вы считаете итоги по новому алгоритму Вы эту доп таблицу блокируете или нет ? (проблема грязного чтения )


Если речь идет о бух. итогах в он лайн режиме (например при пров. док) нет не блокирую. Почему?

Потому что:
- все проводки "рисуються" на основании данных полученых из регистров (опер учет.), чесно говоря это как некоторое отражение опер. учета в бух учете. Да есть некот. исключения, но это 1-2 %, которими мы пока можем пренебречь;
- в нач. обраб. проведения обязательно накладываеться блокировка (ROWLOCK) на регистры (на табл RG) на основании которых будут расчитаны проводки.

Грубо говоря, если Док1 хочет списать (расход) Товар1 со Склад1, то он накл. блок. на табл. итогов (RG) по измерениям Товар1, Склад1 и период. При этом Док2 (с теми же параметрами списания: ДатаДок, Товар1 и Склад1) будет ждать оконч. проведения Док1. Тут без "паралелизма".

Давайте, так если есть вопросы по бух. итогам то - в предыдущий топик http://www.1cpp.ru/forum/YaBB.pl?num=1253281188, если по опер. то тут, а то уж вышла какая то "куча".
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #32 - 24. Сентября 2009 :: 08:07
Печать  
Z1 писал(а) 24. Сентября 2009 :: 06:36:
посмотрел бегло текст _1sp__1SBKTTL_ChangeTotal
опять двадцатьпять
Цитата:
   OBDT1=case when abs(OBDT1+@ObDt1)>99999999999.999 then 99999999999.999 else OBDT1+@ObDt1 end,
   OBDT2=case when abs(OBDT2+@ObDt2)>99999999999.999 then 99999999999.999 else OBDT2+@ObDt2 end,
   OBDT3=case when abs(OBDT3+@ObDt3)>99999999999.999 then 99999999999.999 else OBDT3+@ObDt3 end,
   OBKT1=case when abs(OBKT1+@ObKT1)>99999999999.999 then 99999999999.999 else OBKT1+@ObKT1 end,
   OBKT2=case when abs(OBKT2+@ObKT2)>99999999999.999 then 99999999999.999 else OBKT2+@ObKT2 end,
   OBKT3=case when abs(OBKT3+@ObKT3)>99999999999.999 then 99999999999.999 else OBKT3+@ObKT3 end,
   SD   =case when abs(SD   +@Sd   )>99999999999.999 then 99999999999.999 else SD   +@Sd    end

Если переполнение идет в минус то чудным образом меняем минус на плюс. Если кто-то скажет что ситуация практически нереальная тогда этот фрагмент кода просто мусор который смело можно удалить ( а сейчас просто теряем время на нереальные проверки )


На оптимизацию и переделывание "этого" пока нет времени, посему...
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #33 - 24. Сентября 2009 :: 08:11
Печать  
ок давайте здесь обсуждать оперативный учет
в той ветке бух проводки.
в посте 30 речь шла об оперативном учете.
Что скажите о посте 30 ?
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #34 - 24. Сентября 2009 :: 09:19
Печать  
Z1 писал(а) 24. Сентября 2009 :: 07:51:
Про агрегацию не понял только что проверил
есть код
Код
Выбрать все
	Зн = Регистр.ОстаткиТоваров.Остаток(Товар,СтрокаСклад,СклЯчейка,"ОстатокТовара");
	Сообщить("Товар = " + "'" + Глоб_meta.ЗначениеВСтрокуБД(Товар)  + "'");
	Сообщить("СтрокаСклад = " + "'" + Глоб_meta.ЗначениеВСтрокуБД(СтрокаСклад)  + "'");
	Сообщить("СклЯчейка = " + "'" + Глоб_meta.ЗначениеВСтрокуБД(СклЯчейка)  + "'");
	Сообщить("Зн = " + Зн);
 


вот что выполнил sql ( profiler)
declare @P1 numeric(18,5)
set @P1=5.95700
exec _1sp_RG99_Select 'Dec  1 2009 12:00:00:000AM', '   13KОФИ', '     BСКЛ', '   1CMZZZ', @P1 output
select @P1

вот что получил в 1с
Товар = '   13KОФИ'
СтрокаСклад = '     BСКЛ'
СклЯчейка = '   1CMZZZ'
Зн = 5.957

Агрегации не вижу.
Если я правильно понимаю всю Вашу идею то Ваш вариант
вернет в 1с первую попавшиюся строку удовлетворяющую этому условию.


Да эта конструкция буде работать не коректно, но опять таки специф. сущ. конф. - все обращения к регистрам только через 1СРР+.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #35 - 24. Сентября 2009 :: 09:44
Печать  
А остатки по стандартному запросу 1с будут
Запрос = СоздатьОбъект("Запрос");
Функция КонОст будет работать корректно ?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #36 - 24. Сентября 2009 :: 09:50
Печать  
Также подумал для твоего решения индекс
по rg равен
[PERIOD] ASC,
[SP1] ASC,
[SP2] ASC,
...
[ROW_ID] ASC

вместо
[PERIOD] ASC,
[SP1] ASC,
[SP2] ASC,

Этот индекс немного хуже оригинального потому что по всем измерениям у нас уже нет условия уникальности значит в общем случае остатки мы будет получать чуть дольше и больше нагружая sql  server даже в том случае если у нас в rg единсвенное значение(строка) по конкретным измерениям.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #37 - 24. Сентября 2009 :: 09:57
Печать  
(chicago)

кстати раз у тебя хранимые процедуры вида
_1sp_RG99_Select
не должны выполняться ни при каких обстоятельствах то лучше их удалить совсем чем выяснятьпотом  что произошел какой-то некорректный расчет через эти функции.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #38 - 24. Сентября 2009 :: 10:32
Печать  
Z1 писал(а) 24. Сентября 2009 :: 09:44:
А остатки по стандартному запросу 1с будут
Запрос = СоздатьОбъект("Запрос");
Функция КонОст будет работать корректно ?


Да. Будет след запрос (с агрегацией):
Код
Выбрать все
declare @P1 int
set @P1=180150017
declare @P2 int
set @P2=8
declare @P3 int
set @P3=1
declare @P4 int
set @P4=1
exec sp_cursoropen @P1 output, N'select  RG####.SP1..., sum(RG####.SP#...),...
from  RG####(NOLOCK)
where PERIOD = ''20...''  and ...
group by RG####.SP1,... ', @P2 output, @P3 output, @P4 output
select @P1, @P2, @P3, @P4 

  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #39 - 24. Сентября 2009 :: 10:38
Печать  
Z1 писал(а) 24. Сентября 2009 :: 09:50:
Также подумал для твоего решения индекс
по rg равен
[PERIOD] ASC,
[SP1] ASC,
[SP2] ASC,
...
[ROW_ID] ASC

вместо
[PERIOD] ASC,
[SP1] ASC,
[SP2] ASC,

Этот индекс немного хуже оригинального потому что по всем измерениям у нас уже нет условия уникальности значит в общем случае остатки мы будет получать чуть дольше и больше нагружая sql  server даже в том случае если у нас в rg единсвенное значение(строка) по конкретным измерениям.


Да "немного хуже", я признаю что будуть некоторые потери (пока предполагается, что они будут не весьма существенны). Мы ищем не идеал, а компромис.  Подмигивание
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #40 - 24. Сентября 2009 :: 10:41
Печать  
chicago писал(а) 24. Сентября 2009 :: 10:32:
Z1 писал(а) 24. Сентября 2009 :: 09:44:
А остатки по стандартному запросу 1с будут
Запрос = СоздатьОбъект("Запрос");
Функция КонОст будет работать корректно ?


Да. Будет след запрос (с агрегацией):
Код
Выбрать все
declare @P1 int
set @P1=180150017
declare @P2 int
set @P2=8
declare @P3 int
set @P3=1
declare @P4 int
set @P4=1
exec sp_cursoropen @P1 output, N'select  RG####.SP1..., sum(RG####.SP#...),...
from  RG####(NOLOCK)
where PERIOD = ''20...''  and ...
group by RG####.SP1,... ', @P2 output, @P3 output, @P4 output
select @P1, @P2, @P3, @P4 


зачем курсор если легко без него написать и
работать будет гораздо быстрее  чем с курсором ?
просто sum ,без группировок.
это в случае если я правильно понял и речь идет
об xp типа _1sp_RG99_Select
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #41 - 24. Сентября 2009 :: 10:49
Печать  
chicago писал(а) 24. Сентября 2009 :: 10:38:
Z1 писал(а) 24. Сентября 2009 :: 09:50:
Также подумал для твоего решения индекс
по rg равен
[PERIOD] ASC,
[SP1] ASC,
[SP2] ASC,
...
[ROW_ID] ASC

вместо
[PERIOD] ASC,
[SP1] ASC,
[SP2] ASC,

Этот индекс немного хуже оригинального потому что по всем измерениям у нас уже нет условия уникальности значит в общем случае остатки мы будет получать чуть дольше и больше нагружая sql  server даже в том случае если у нас в rg единсвенное значение(строка) по конкретным измерениям.


Да "немного хуже", я признаю что будуть некоторые потери (пока предполагается, что они будут не весьма существенны). Мы ищем не идеал, а компромис.  Подмигивание

Слишком велика цена за компромис. Речь о высоконагруженных
sql базах. А о слабозагруженных и говорить смысла нет.
В целом извлечение остатков по вычисленным регистрам происходит гораздо чаще чем рассчет самих этих остатков.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #42 - 24. Сентября 2009 :: 10:51
Печать  
Z1 писал(а) 24. Сентября 2009 :: 09:57:
(chicago)

кстати раз у тебя хранимые процедуры вида
_1sp_RG99_Select
не должны выполняться ни при каких обстоятельствах то лучше их удалить совсем чем выяснятьпотом  что произошел какой-то некорректный расчет через эти функции.


Ну "удалить совсем" не совсем хорошо, я думаю ее можно модифицировать, с использ. агрегации.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #43 - 24. Сентября 2009 :: 10:55
Печать  
chicago писал(а) 24. Сентября 2009 :: 10:51:
Z1 писал(а) 24. Сентября 2009 :: 09:57:
(chicago)

кстати раз у тебя хранимые процедуры вида
_1sp_RG99_Select
не должны выполняться ни при каких обстоятельствах то лучше их удалить совсем чем выяснятьпотом  что произошел какой-то некорректный расчет через эти функции.


Ну "удалить совсем" не совсем хорошо, я думаю ее можно модифицировать, с использ. агрегации.

ну тогда ты сталкнешься с теми же проблемами блокировок
пока модуль проведения пишет в эту доп таблицу то твоя новая
функция имеет гораздо больше шансов получить либо грязное чтение либо эти вычисления будут сталкиваться с более частыми идущими блокировками проведения.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #44 - 24. Сентября 2009 :: 11:13
Печать  
Z1 писал(а) 24. Сентября 2009 :: 10:55:
ну тогда ты сталкнешься с теми же проблемами блокировок
пока модуль проведения пишет в эту доп таблицу то твоя новая
функция имеет гораздо больше шансов получить либо грязное чтение либо эти вычисления будут сталкиваться с более частыми идущими блокировками проведения.


1. Ну нет же никаких "доп таблиц" в реализации блокировк опер. учета (доп. таблицы в бух. учете). В даном контексте есть лишь модифиц. таблица RG.
2. На счет "грязного чтения", да возможно, но стандартная процедура также с (NOLOCK).
3. Про блокировки - не поняимаю.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #45 - 24. Сентября 2009 :: 11:33
Печать  
Цитата:
1. Ну нет же никаких "доп таблиц" в реализации блокировк опер. учета (доп. таблицы в бух. учете). В даном контексте есть лишь модифиц. таблица RG.

Для возникнования блокировки и даже взаимоблокиовки достаточно и одной таблицы
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #46 - 24. Сентября 2009 :: 11:36
Печать  
Цитата:
2. На счет "грязного чтения", да возможно, но стандартная процедура также с (NOLOCK).

ну тут ты тоже не совсем прав
в той же приведенной выше _1sp_RG99_Select
нет никаких хинтов.
Когда выполняешь стандартный запрос из модуля проведения
Запрос = СоздатьОбъект("Запрос"); тоже нет хинтов.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #47 - 24. Сентября 2009 :: 11:49
Печать  
Цитата:
3. Про блокировки - не поняимаю.

Давай примерчик без 1с.Чистый sql.
Смотри есть таблица  в тестовой базе
Код
Выбрать все
CREATE TABLE test_table (
id int  IDENTITY(1,1) ,
int_value  int   NOT NULL ,
CONSTRAINT PK0_test_table  PRIMARY KEY (Id)
)
 


В ней есть одна запись
(1,23)
1.Далее заходим в qa1 переключаемся на тестовую базу
2.Далее заходим в qa2 переключаемся на тестовую базу
3.В qa1 выполняем код
begin tran
update test_table set int_value = int_value + 20 where id =  1
код выполнился  видим зеленую стрелку
4 Переходим в qa2
выполняем код
begin tran
update test_table set int_value = int_value + 40 where id =  1
Код выполняется видим красный квадратик.
Все qa2 остановился на блокировке update индекса
И из этого состояния выйдет только после того как в qa1
либо завершим транзакцию либо от нее откажемся.
Сразу же после этого в qa2 увидим зеленую стрелочку.
Вот это и есть суть блокировки.


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


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #48 - 24. Сентября 2009 :: 12:14
Печать  
Z1 писал(а) 24. Сентября 2009 :: 11:33:
Цитата:
1. Ну нет же никаких "доп таблиц" в реализации блокировк опер. учета (доп. таблицы в бух. учете). В даном контексте есть лишь модифиц. таблица RG.

Для возникнования блокировки и даже взаимоблокиовки достаточно и одной таблицы


Ок. Пример? Когда при инсете в табл. с индексом в котором есть поле с инкрементом может возникнуть взаимоблок.? Да есть время перестройки индекса, но этого не избежать, и это весьма маловероятно.
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #49 - 24. Сентября 2009 :: 12:22
Печать  
Z1 писал(а) 24. Сентября 2009 :: 11:36:
Цитата:
2. На счет "грязного чтения", да возможно, но стандартная процедура также с (NOLOCK).

ну тут ты тоже не совсем прав
в той же приведенной выше _1sp_RG99_Select
нет никаких хинтов.
Когда выполняешь стандартный запрос из модуля проведения
Запрос = СоздатьОбъект("Запрос"); тоже нет хинтов.


1. В "_1sp_RG99_Select" - нет хинта.
2. В "Запрос = СоздатьОбъект("Запрос")" - есть хинт (у меня есть).

Будем дальше спорить? Представь текст запроса который уходит на сервер при
Код
Выбрать все
Запрос.Выполнить(ТекЗап) 


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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #50 - 24. Сентября 2009 :: 12:27
Печать  
chicago писал(а) 24. Сентября 2009 :: 12:14:
Z1 писал(а) 24. Сентября 2009 :: 11:33:
Цитата:
1. Ну нет же никаких "доп таблиц" в реализации блокировк опер. учета (доп. таблицы в бух. учете). В даном контексте есть лишь модифиц. таблица RG.

Для возникнования блокировки и даже взаимоблокиовки достаточно и одной таблицы


Ок. Пример? Когда при инсете в табл. с индексом в котором есть поле с инкрементом может возникнуть взаимоблок.? Да есть время перстройки индекса, но этого не избежать, и это весьма маловероятно.

Если все делают insert только в одну таблицу
взаимоблокировки не будет.
Если таблицы две то наверное может
Очень сильно зависит от уровня изоляции
Шаг1
Сесия1
begin tran
insert into tabl1

Шаг2
Сесия2
begin tran
insert into tabl2

Шаг3
Сесия1
insert into tabl2

Шаг4
Сесия2
insert into tabl1

И вот можем после этого получить взаимоблокировку.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #51 - 24. Сентября 2009 :: 12:28
Печать  
Z1 писал(а) 24. Сентября 2009 :: 11:49:
Цитата:
3. Про блокировки - не поняимаю.

Давай примерчик без 1с.Чистый sql.
Смотри есть таблица  в тестовой базе
Код
Выбрать все
CREATE TABLE test_table (
id int  IDENTITY(1,1) ,
int_value  int   NOT NULL ,
CONSTRAINT PK0_test_table  PRIMARY KEY (Id)
)
 


В ней есть одна запись
(1,23)
1.Далее заходим в qa1 переключаемся на тестовую базу
2.Далее заходим в qa2 переключаемся на тестовую базу
3.В qa1 выполняем код
begin tran
update test_table set int_value = int_value + 20 where id =  1
код выполнился  видим зеленую стрелку
4 Переходим в qa2
выполняем код
begin tran
update test_table set int_value = int_value + 40 where id =  1
Код выполняется видим красный квадратик.
Все qa2 остановился на блокировке update индекса
И из этого состояния выйдет только после того как в qa1
либо завершим транзакцию либо от нее откажемся.
Сразу же после этого в qa2 увидим зеленую стрелочку.
Вот это и есть суть блокировки.


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

Ну нет же никаких "update". Злой Для чего мы добавили ROW_ID в RG? Что бы инсетить и избежать необходимости "update". Да, наша задача как раз избежать узкого места в лице "update".

В он лайн режиме нет никакого "update" в RG, да он есть при сворачивании, но сворачивание делаеться не в он лайн, а если на то пошло ночью, монопольно. Какие тут блокировки, нафиг нам тут паралелизм?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #52 - 24. Сентября 2009 :: 12:29
Печать  
chicago писал(а) 24. Сентября 2009 :: 12:22:
Z1 писал(а) 24. Сентября 2009 :: 11:36:
Цитата:
2. На счет "грязного чтения", да возможно, но стандартная процедура также с (NOLOCK).

ну тут ты тоже не совсем прав
в той же приведенной выше _1sp_RG99_Select
нет никаких хинтов.
Когда выполняешь стандартный запрос из модуля проведения
Запрос = СоздатьОбъект("Запрос"); тоже нет хинтов.


1. В "_1sp_RG99_Select" - нет хинта.
2. В "Запрос = СоздатьОбъект("Запрос")" - есть хинт (у меня есть).

Будем дальше спорить? Представь текст запроса который уходит на сервер при
Код
Выбрать все
Запрос.Выполнить(ТекЗап) 


.

Я вообще не спорю.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #53 - 24. Сентября 2009 :: 12:34
Печать  
Z1 писал(а) 24. Сентября 2009 :: 12:27:
chicago писал(а) 24. Сентября 2009 :: 12:14:
Z1 писал(а) 24. Сентября 2009 :: 11:33:
Цитата:
1. Ну нет же никаких "доп таблиц" в реализации блокировк опер. учета (доп. таблицы в бух. учете). В даном контексте есть лишь модифиц. таблица RG.

Для возникнования блокировки и даже взаимоблокиовки достаточно и одной таблицы


Ок. Пример? Когда при инсете в табл. с индексом в котором есть поле с инкрементом может возникнуть взаимоблок.? Да есть время перстройки индекса, но этого не избежать, и это весьма маловероятно.

Если все делают insert только в одну таблицу
взаимоблокировки не будет.
Если таблицы две то наверное может
Очень сильно зависит от уровня изоляции
Шаг1
Сесия1
begin tran
insert into tabl1

Шаг2
Сесия2
begin tran
insert into tabl2

Шаг3
Сесия1
insert into tabl2

Шаг4
Сесия2
insert into tabl1

И вот можем после этого получить взаимоблокировку.


Все последний раз отвечаю таблица RG одна. Взаимоблокировки возможны, но во время перестройки индекса. Давай смоделируем ситуацию когда такое может возникнуть:
- если все ок - маловероятно;
- возможно если в сервака выдернуть все ядра и оставить одно;
- возможно при падении (физической деградаци) рейд масива;
- еще?
Но это уже не штатные ситуации это есть исключения.
Давай с этим закончим, принято:
- таблица RG одна;
- в он лайн - только INSET;
- в офф лайн (читай монопольно) - UPDATE.
Будут блокировки?. Вопросы есть?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #54 - 24. Сентября 2009 :: 12:35
Печать  
chicago писал(а) 24. Сентября 2009 :: 12:28:
Z1 писал(а) 24. Сентября 2009 :: 11:49:
Цитата:
3. Про блокировки - не поняимаю.

Давай примерчик без 1с.Чистый sql.
Смотри есть таблица  в тестовой базе
Код
Выбрать все
CREATE TABLE test_table (
id int  IDENTITY(1,1) ,
int_value  int   NOT NULL ,
CONSTRAINT PK0_test_table  PRIMARY KEY (Id)
)
 


В ней есть одна запись
(1,23)
1.Далее заходим в qa1 переключаемся на тестовую базу
2.Далее заходим в qa2 переключаемся на тестовую базу
3.В qa1 выполняем код
begin tran
update test_table set int_value = int_value + 20 where id =  1
код выполнился  видим зеленую стрелку
4 Переходим в qa2
выполняем код
begin tran
update test_table set int_value = int_value + 40 where id =  1
Код выполняется видим красный квадратик.
Все qa2 остановился на блокировке update индекса
И из этого состояния выйдет только после того как в qa1
либо завершим транзакцию либо от нее откажемся.
Сразу же после этого в qa2 увидим зеленую стрелочку.
Вот это и есть суть блокировки.


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

Ну нет же никаких "update". Злой Для чего мы добавили ROW_ID в RG? Что бы инсетить и избежать необходимости "update". Да, наша задача как раз избежать узкого места в лице "update".

В он лайн режиме нет никакого "update" в RG, да он есть при сворачивании, но сворачивание делаеться не в он лайн, а если на то пошло ночью, монопольно. Какие тут блокировки, нафиг нам тут паралелизм?

ну тогда ты должен понять что есть блокировка.
Что блокировки это не всегда плохо. Что в многопользовательской системе блокировок тебе избежать ну никак не удасться.
Сам MS sql основан на блокировках. Даже из этой ветки за кажущейся простотой видна глубина проблем многопользовательской работы с таблицами.
( Аналогия из жизни представь что в Москве перестали работать все светофоры а такое было 25 мая когда была крупная авария.
прикольно ездить без светофоров и когда все уже опаздывают.
Очень грубо можно рассматривать блокировки как светофоры )
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #55 - 24. Сентября 2009 :: 12:41
Печать  
chicago писал(а) 24. Сентября 2009 :: 12:34:
Z1 писал(а) 24. Сентября 2009 :: 12:27:
chicago писал(а) 24. Сентября 2009 :: 12:14:
Z1 писал(а) 24. Сентября 2009 :: 11:33:
Цитата:
1. Ну нет же никаких "доп таблиц" в реализации блокировк опер. учета (доп. таблицы в бух. учете). В даном контексте есть лишь модифиц. таблица RG.

Для возникнования блокировки и даже взаимоблокиовки достаточно и одной таблицы


Ок. Пример? Когда при инсете в табл. с индексом в котором есть поле с инкрементом может возникнуть взаимоблок.? Да есть время перстройки индекса, но этого не избежать, и это весьма маловероятно.

Если все делают insert только в одну таблицу
взаимоблокировки не будет.
Если таблицы две то наверное может
Очень сильно зависит от уровня изоляции
Шаг1
Сесия1
begin tran
insert into tabl1

Шаг2
Сесия2
begin tran
insert into tabl2

Шаг3
Сесия1
insert into tabl2

Шаг4
Сесия2
insert into tabl1

И вот можем после этого получить взаимоблокировку.


Все последний раз отвечаю таблица RG одна. Взаимоблокировки возможны, но во время перестройки индекса. Давай смоделируем ситуацию когда такое может возникнуть:
- если все ок - маловероятно;
- возможно если в сервака выдернуть все ядра и оставить одно;
- возможно при падении (физической деградаци) рейд масива;
- еще?
Но это уже не штатные ситуации это есть исключения.
Давай с этим закончим, принято:
- таблица RG одна;
- в он лайн - только INSET;
- в офф лайн (читай монопольно) - UPDATE.
Будут блокировки?. Вопросы есть?

а у тебя документ двигает только один регистр ?
Если много строк в документах и есть движения по нескольким регистрам вот тебе и пожалуйста взаимоблокировки возможны даже при одних insertax речь исключительно о движениях регистров.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #56 - 24. Сентября 2009 :: 12:47
Печать  
Z1 писал(а) 24. Сентября 2009 :: 12:35:
ну тогда ты должен понять что есть блокировка.
Что блокировки это не всегда плохо. Что в многопользовательской системе блокировок тебе избежать ну никак не удасться.
Сам MS sql основан на блокировках. Даже из этой ветки за кажущейся простотой видна глубина проблем многопользовательской работы с таблицами.
( Аналогия из жизни представь что в Москве перестали работать все светофоры а такое было 25 мая когда была крупная авария.
прикольно ездить без светофоров и когда все уже опаздывают.
Очень грубо можно рассматривать блокировки как светофоры )


Конечно, без блокировок никак и я себе даю в этом отчет. Но я за управляемые блокировки, не путать с деделоками или неуправляемые взаимоблокировки.

Когда например будуть возникать такие "управляемые" блокировки? Они точно будуть возникать в моменты когда в одно и тоже время:
- два (и боле) документов "захотят" списать один и тот же товар по одному и тому же складу. Почему? Потому что перед проведением самого первого документа я наложил блокировку на ресур RG с указаными измерениями, а при начале проведени каждого 1+N документа он будет пытатся (безуспешно) наложить "такую же блокировку". Соотвтественно каждий N + 1 "будет" ждать "N-го". И это есть правильно. Ведь нелзя списать товара - Х (минус Икс);
- когда распроводиться документ (П1) который сделал приход товара на склад, который же хочет списать документ (Р1). Да Р1 будет ждать П1;
- другие случаи.

Но эти блокировки есть управляемые.

PS.
Все более чувствую необходимость в тес. конф.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #57 - 24. Сентября 2009 :: 12:54
Печать  
что за управляемые блокировки. что то ты путаешь.

Начнем с того что сам MS sql полностью декларативный язык.
MS sql сервер без всякого твоего или моего желания может повышать
уровень блокировок от строк к страницам от страниц полностью к таблице.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #58 - 24. Сентября 2009 :: 12:55
Печать  
Z1 писал(а) 24. Сентября 2009 :: 12:41:
а у тебя документ двигает только один регистр ?
Если много строк в документах и есть движения по нескольким регистрам вот тебе и пожалуйста взаимоблокировки возможны даже при одних insertax речь исключительно о движениях регистров.


Нет конечно, не один. "взаимоблокировки возможны даже при одних insertax" согласен, но это уже совсем другая история. Да возможны. Ты знаеш как их избежать? Я нет.
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #59 - 24. Сентября 2009 :: 12:57
Печать  
Z1 писал(а) 24. Сентября 2009 :: 12:54:
что за управляемые блокировки. что то ты путаешь.

Начнем с того что сам MS sql полностью декларативный язык.
MS sql сервер без всякого твоего или моего желания может повышать
уровень блокировок от строк к страницам от страниц полностью к таблице.


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