powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна ли блокировка в следующем случае?
14 сообщений из 39, страница 2 из 2
Нужна ли блокировка в следующем случае?
    #32012025
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 AlexUnik
Ладно я умолкаю
что бы советовать дальше мне нужно намного больше вникнуть в Вашу задачу.
Просто у меня стойкое ощущение что что то у Вас недодумано, м.б. я ошибаюсь.
Успехов.
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32012027
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Глеб Уфимцев
Если не трудно и не жалко, киньте когда-нибудь пару примеров на тему Ваших расчетов остатков на мой e-mail: alexandr_k@baucraft.ru
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32012030
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Genady
К сожалению, решение данной задачи начиналось не с меня и поэтому сделать структуру заново и как надо не могу. Я ограничен лишь движениями адаптации к существующей схеме. За пожелания и советы спасибо. Думаю, нам есть о чем еще поговорить за парой кружечек пива
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32012031
2 AlexUnik

Примерчик постараяюсь состряпать. Если долго не будет, можно меня попинать gvu@newmail.ru
Память после 30 становиться просто дырявая
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32012036
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Глеб Уфимцев
У меня память стала дырявой в 25 лет - с тех пор, как женился (что-то обязательно забываю из многочисленных поручений жены ) Но в данном случае я просто заинтересован не быть забывчивым.
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32012264
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 AlexUnik. Ты затронул весьма непростую и интересную тему. Безболезненно и идеально эта проблема не решается никак. Есть какие-то "консенсусы", которые могут устраивать в той или иной ситуации, но универсального решения просто не существует. Я приведу выдержку из своей статьи двухлетней давности, лежащей тут http://nsa.chat.ru/Raznoe_About.html:
....
Очевидно, что объем регистра может очень быстро расти. Типичная проблема - как достаточно быстро получить остатки по регистру на любую учетную дату, если отражается в нем только движение? Обычно регистр дробится на отрезки определенной протяженности, между которыми фиксируются промежуточные значения остатков. Фиксировать остатки после КАЖДОГО движения не рационально - слишком много в регистре будет информации, которую можно получить расчетным путем, и слишком велико потребление вычислительных ресурсов на пересчет всех остатков при проведении операций "задним числом". Однако, завязывать систему на операции "закрытия учетного периода" тоже некрасиво. В крупной системе пользователи должны иметь возможность вполне нормально работать в разных учетных периодах без каких-либо взаимных помех. Я предпочитаю, чтобы промежуточные остатки по регистру вообще не привязывались к учетному периоду. В своем проекте я привязываю их к критическому количеству прошедших по регистру движений. К примеру, промежуточные остатки могут подсчитываться после каждых 100 движений регистра с одинаковыми аналитическими признаками. В этом случае регистр сам сохранит несколько промежуточных значений остатков даже на протяжении одного дня, если по регистру "товары" за 1 день произошло около 300 движений одной номенклатуры на одном и том же складе. И в то же время по регистру "Ценные бумаги" может несколько кварталов учетного времени вообще не подсчитываться промежуточный остаток, если по этому регистру осуществляются единичные движения. Для получения остатков на запрошенную пользователем дату система извлекает из регистра ближайший к запрошенной дате промежуточный остаток (хранящийся в регистре), добавляет приход и вычитает расход за период до запрошенной даты и расчетным путем получает остаток на запрошенную дату. Технология расчета промежуточных остатков через 100 записей гарантирует, что при этом будет просмотрено не более 100 записей, и время ответа системы будет приемлемым.
....
К сказанному добавлю, что с момента написания статьи у меня взгляды на проблему несколько изменились. Расчет текущих остатков при плавающей границе веьма непрост и сам по себе требует существенных ресурсов. Я пришел к выводу, что наиболее оптимально иметь набор фиксированных интервалов и статистику. Например, остатки могут дробиться: по дням, по неделям, по месяцам, по кварталам, по годам. Конкретный интервал дробления выбирается по статистике оборотов с тем, чтобы между двумя соседними остатками оборотов было, скажем не больше 1000. Можно написать скрипты, которые по ночам или по выходным будут оптимизировать структуру хранения остатков.

