Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Какой способ эффективнее?  [new]
Slash232
Member

Откуда: Минск
Сообщений: 407
Имеется SQL 2005 Express. Пишу программу для складского учёта на VB6. Есть много таблиц с операциями над товарами (с количеством). Какой способ получения остатка определённого товара наиболее эффективен?:
1) в запросе с использованием своей функции которая вычисляет остаток
2) отдельная таблица с остатками из которой можно получить все запросом

Только начинаю все осваивать, просьба особо не критиковать. Спасибо.
10 дек 13, 17:29    [15273074]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Slash232
Имеется SQL 2005 Express. Пишу программу для складского учёта на VB6. Есть много таблиц с операциями над товарами (с количеством). Какой способ получения остатка определённого товара наиболее эффективен?:
1) в запросе с использованием своей функции которая вычисляет остаток
2) отдельная таблица с остатками из которой можно получить все запросом

Только начинаю все осваивать, просьба особо не критиковать. Спасибо.


Скорее всего Вам лучше обратиться в форум по проектированию БД.
10 дек 13, 17:47    [15273133]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
таблица и хранить, конечно же. сиквел не любит считать - не его это
10 дек 13, 17:52    [15273152]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
Slash232
Member

Откуда: Минск
Сообщений: 407
Crimean, спасибо, а каким образом изменять значения остатков этой таблицы?
10 дек 13, 18:04    [15273233]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
_djХомяГ
Guest
серверной логикой
10 дек 13, 18:12    [15273273]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Slash232
каким образом изменять значения остатков этой таблицы?


update, однако
10 дек 13, 18:14    [15273285]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
Slash232
Member

Откуда: Минск
Сообщений: 407
Crimean,
я в смысле если изменилась одна таблица то её тригер срабатывает и вносит изменения в таблицу с остатками?
10 дек 13, 18:30    [15273353]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Slash232,

получение остатка эффективнее всего чтением из таблицы. а вот как эффективнее для системы в целом - зависит от соотношения операций получения и модификации остатка * эффективность реализации. на практике операций получения остатка сильно больше. но - никто вам не мешает вести оперативные и архивные остатки, архивные пересчитывать регламентами через флаги актуальности, сбросить которые дешевле на порядки чем пересчитать массу остатков во время операции
10 дек 13, 19:13    [15273520]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
bormental
Member

Откуда:
Сообщений: 90
Slash232,

Тут, конечно, многое зависит от реализации ведения складского учета по скольким разрезам он ведется + объема складского движения. Можно и на лету считать из таблицы складского движения, можно и специально вести таблицу сальдовых остатков.
С таблицей остатков тоже могут быть варианты :
- на каждый день. Смысл в том что по мере операций с ТМЦ отражать общее изменение остатка на N-ю дату.
Например , 1-го был приход на разрез 10 единиц . В таблицу остатков на конец дня легло :

дата ТМЦ Подраз МОЛ Партия Общее кол-во приходов Общее кол-во расходов Остаток
01 ТМЦ1 Подр1 МОл1 Партия1 10 0 10

5-го числа списали 3 единицы. Уже так будет по этому разрезу:

дата ТМЦ Подраз МОЛ Партия Общее кол-во приходов Общее кол-во расходов Остаток
05 ТМЦ1 Подр1 МОл1 Партия1 10 7 3

причем если это была операция внутренного перемещения, то на новый разрез этим же числом лягут на приход эти 3 единицы новой записью в табл остатков....

Таким образом, чтобы получить оперативно остатки по какому то Подразделению (Подразделению/Мол и т.д. по нужному фильтру..) нужно просто посмотреть по последней дате от даты формирования отчета запись по такому разрезу и взять это как остаток.
В этом варианте ,если есть большое движение складское , мы уходим от постоянного динамического высчитывания остатков "на лету". Хотя прибавляются другие проблемы конечно ))

Каким то средним вариантом ( и вполне рациональным вариантом тоже) видится вариант создание контрольных точек хранения остатков. Т.е. создаешь точку как какую то дату. На нее рассчитываются остатки по всему всему. и Далее можно уже, в зависимости от заданий получения остатков на конкретную дату, искать ближайшую контрольную точку + подтягивать движение складское из документов. Это некий средний вариант получается.
10 дек 13, 23:47    [15274270]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
shandai
Member

