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