2 Глеб. Это действительно очень сложная проблема. Если существует понятие "закрытие учетного периода", то это действительно решает проблемы бустродействия. НО! Это добавляет проблем, если нужно внести изменения в тот период, который закрыт. У нас, к примеру, закрывать вообще нельзя никакие периоды, такова специфика.
Получение остатков не сводится к простому суммированию приходов и вычетанию из них расходов. Представьте, что регистр учета товара ведется по множеству разрезов:
- По филиалам
- По складам
- По кладовщикам
- По номенклатуре
- По номеру приходной партии
... и т.д.
Остатки можно хранить с разблюдовкой по всем аналитикам, а на вопрос "сколько у нас такого-то товара на всех складах?" получать агрегированием остатков по всем остальным аналитикам. Но если аналитических разрезов много, и на каждом из них много значений аналитик, то ответ на поставленный вопрос может занять довольно много времени. Подобные проблемы решаются в системах аналитической обработки (OLAP). В кубах данных сохраняются все комбинации промежуточных остатков, включая самые свернутые и самые развернутые. При этом процесс расчета всех комбинаций промежуточных агрегатов - весьма долгая процедура. OLAP - это системы разлядывания мертвеца - они очень инертны. В данном случае речь идет об OLTP, но с одновременным решением задач, которыми обычно занимаются OLAP. В этом-то и проблема. Вариант с динамическим подрасчетом - весьма напоминиает схему работы с OLAP, и в нем действительно есть рациональные зерна. Конкретно же нужно субъективно (а как же еще ) нужно оценить объемы и скорость модификации, оценить вероятность и частоту залезания в прошлые периоды, выбрать оптимальные интервалы, схему обновления. Короче, вопрос этот требует медитации...
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32012324
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Garya
Буду очень рад и далее узнавать о Ваших мыслях по этому поводу (мой e-mail Вы знаете). Да, это действительно очень сложный вопрос и на данный момент я принял решение о параллельной разработке нескольких механизмов расчета остатков для выявления наиболее оптимального из них.
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32012392
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сегодня реализовал следующий механизм расчета остатков:
1) Остатки формируются в разрезе номенклатурных позиций, складов и дат.
2) Добавление новой записи в таблицу остатков происходит при появлении нового документа движения. Например, 20.06.01 на складе было 100 тракторов, с тех пор движения не было. Актуальным остатком по тракторам считается остаток на 20.06.01. Вчера у нас купили 10 тракторов, в остатках появляется новая запись на 20.08.01 - 90 тракторов. Сегодня мы закупили 5 тракторов, соответственно, на 21.08.01 - 95 тракторов.
3) Параллельно с расчетом остатков считаются средневзвешенные учетные цены.
4) При появлении нового документа движения или аннулировании оного, если дата его совпадает с датой последнего расчета остатков, то запускается процедура расчета, в которой к последнему остатку по выбранным позициям товара добавляется (вычитается) количество оприходованного (отгруженного) товара в данном документе. Новая запись либо корректирует старую (если совпадает с ней по дате), либо добавляется в таблицу остатков.
5) При корректировке старого документа движения или добавлении нового документа задним числом, запускается процедура расчета остатков, в которой удаляются все остатки по выбранным позициям товара сверх той даты, на которую произошло корректирующее движение, после чего добавляются результаты нового расчета.
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32012407
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 AlexUnik

5-й пункт можно несколько соптимизировать.
Скорее всего будут изменения, которые могут не затрагивать остатки по счетам или затрагивать, но не за все даты(например документ меняет дату задним числом). Для ускорения можно ввести ввеменную таблицу, в которую записывались бы только изменения и с основной таблице менять только те записи, которые были действительно изменены. Например у несть есть количество некого товара по датам:
1 10
2 20
3 30
4 40
5 50
Но допустим изменение 2-го числа сделано неправильно, нам надо его сделать 3-м. Т.е. получить:
1 10
3 30
4 40
5 50
Вместо того чтобы как бы стирать документ и вводить его заново, мы сначала копим изменения во временной таблице
2 -10 как бы стирание
3 -10 как бы стирание
4 -10 как бы стирание
5 -10 как бы стирание
3 +10 как бы вставка
4 +10 как бы вставка
5 +10 как бы вставка
Если мы теперь это сгруппируем по дате, то получим:
2 -10
3 0
4 0
5 0
Отсюда видно что мы должны апдейтить не 7 записей(4 раза как бы удалить и 3 как бы вставить), а только одну.
На самом деле конечно всё получается сложнее, но принцип надеюсь понятен.

С приветом Сергей
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32012427
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SergSuper
OK! Принцип понятен. Попробую реализовать. Моя беда в том, что все это время я пытался в пределах одной SP реализовать одновременно и расчет остатков и расчет учетных цен товара. Если использовать временную таблицу, все получится гораздо проще. Спасибо.
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32013124
am (a_mitin)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>5) При корректировке старого документа движения или добавлении нового документа задним числом, запускается процедура расчета остатков, в которой удаляются все остатки по выбранным позициям товара сверх той даты, на которую произошло корректирующее движение, после чего добавляются результаты нового расчета.

