Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
Понимаю, что на тему остатков уже писано-переписано, но тем не менее это вечно живая тема... :) У кого какой опыт по проектированию/получению Sabj ? Обязательные условия: - огромный товарооборот и удовлетворительная производительность; - хранение всех операций не менее, чем за год; - партионный мультискладовый учёт; - возможность получения остатков на любую дату и по любой комбинации складов; - возможность урезки базы без потери правильности данных за открытый период; - возможность прихода/продажи задним числом. Мой опыт: В основе две таблицы: Товарный журнал со всеми операциями (упрощенно) : Operation_ID, Document_ID, OperationTypeID, OperationDate, ItemID, AdrFromID, AdrToID, Qty, Summ где: Document_ID -номер документа OperationTypeID- тип операции(покупка,продажа,списание и т.п.) AdrFromID, AdrToID откуда/куда делается операция (поставщик-склад, склад-склад, склад-клиент и т.п.) Qty, Summ - знак в зависимости от операции - расход с минусом, приход с плюсом Журнал промежуточных итогов (подИтогов): TotalDate, ItemID, AdrID, Qty, Summ где: TotalDate - дата на которую посчитан подИтог, AdrID - склад Расчёт остатков - сумма ближайшего промежуточного итога и сумма операций по журналу по (дата) between (ближ.промеж.дата+1) and (нужная дата) Использую union и агрегатную сумму по его результату :) Промежуточные остатки можно делать, например 1-2 раза в месяц. Применения между приходами и расходами (для парт.учёта) лежат в отдельной таблице, которую пока не будем рассматривать. В любой момент базу можно урезать, но желательно по OperationDate не позднее самого раннего подИтога. Наблюдается сильная зависимость производительности от удаленности даты до ближайшего подИтога (если 2дня итог 2-3сек для 40тыс. товара, если 30дней, то 11-14 сек. Это всё для >4млн. операций за 10мес. сервер 2x2.4HHz 2Gb RAM) Недостатки : невысокая производительность (частые Index Scan) :( Вот собственно всё... КТО КАК ЭТО ДАЛАЕТ ? Есть подозрение, что сделать оптимальнее без потери функциональности не удастся.... :( А ВАШЕ МНЕНИЕ ? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2004, 13:20 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
LSVНедостатки : невысокая производительность (частые Index Scan) :( Разместите индексы и данные на разных винтах (не логических дисках одного харда). А потом, частые Index Scan это лучше, чем Table Scan :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2004, 13:26 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
действительно вечная тема.. не надо функциональность трогать если у вас база MSSQL2000 или Oracle8-9 Сделайте разбиение физической таблицы в Oracle - partition table или используйте materilized view (материал сами найдете в доках ) в MSSQL механизмы аналогичны ,но не помню точно как называются В любом случае "общие" индексы можно "развязать" и сформировать более компактно в зависимости от стратегии разбиения таблиц.. (кстати, читайте форум Oracle) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2004, 13:31 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
забыл добавить требование: - необходимо получать данные одним запросом и желательно без подзапросов. Это важно при получении отчетности внешними средствами. Может требование и необязательное, но желательное. В описании желательно приводить временнЫе результаты Ваших решений ...типа как у меня... :) 2 Александр Спелицин Речь идет не о повышении производительности конкретного сервера. Нужно, чтоб структура работала пошустрее... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2004, 13:36 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
самое главное опять забыл: MSSQL2000EE хотя это не очень-то важно. Важно САМО РЕШЕНИЕ вне зависимости от платформы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2004, 13:37 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
LSVИспользую union и агрегатную сумму по его результату :) Union - это медленно. Попытайтесь от него уйти. А насчет разнесения данных и индексов по разным дискам, советую подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2004, 13:46 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
А почему нельзя хранить текущий остаток и пересчитывать его тригером. Тем более что все равно бОльшая часть запросов скорее всего на текущие остатки, а не на дату в прошлом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2004, 13:55 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
2 Александр Спелицин Уйти ? Я бы с радостью.. А как ? Надо независимо просуммировать операции в двух таблицах и сложить полученные результаты. Причем в любой из них может не быть результата по нужным условиям (например когда "нужая дата"=ДатаПодИтога не будет данных в запросе по Товарному журналу). также не вижу возможности использовать индексированные вью.... :) Не помогут они, ИМХО... Спасибо за советы по настройкам сервера, но это увы неактуально т.к. это не prodaction DB. Это пока development :) А prodaction может работать и на простеньких серверах с простым IDE-зеркалом :) Например небольшой могазин.. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2004, 14:05 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
автор бОльшая часть запросов скорее всего на текущие остатки :) БОльшая это ещё не 100% :) Кстати такая табличка есть... Она ещё резервирование товара показывает. Правда меняется при проводке документа... Но это отдельный разговор. важно иметь не просто остатки, но ещё и все (!) перемещения товара. А вот перемещения смотрят постоянно и все кому не лень... :( Для этого и товарный журнал с 4млн строк... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2004, 14:11 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
LSV:) БОльшая это ещё не 100% :) Кстати такая табличка есть... Она ещё резервирование товара показывает. Правда меняется при проводке документа... Но это отдельный разговор. важно иметь не просто остатки, но ещё и все (!) перемещения товара. А вот перемещения смотрят постоянно и все кому не лень... :( Для этого и товарный журнал с 4млн строк... :) Ну и что, что не 100%? Два запроса (две формы) на текущие остатки и на остатки на дату. Кстати, а зачем вообще нужны остатки на дату в прошлом? ИМХО, это как прошлогодний снег. И как связано желание всех смотреть на перемещения и остатки? Типа кол-во на начало периода->все перемещения->кол-во на конец периода? Ну сделать то можно, но какова актуальность этих данных и цена их получения? Имея журнал можно посчитать что угодно, вопрос зачем и как часто. Одно дело оперативный контур, где все должно летать, другое дело аналитика, где можно и подождать. Все исключительно ИМХО. Есть еще одна "маленькая" вкусность от хранения остатков - простой констрейнт на >=0 избавляет от минусовых остатков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 09:12 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
2 Серега :) Ну что сказать ?... Не знаком человек с розничной торговлей... :) Перемещения товара смотрят часто и тут ничего не поделаешь... Зачем нужны остатки на дату в прошлом ? Как это зачем ? Например сверка с поставщиком на определённую дату, т.е. сколько оставалось его товара и сколько ему заплатить за уже проданое. Не говоря уже про разборы полётов при оприходовании или отпуске ... :) А констрейнтами не борятся с отрицательными остатками ! ! ! Потому, что есть ситуации когда отрицалово допустимо (в разумных пределах) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 11:07 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
распространенная ошибка это хранение типа опреации в журнале операции. Тип операции должен однозначно определяться документом. Соответственно туда же (в документ) должны уйти дата операции, от кого и кому. Тогда работать будет значительно быстрее. В журнале должны остаться только Document_ID, Item_ID, Qty, Summ А в документе должны быть ID, OperationType, -- это определяется по типу документа OperationDate, AdrFromID, AdrToID В таком случае сначала однозначно по индексам определяется нужный список документов и затем это список джойнится с журналом. Попробуйте переделать и увидите как быстро все заработает. Проверено на практике. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 11:19 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
LSV:) Ну что сказать ?... Не знаком человек с розничной торговлей... :) Ну да, конечно, где нам. 8-) LSVЗачем нужны остатки на дату в прошлом ? Как это зачем ? Например сверка с поставщиком на определённую дату, т.е. сколько оставалось его товара и сколько ему заплатить за уже проданое. Не говоря уже про разборы полётов при оприходовании или отпуске ... :) Я и не говорю, что они не нужны совсем. Любую цифирь можно получить из журнала, а наличие всяких таблиц "остатков на дату" только усложняет логику запросов и пагубно влияет на производительность. Этот пункт спорный конечно, но это мое мнение. LSVА констрейнтами не борятся с отрицательными остатками ! ! ! Потому, что есть ситуации когда отрицалово допустимо (в разумных пределах) А каков критерий "разумности" минуса? ИМХО - это бардак в организации просто. Вы в розничной торговле фьючерсами торгуете что ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 11:20 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
авторЯ и не говорю, что они не нужны совсем. Любую цифирь можно получить из журнала, а наличие всяких таблиц "остатков на дату" только усложняет логику запросов и пагубно влияет на производительность. Этот пункт спорный конечно, но это мое мнение. Кхм ... дасс ... не смог утерпеть это как же запрос типа Код: plaintext дольше чем что то типа Код: plaintext авторА каков критерий "разумности" минуса? ИМХО - это бардак в организации просто. Вы в розничной торговле фьючерсами торгуете что ли. да представте себе в розничной торговле тоже торгуют фьючерсами :)) т.е. обычная ситуация, когда собирают на отгрузку товар не поступивший на склад, но заказанный поставщику .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 11:49 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
olk[quot автор] это как же запрос типа Код: plaintext дольше чем что то типа Код: plaintext И что? А на 2.01.1998 тоже сумма храниться будет? А на 3? И так на каждый день до сегодняшнего? А задним числом провели покупку? Все пересчитать? olkда представте себе в розничной торговле тоже торгуют фьючерсами :)) т.е. обычная ситуация, когда собирают на отгрузку товар не поступивший на склад, но заказанный поставщику .... Где собирают? Куда собирают? На складе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 12:15 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
2 Old Nick как раз хранение типа и даты операции в товарном журнале хоть и увеличивает размер таблицы, но заметно ускоряет запросы по статистике. Намного ускоряет ! В разы ! Это тоже проверено ! Как можно в запросе делать ссылку на документы, если они разбросаны по разным таблицам ? Применять CASE ? Тогда наверняка будет Table scan. Тем более для остатков тип документа как раз и не важен :) Важна сумма всех операций... :) Повторю: Задача не только получить остатки на дату. Задача - получить универсальный функционал для работы с товаром. Предложеное мной решение может и не оптимальное, но ИМХО наиболее близкое к желаемому...По крайней мере по функциональности... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 12:29 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
Серега olk это как же запрос типа Код: plaintext дольше чем что то типа Код: plaintext И что? А на 2.01.1998 тоже сумма храниться будет? А на 3? И так на каждый день до сегодняшнего? Можно и на каждый день ... что тут страшного ? ... можно хранить и "разреженный" остаток, т.е. по товарам по которым реально было движение ... запрос тогда немного усложниться, но работать будет все равно быстрее - чем пересчитывать по журналу операций с начала эксплуатации ... Серега А задним числом провели покупку? Все пересчитать? Да пересчитать -по ресурсам это не очень трудоемкая операция (и согласитесь не очень штатная - иначе действительно бардак), причем чем ближе к текущей дате операция, тем меньше пересчитывать ... olkда представте себе в розничной торговле тоже торгуют фьючерсами :)) т.е. обычная ситуация, когда собирают на отгрузку товар не поступивший на склад, но заказанный поставщику .... СерегаГде собирают? Куда собирают? На складе? Да на складе ... так как розница это не только продажи по магазинам, но и склад (причем в первую очередь), причем это я упростил (в "нормальном" складе, конечно кроме реального остатка существует и "фьючерский" и свободный (т.е. не зарезервированный" и т.д.) кроме того есть такое понятие как пересортица, когда с до очередной инвентаризации приходиться мириться с отрицательными остатками .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 12:30 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
2 Серега >> Где собирают ? куда ? .... Например скоропорт может быть продан раньше, чем оприходуют. И эта разница может составлять во времени всего полчаса... :) Часто приходуют утром вечерние поставки, а товар уже почти продан :) Не надо рассказывать про бардак ! Он в рознице неизбежен, хотя масштабы его должны быть незначительны. :) :) :) Кстати полностью согласен с olk ! Понимает человек, о чём идёт речь ! ! ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 12:47 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
olkМожно и на каждый день ... что тут страшного ? Да так ерунда - 10000 товаров, на каждый день остаток, ну разрежено на 5000 в день. А когда ксьати считать то "за день"? Вечером? А если кладовщик полуношник после подсчета отгрузил что нибудь? olkзапрос тогда немного усложниться, но работать будет все равно быстрее - чем пересчитывать по журналу операций с начала эксплуатации ... Почему с начала эксплуатации? С текущего момента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 12:50 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
Серега olkМожно и на каждый день ... что тут страшного ? Да так ерунда - 10000 товаров, на каждый день остаток, ну разрежено на 5000 в день. А когда ксьати считать то "за день"? Вечером? А если кладовщик полуношник после подсчета отгрузил что нибудь? olkзапрос тогда немного усложниться, но работать будет все равно быстрее - чем пересчитывать по журналу операций с начала эксплуатации ... Почему с начала эксплуатации? С текущего момента. Ну это уже спор ради спора Да хоть 50000 поверте на слово это такой мизер, по сранению с остальным объемом информации .... Согласен - что это некоторая денормализация базы , но что то я никогда не был особым сторонником Клода Ну нравится ... пересчитывайте по журналу, я просто выразил свое мнение ... кстати подтвержденное некоторым опытом ... Время смены "операционного дня", вещь весьма условная и выбирается исходя из специфики работы ... и не имеет принципиального значения ... но общепризнано что новые сутки начинаются в 0 часов так что все документы "закрытые" до определенного статуса до 0 часов отразятся на остатках сегодня остальные позже (когда их закроют)... А что в вашем тогда понимании "текущего" , т.е. я так понимаю что есть текущий остаток (кстати на какой момент ?) и если мы хотим получить остаток за предыдущий день то выбираем документы предшествующие этому "текущему" моменту и по ним расчитываем ? (кстати а до какого момента выбираем ? до какого часа , минуты ) ... это я так стебусь , возвращая вам ваши же вопросы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 13:12 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
olk А что в вашем тогда понимании "текущего" , т.е. я так понимаю что есть текущий остаток (кстати на какой момент ?) На момент фиксации транзакции. olk и если мы хотим получить остаток за предыдущий день то выбираем документы предшествующие этому "текущему" моменту и по ним расчитываем ? Берем текущий остаток и "откатываем" нужные документы. Все то же самое, но с другой стороны. 8-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 13:35 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
Я всегда за динамический подсчет остатков. IMHO это наиболее безпроблемный путь при правке документов задним числом и избавляет от всяких неучтенных проколов. Делается так: INSERT INTO #TABLE1 (ОстатокПоТовару, Метка) SELECT SUM(КолТовара), 0 FROM ПриходТовара WHERE Дата < @Дата INSERT INTO #TABLE1 (ОстатокПоТовару, Метка) SELECT -SUM(КолТовара), 0 FROM РасходТовара WHERE Дата < @Дата INSERT INTO #TABLE1 (ОстатокПоТовару, Метка) SELECT SUM(КолТовара), 1 FROM #TABLE1 DELETE FROM #TABLE1 WHERE Метка = 0 Пользователи не замечают, что при открытии формы остатков они считаются динамически. Пример приведен упрощенно, все суммы типа Количество*Цена считаются триггерами и заносятся в соответствующие поля. То есть в приведенных выше запросов никаких расчетов не делается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 16:05 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
авторэто наиболее безпроблемный путь при правке документов задним числом и избавляет от всяких неучтенных проколов не избавляет - дублирование информации приводит к потенциальным ошибкам. В этом случае процедуру пересчёта нужно откатать от и до. малейшая погрешность или какой-нибудь неучтённый нюанс - и сумма по таблице(ам) с оборотами не будет соответствовать рассчитанным остаткам. Плюс надо протестировать это дело на миллионных таблицах, а то при накоплении истории по оборотам каждый следующий пересчёт можно некисло тормозить работу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 16:18 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
LSV2 Old Nick как раз хранение типа и даты операции в товарном журнале хоть и увеличивает размер таблицы, но заметно ускоряет запросы по статистике. Намного ускоряет ! В разы ! Это тоже проверено ! Как можно в запросе делать ссылку на документы, если они разбросаны по разным таблицам ? Применять CASE ? Тогда наверняка будет Table scan. Тем более для остатков тип документа как раз и не важен :) Важна сумма всех операций... :) Повторю: Задача не только получить остатки на дату. Задача - получить универсальный функционал для работы с товаром. Предложеное мной решение может и не оптимальное, но ИМХО наиболее близкое к желаемому...По крайней мере по функциональности... Еще одна распространенная ошибка. Все документы должны лежать в одной таблице, тогда не нужно искать по разным таблицам и делать скан. При этом в случае такого проектирования нужно применять кластерный индекс (если это MSSQL), будет работать очень быстро. Расходная и приходная накладная сильно различаются по структуре? А заказ от них сильно отличается? Применяйте наследование и будет вам счастье. Если не знаете что это такое применительно к базе вспомните про маппирование классов на базу данных. Каждый класс соответствует своей таблице. Например, абстрактная накладная - это таблица ANakl и в ней поля тип, дата, от кого и кому, наследники расходная накладная и приходная накладная отличаются только типом, в таком случае своих таблиц не имеют, а имеют записи в таблице ANakl, но с соответствующим значением в поле тип. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 16:45 |
|
||
|
И снова про СКЛАДСКИЕ ОСТАТКИ...
|
|||
|---|---|---|---|
|
#18+
Что-то в топике почти нет конструктивных советов и своих примеров решения затронутой проблемы... :( Все хранят свои тайны ? ? ? Зато желающих похаять что-либо или вставить свои 5коп. не в тему (зарисоваться) хоть отбавляй... :( Опять забыли, что обсуждаем и перешли на личности ? Несолидно, коллеги ! ! ! ВОПРОС И УСЛОВИЯ ПОСТАВЛЕНЫ ОЧЕНЬ ЧЁТКО. Просьба приводить ТОЛЬКО ПРОВЕРЕННЫЕ РЕШЕНИЯ И ТОЛЬКО ЕСЛИ ВЫПОЛНЯЕТСЯ ХОТЯ-БЫ БОЛЬШАЯ ЧАСТЬ НАЧАЛЬНЫХ УСЛОВИЙ ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2004, 16:56 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=32670988&tid=1546192]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 289ms |
| total: | 429ms |

| 0 / 0 |
