Переключение на Главную Страницу Страницы: 1 2 [3] 4  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как обойти блокировку таблиц итогов по регистрам RG####? (число прочтений - 10835 )
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 записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 
ОтправитьПечать