А зачем удалять, запускать процедуру пересчета?
Допустим у Вас есть остатки (возьмем пример SergSuper):
1 10
2 20
3 30
4 40
5 50
И априори предположим что не бывает операций изменения документа товародвижения - только вставка и удаление (то есть проведение и откат - редактировать проведенный нельзя, редактировать непроведенный можно, но он не влияет на остатки)
Тогда откатываем документ (расход) от 2 го числа с количеством допустим 5 - тебе всеголишь необходимо увеличить на 5 все остатки начиная со второго числа и позже! UPDATE QNT SET QNT=QNT+5 FROM tblRemains WHERE [Date]>=2
Аналогичная схема с добавлением - допустим исправляешь в этом документе кол-во на 10 и проводишь его, надо выполнить операцию уменьшения остатков:
UPDATE QNT SET QNT=QNT-10 FROM tblRemains WHERE [Date]>=2
И всё... Кстати если нужен жесткий минус-контроль - он изумительно решается путем создания триггера на табл. остатков запрещяющего вставлять записи с QNT<0 !
В системе 2-х проц. Pent 900 с хорошим RAID массивом _дневное_ товародвижение в условиях онлайнового пересчета остатков (таблица остатков уже более 1 000 000 записей) пересчитывается за 30-60 секунд (это порядка 5000 товарных строк)! То есть один документ при повседневной работе проводится практически мгновенно (если проводить задним числом конечно время немного увеличивается, но такие документы редкость, да и не намного оно увеличивается )
И остатки на любую дату.
Другое дело, что если хранить запись в табл. остатков только на дату, в которой было товародвижение, то для того чтобы посмотреть остатки на произвольную дату надо найти сначала для каждого товара эту дату, а потом сделать выборку со связкой Товар, Дата. Запрос, который предлагает SergSuper (с коррелированным подзапросом) тормозит неимоверно!
Легче в таблице остатков хранить тогда и обороты и их суммировать - намного быстрее получается... Ну либо на каждую дату не зависимо от движения хранить остатки - тогда увеличивается кол-во записей в ней, усложняется логика пересчета...

Так что вот...
(а с учетными ценами это конечно отдельный разговор...)

С уважением, Андрей Митин
ICQ:38607432
http://am.rusimport.ru
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32013134
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 am (a_mitin)

Не потрудитесь объяснить, что такое "коррелированный подзапрос", который я якобы предлагаю и почему он будет тормозить?
А то мне сдуру всё время казалось, что чем меньшее количество записей апдейтиться, тем быстрее будет работать.
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32013137
am (a_mitin)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SergSuper:
>Не потрудитесь объяснить, что такое "коррелированный подзапрос", который я якобы предлагаю и почему он будет тормозить?
Прошу прощения у глубокоуважаемого SergSuper за то что сразу не указал про какой запрос идет речь...
Цитирую:
'начало цитаты
--------------------------------------------------------------------------------
Replied Message:
--------------------------------------------------------------------------------
RE:T-SQL: Простой запрос подскажите pls.
Posted by SergSuper (sergsuper@mail.ru) on 02 Jul, 2001 17:09:07
а тут надо лапцами писать:
select Товар, Цена
from tbl t1 where НаДату=(select max(НаДату) from tbl t2 where t1.Товар=t2.Товар)
'конец цитаты...
А коррелированный - это тот подзапрос в котором есть ссылка на внешний запрос ( t1. Товар=t2.Товар)
> А то мне сдуру всё время казалось, что чем меньшее количество записей апдейтиться, тем быстрее будет работать.
Абсолютно согласен Речь шла о получении остатков на день из таблицы, где остатки храняться только на те дни, где были обороты... Т.е.
1 10
3 15
То остатки на 2-е число тоже 10...
...
Рейтинг: 0 / 0
Нужна ли блокировка в следующем случае?
    #32013209
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 am (a_mitin)
>А зачем удалять, запускать процедуру пересчета?
К нам довольно часто приходят документы движения с удаленных складов, по которым, как я уже упоминал, также расчитываются остатки

Помимо всего прочего, в процедуре расчета остатков я предусмотрел обработку конфликтных ситуаций, типа расход>прихода на какую-то дату, нам совсем не нужны отрицательные остатки в отчетности
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна ли блокировка в следующем случае?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]