Откуда:
Сообщений: 44
bormental, все хорошо расписал.

На практике сейчас используем два подхода, считаем «на лету» и есть таблица, хранящая сальдовые остатки.
Подсчет «На лету» - используется только для отчетов.
При помощи «специальной таблицы с остатками» - для создания приходных и расходных документов в системе, так как она (таблица) позволяет определить есть ли остатки на текущую дату (у нас так), что бы расход не вышел датой раньше прихода. При подсчете «на лету», так тоже можно организовать, но при больших объемах и пользователях считать будет не быстро.

Могу сказать, что подсчет остатков «на лету», в нашем случае, показывает более правдивую информацию, так как логика хранения остатков в специальной таблице не всегда хорошо отрабатывает, из-за многих факторов, и в системе существует функция пересчета таких остатков, которая на основе заведенных в систему документов, пересчитывает остатки на текущую дату. Естественно в этот момент все участвующие в этом пересчете таблицы блокируются, что бы результат был корректный.

З.Ы. Если есть возможность, перейдите лучше на SQL 2008 Express, в нем проще клепать отчеты для пользователей в ReportServer, которых может потребоваться очень много.
11 дек 13, 04:44    [15274543]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
Glory
Member

Откуда:
Сообщений: 104751
shandai
Могу сказать, что подсчет остатков «на лету», в нашем случае, показывает более правдивую информацию, так как логика хранения остатков в специальной таблице не всегда хорошо отрабатывает, из-за многих факторов,

Еще одна бредовая мысль.
Логика хранения остатков срабатывает так, как я напишут.
Если написать хреново, то и срабатывать будет хреново
11 дек 13, 10:15    [15275257]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
Slash232
Member

Откуда: Минск
Сообщений: 407
Спасибо всем за ответы. Останусь на варианте хранения остатков в отдельной таблице. Вопрос как лучше реализовать? Вариант 1: это к каждой таблице операций прикрепить триггер который бы запускал общую функцию пересчёта товаров которые в этих таблицах были изменены и внесение инфы в таблицу остатков. Какие варианты еще есть? Какие лучше?
11 дек 13, 11:09    [15275579]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Slash232
Вариант 1: это к каждой таблице операций прикрепить триггер

У вас что _много_ таблиц операций ?????
11 дек 13, 11:10    [15275587]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
Slash232
Member

Откуда: Минск
Сообщений: 407
Glory, 7
11 дек 13, 11:13    [15275606]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31912
Slash232
Вариант 1: это к каждой таблице операций прикрепить триггер который бы запускал общую функцию пересчёта товаров которые в этих таблицах были изменены и внесение инфы в таблицу остатков.
Да, вполне нормально, можно сделать процедуру пересчёта, которой передавать список изменённых товаров как табличный параметр
11 дек 13, 16:42    [15278094]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
~
Guest
Slash232, А можно по подробнее узнать, что хранится в 7-ми таблицах операций? И почему именно 7-мь?
11 дек 13, 17:08    [15278363]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
Slash232
Спасибо всем за ответы. Останусь на варианте хранения остатков в отдельной таблице. Вопрос как лучше реализовать? Вариант 1: это к каждой таблице операций прикрепить триггер который бы запускал общую функцию пересчёта товаров которые в этих таблицах были изменены и внесение инфы в таблицу остатков. Какие варианты еще есть? Какие лучше?
Ещё вместо таблицы остатков можно сделать индексированное представление. По эффективности - то же самое, что с триггерами, но писанины меньше. Если только таблицы с операциями хорошо организованы.
11 дек 13, 22:49    [15279933]     Ответить | Цитировать Сообщить модератору
 Re: Какой способ эффективнее?  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2565
~
Slash232, А можно по подробнее узнать, что хранится в 7-ми таблицах операций? И почему именно 7-мь?
Вангую: понедельник-вторник-среда... ну и т.д. Если это так, то очень оригинально, возьму на заметку
12 дек 13, 10:31    [15280886]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить