Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
Ребят, вот уже не первый месяц я понимаю, что можно сделать проще, а не изобретать велосипед.

Например на сервере mssql хранятся данные:
Отгрузка:
CREATE TABLE #shipment
(	
	[shipment_sales_channel_name]    [varchar](25)    NULL,
	[shipment_branch_name]           [varchar](100)   NULL,
	[shipment_customer_name]         [varchar](100)   NULL,
	[shipment_priority]              [tinyint]        NULL,
	[shipment_date]                  [datetime]       NULL,
	[shipment_kg]                    [decimal](11, 5) NULL,	
) 


График работы:
create table #schedule_work
(
	 dt_tm			datetime	not null
	,dw			smallint	    null
)


Список машин :
create table #cars
(
	 car		int		not null
	,volume		dec(11,5)	    null
)


Например задача, мне нужно сделать график отгрузки, с учетом графика работы и вместимости машин. Алгоритм должен заполнить машину на 99%-100%, кол-во машин ограничено, заказ нельзя разделять (в 1 машину можно больше 1 заказа, но нельзя 0.5 заказа). Задача стандартная в логистике.

На выходе:
График отгрузки по дням
Объем отгрузки по дням
Кол-во машин по дням
Лог какой заказ в какой машине и когда будет огрузка


я не спрашиваю как мне сложить 2 числа и получить результат.
Алгоритм все считает в 2 хранимках на сервере, но мне кажется, реализация на t-sql мягко говоря это не то.

Поделитесь опытом где писали сложные расчеты и какой язык использовали?
Можете посоветовать, что посмотреть и что почитать.


Спасибо

Сообщение было отредактировано: 3 сен 19, 12:19
3 сен 19, 09:28    [21962243]     Ответить | Цитировать Сообщить модератору
 Re: на чем создать расчет, поделитесь опытом.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19590
Focha
что посмотреть и что почитать
Ну, вероятно, алгоритмически - про задачу линейного раскроя (как правило, она рассматривается как частный случай задачи о рюкзаке).

Focha
где писали сложные расчеты и какой язык использовали?

Данная задача - несложная, пока нет лимита по ресурсам. А у тебя их и не будет, вероятно... так что пофиг. какой язык лучше знаешь, на том и пиши... да хоть в Excel поиск решения используй.
3 сен 19, 11:24    [21962324]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
Akina
Focha
что посмотреть и что почитать
Ну, вероятно, алгоритмически - про задачу линейного раскроя (как правило, она рассматривается как частный случай задачи о рюкзаке).


Как решить я знаю, цифры умею не только складывать.

Akina
Focha
где писали сложные расчеты и какой язык использовали?

Данная задача - несложная, пока нет лимита по ресурсам. А у тебя их и не будет, вероятно... так что пофиг. какой язык лучше знаешь, на том и пиши... да хоть в Excel поиск решения используй.


Я смотрю вы это делаете в Excel
3 сен 19, 16:16    [21962653]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19590
Focha
Я смотрю вы это делаете в Excel
У меня вообще таких задач нет. Но когда появляются (было лет семь назад, помнится) - Эксель вполне себе справился.

Уж больно всё неопределённо. Задача-то в общем случае NP, так что SQL под неё не заточен. И те две SP если её и решают, то либо реализуют тот же алгоритм, либо обрабатывают большие массивы, пользуясь тем, что данные локальные.

Наверное, есть средства, либо специально под этот класс задач заточенные, либо несложно к ним применимые... та же генетика, к примеру. Но увы, конкретных не назову, не моя область.
3 сен 19, 16:28    [21962663]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
Akina
Наверное, есть средства, либо специально под этот класс задач заточенные, либо несложно к ним применимые... та же генетика, к примеру. Но увы, конкретных не назову, не моя область.



Мне данная область интересна, но куда копать пока не пойму.
3 сен 19, 17:31    [21962740]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
L.Otujktd
Member

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

Добрый вечер! Если есть алгоритм то все-равно на каком языке это реализовывать.
Проще наверное перевести все в объектное представление и реализовать все на с#. Тк при желании можно спокойно прикрутить и тесты и orm и отлаживать проще
3 сен 19, 21:06    [21962865]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 32478
Блог
Я бы запихнул расчет в clr-процедуру
3 сен 19, 22:16    [21962898]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Автор пишет что у него уже есть 2 хранимки которые все считают.

Но автор считает что это - не феньшуй.

Верно?
4 сен 19, 08:23    [21962965]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
L.Otujktd
Если есть алгоритм то все-равно на каком языке это реализовывать.
Проще наверное перевести все в объектное представление и реализовать все на с#. Тк при желании можно спокойно прикрутить и тесты и orm и отлаживать проще
Я вот думал о C# и CLR, но хочу узнать ваше мнение, каким образом у вас построены расчеты / алгоритмы / бизнес процессы или как еще там называют это


Критик
Я бы запихнул расчет в clr-процедуру
А вы делали большие и сложные расчеты на CLR или просто так сказали?


mayton
Автор пишет что у него уже есть 2 хранимки которые все считают.
Но автор считает что это - не феньшуй.
Верно?
Да, ваш комментарий 100% отображает мою проблемы.
4 сен 19, 08:42    [21962972]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 820
Focha,

Я бы оставил хранимки. Если они делают дело, то чудесно. Если считаете, что алгоритм не оптимальный, то нужно поискать другой алгоритм. Наверняка есть что-то специализированное. Ну и соответственно внешнее и затратное по всем параметрам.
4 сен 19, 11:02    [21963087]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
KreatorXXI
Focha,

Я бы оставил хранимки. Если они делают дело, то чудесно. Если считаете, что алгоритм не оптимальный, то нужно поискать другой алгоритм. Наверняка есть что-то специализированное. Ну и соответственно внешнее и затратное по всем параметрам.


Алгоритм оптимальный, работает быстро, считает все правильно.
Мне интересен подход, как другие делают расчеты не на SQL, произвести "сложные" расчеты и заложить алгоритм.
4 сен 19, 11:26    [21963128]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Focha

Сколько времени в среднем работает расчет графика отгрузки?

Сообщение было отредактировано: 5 сен 19, 10:00
4 сен 19, 11:26    [21963131]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
mayton
KreatorXXI,
Сколько времени в среднем работает расчет графика отгрузки?

данный кусок работает ~10 секунд, а все 2 минуты. я думаю где-то есть истина, что такие расчеты "легче" разработать на чем-то другом.
4 сен 19, 14:28    [21963471]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 820
Focha,

не на SQL делают, когда не хотят привязываться к конкретному SQL. Либо PL этого SQL убогий (или его совсем нет). Ну ещё может быть, что задача специфическая, совсем не ложится под возможности конкретного SQL. А у Вас уже всё на сервере. Круто!
4 сен 19, 14:50    [21963505]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Focha,

Твоя цель - уменьшить время работы алгоритма?
4 сен 19, 16:44    [21963669]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
mayton
Focha,
Твоя цель - уменьшить время работы алгоритма?
нет, моя цель узнать какие еще есть варианты.
4 сен 19, 17:15    [21963719]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Focha
mayton
Focha,
Твоя цель - уменьшить время работы алгоритма?
нет, моя цель узнать какие еще есть варианты.

Выше по тексту тебе предложили хранимые процедуры на базе clr.
Хороший вариант. Я плюсую т.к и T-SQL и CLR это технологии
от одного производителя. И соотв. проблем с типами не будет.
Все будет совместимо.

Далее нам говорить тут в топике не очем. Т.к. код ты не показал.
И я... и все здесь присутствующие чувствуют себя дураками обсуждая
то чего не видно.

Поэтому сделай одолжение. Попробуй что-то написать сам и выдать нам
результаты в топик.

Выдавливать мысли из нас без кода... это как говорил мой бывший босс - высасывать гной из грязного пальца.

Надеюсь на твоё понимание.
4 сен 19, 17:20    [21963726]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
mayton
Focha
пропущено...
нет, моя цель узнать какие еще есть варианты.

Выше по тексту тебе предложили хранимые процедуры на базе clr.
Хороший вариант. Я плюсую т.к и T-SQL и CLR это технологии
от одного производителя. И соотв. проблем с типами не будет.
Все будет совместимо.

Далее нам говорить тут в топике не очем. Т.к. код ты не показал.
И я... и все здесь присутствующие чувствуют себя дураками обсуждая
то чего не видно.

Поэтому сделай одолжение. Попробуй что-то написать сам и выдать нам
результаты в топик.

Выдавливать мысли из нас без кода... это как говорил мой бывший босс - высасывать гной из грязного пальца.

Надеюсь на твоё понимание.


без проблем, вот часть, распределяет текущие остатки между заявками с учетом срока годности, мой вопрос был не как реализовать, а где вы производите расчеты и что используете.
Может кто-то делает расчеты на C# CLR или Python или R или не знаю на VBA, пока я не услышал "у нас в компании алгоритмы и расчеты на CLR в основном и часть на SQL"
-- создаем индексы для расчетов		
if (select INDEXPROPERTY(object_id('calc.plan_production_finished_products'),'NoCl_stock_sort_row','IndexID')) is null
	CREATE NONCLUSTERED INDEX NoCl_stock_sort_row ON calc.plan_production_finished_products (stock_sort_row);
						
if (select INDEXPROPERTY(object_id('calc.plan_production_finished_products'),'NoCl_stock','IndexID')) is null
	CREATE NONCLUSTERED INDEX NoCl_stock
	ON calc.plan_production_finished_products (data_type, reason_ignore_in_calculate, sap_id, stock_sort_row)
	INCLUDE (row_id,stock_on_date,stock_kg,stock_current_KOS,stock_KOS_in_day,stock_shipment_kg);
							



-- берем первую заявку
select @shipment_sort_row = min(stock_sort_row) -- ключ строки для которой считаем 			
from calc.plan_production_finished_products
where data_type in ('заявки', 'план продаж') 
	and reason_ignore_in_calculate is null;


-- =============== --
-- ОСНОВНОЙ РАСЧЕТ --
-- =============== --
while not @shipment_sort_row is null
begin
	

			-- заполняем переменные по отгрузке
			select
					 @shipment_row_id	= c.row_id
					,@shipment_sap_id	= c.sap_id
					,@shipment_date		= c.shipment_date
					,@shipment_min_KOS	= c.shipment_min_KOS
					,@shipment_kg		= c.shipment_kg
			from calc.plan_production_finished_products as c
			where c.stock_sort_row = @shipment_sort_row


			-- ==================== --
			-- распределяем остатки --
			-- ==================== --
			set @stock_sort_row = 0

			while not @stock_sort_row is null -- 0 для входа в цикл, если остатки null, то выходим из цикла -- 
			begin
																
							-- заполняем остатки
							select 
									 @stock_row_id		= max(st.row_id)
									,@stock_sort_row	= max(st.stock_sort_row)
									,@stock_on_date		= max(st.stock_on_date)
									,@stock_current_KOS = max(st.stock_current_KOS)
									,@stock_KOS_in_day	= max(st.stock_KOS_in_day)
									,@stock_kg			= max(st.stock_kg)
							from (
										select top 1 
												 st.row_id
												,st.stock_sort_row
												,st.stock_on_date
												,st.stock_current_KOS
												,st.stock_KOS_in_day
												,st.stock_kg - isnull(st.stock_shipment_kg, 0) as stock_kg
										from calc.plan_production_finished_products as st
										where st.sap_id = @shipment_sap_id
										and st.stock_sort_row > @stock_sort_row
										and st.stock_kg - isnull(st.stock_shipment_kg, 0) <> 0
										and st.data_type = 'Остатки'
										and st.reason_ignore_in_calculate is null
										order by st.stock_sort_row
									) as st;



							-- ПРОВЕРКА: если остатков нет
							if @stock_sort_row is null
							begin
								CONTINUE
							end;



							-- ПРОВЕРКА: расчета КОС по заявкам или плану продаж
							if @stock_current_KOS - (@stock_KOS_in_day * DATEDIFF(day,  @stock_on_date, @shipment_date)) <= @shipment_min_KOS
							begin
								CONTINUE
							end;



							-- РАСПРЕДЕЛЯЕМ: если заказали больше чем на остатках, но берем кол-во на остатках или кол-во заказанного
							update calc.plan_production_finished_products
							set stock_shipment_kg = isnull(stock_shipment_kg, 0) + iif(@shipment_kg > @stock_kg, @stock_kg, @shipment_kg)
							where stock_sort_row in (@shipment_sort_row, @stock_sort_row);


							-- ЛОГ: остатков	
							insert into #log_change (json_text)														
							values (N'{ 
										 "data_type"		:"log остатки"
										,"from_row_id"	:' + convert(varchar(9), @stock_row_id) + '
										,"for_row_id"	:' + convert(varchar(9), @shipment_row_id) + '
										,"kg"			:' + convert(varchar(20), iif(@shipment_kg > @stock_kg, @stock_kg, @shipment_kg)  ) + ' 
										}');



							-- ПРОВЕРКА: кол-во отгруженного = 0
							select @shipment_kg = c.shipment_kg - isnull(c.stock_shipment_kg, 0)
							from calc.plan_production_finished_products as c
							where c.stock_sort_row = @shipment_sort_row;

							-- если 0 выходим из цикла
							if @shipment_kg = 0
							begin
								set @stock_sort_row = null
								CONTINUE
							end;

			end;

			select @shipment_sort_row = min(stock_sort_row) -- ключ строки для которой считаем 			
			from calc.plan_production_finished_products
			where data_type in ('заявки', 'план продаж') 
				and reason_ignore_in_calculate is null
				and stock_sort_row > @shipment_sort_row;

end;

-- удаляем индексы
drop index NoCl_stock_sort_row on calc.plan_production_finished_products
drop index NoCl_stock on calc.plan_production_finished_products  
4 сен 19, 17:35    [21963749]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Есть описание таблички plan_production_finished_products в виде ddl?
4 сен 19, 17:52    [21963765]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
L.Otujktd
Member

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

Я бы попробовал все перенести в объектное представление и в linq завернуть потихоньку и что-то респараллелить/закешировать. Плюс в это во всем что можно прикрутить визуализацию и красивые диаграммы
4 сен 19, 18:38    [21963804]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
А зачем индексы создаются и убиваются? Странная практика.

Из Ораклового опыта... я-бы их 1 раз создал как HIDDEN. И потом в запросах активировал бы когда
надо хинтами.

И еще вопрос
1) Сколько всего строк в табличке plan_production_finished_products?
2) Сколько из них реально используются в расчетах?
4 сен 19, 18:53    [21963827]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 938
Focha
Алгоритм все считает в 2 хранимках на сервере, но мне кажется, реализация на t-sql мягко говоря это не то.

а чего нет? Чем ближе к данным, тем лучше.
считает "всё"
считает быстро
считает правильно
работает - не тронь (с)

если тащить это куда-то ИЗ базы, значит уже лишнюю работу делать
быстрее будет, только если алгоритмы говно, тогда конечно можно взять C++ и заюзать евойные алгоритмы
это будет оптимально.
Focha
А вы делали большие и сложные расчеты

а это разве "большой и сложный"?
сходите к синоптикам, посмотрите, как они погоду считают Картинка с другого сайта.
5 сен 19, 05:14    [21964135]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 938
Focha
данный кусок работает ~10 секунд, а все 2 минуты. я думаю где-то есть истина, что такие расчеты "легче" разработать на чем-то другом.

это от запросов и алгоритма зависит
перетащить данные в C++ будет ещё дольше
но скорость расчётов останется ~такой же, если алгоритм не изменить
5 сен 19, 05:17    [21964137]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 938
where data_type in ('заявки', 'план продаж') 
	and reason_ignore_in_calculate is null;


-- удаляем индексы
drop index NoCl_stock_sort_row on calc.plan_production_finished_products
drop index NoCl_stock on calc.plan_production_finished_products  

мда, ну тут вообще не к БД претензии
если увидим DDL таблицы, думаю будем плакать всем форумом
5 сен 19, 05:25    [21964138]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
monstrU
Member

Откуда: Москва
Сообщений: 1164
я бы тут рассматривал выбор - бизнес логику держать в БД или в приложении.
сейчас ты выбрал вариант 2.
у обеих есть плюсы и минусы.
по бд
плюсы - в теории сравнительно быстро работает (на практике как угодно), просто подменить
минусы- трудозатратно в разработке и сопровождении, юнит тесты в архитектуре не предусмотрены

бизнес логика в приложении
плюсы - на вменяемом железе производительность на уровне, разработка на высокоуровневом языке C# или похожем, писать сложную логику проще, юнит тесты применять можно
минусы - обновление выполнять только с обновлением приложения (если это минус) , дополнительно в приложении надо слой бизнес логики строить.

у тебя задачи логистики - там сложность логики может быть любая.
лучше писать ее по юнит тестам, чтобы понимать что за логика реализована.

у тебя вот написаны 2 процедуры - как ты будешь уверен через 3 месяца, что они поддерживают тот же функционал, что и сегодня без тестов? никак.

обычно заводят логический слой - типа классы OrderService, в котором реализовывают методы, занимающиеся формированием заказа, как у тебя. в БД такие классы не лезут - для этого отдельный слой заводят.

в общем срач не первый на эту темы.

подходов 2 - у каждого есть плюсы и минусы. выбери для себя что тебе важнее по приоритетам и его и используй
5 сен 19, 08:50    [21964189]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
mayton
Есть описание таблички plan_production_finished_products в виде ddl?

полудух
мда, ну тут вообще не к БД претензии
если увидим DDL таблицы, думаю будем плакать всем форумом


Одна таблица используется в расчетах.
create table calc.plan_production_finished_products
(

		 row_id							INT					NOT NULL	IDENTITY(1,1)	
		,data_type						varchar(100)		NOT NULL
		,name_system					varchar(7)				NULL
		,path_file						varchar(300)			NULL
		,date_file						datetime				NULL
		,download_user					varchar(50)				NULL
		,dt_tm_insert					datetime				NULL
									
		,reason_ignore_in_calculate		VARCHAR(300)			NULL

		,sap_id							BIGINT					NULL
		,sap_id_text					as convert(varchar(24), FORMAT(sap_id, '000000000000000000000000'))
		,sap_id_original				BIGINT					NULL
		,sap_id_original_text			as convert(varchar(24), FORMAT(sap_id_original, '000000000000000000000000'))
		,sap_id_expiration_date_in_days	SMALLINT				NULL

		,stuffing_id					VARCHAR(40)				NULL
		,stuffing_id_box				VARCHAR(40)				NULL

		,position_dependent_id			INT						NULL	
		,individual_marking_id			TINYINT					NULL	
		,article_nomenclature			VARCHAR(20)				NULL	
		,article_packaging				VARCHAR(25)				NULL	
		,product_finished_id			decimal(14, 0)			NULL


		--- остатки ---
		,stock_sort_row					INT						NULL -- используется для расчетов
		,stock_warehouse_name			VARCHAR(100)			NULL	
		,stock_storage_area_name		VARCHAR(100)			NULL	
		,stock_branch_name				VARCHAR(100)			NULL
		,stock_production_date			DATETIME				NULL
		,stock_on_date					DATETIME				NULL
		,stock_expiration_date			DATETIME				NULL
		,stock_kg						dec(11,5)				NULL

		,stock_current_KOS				as case when stock_production_date >= stock_expiration_date then null  
												when stock_production_date >  stock_on_date		    then null
												when stock_expiration_date <= stock_on_date		    then 0.000000	
												when stock_production_date	= stock_on_date			then 1
												else DATEDIFF(day, stock_on_date, stock_expiration_date) * 1.0 / DATEDIFF(day, stock_production_date, stock_expiration_date) end

		,stock_KOS_in_day				as case when stock_production_date >= stock_expiration_date then null	
												when stock_production_date >  stock_on_date			then null
												else 1.0 / DATEDIFF(day, stock_production_date, stock_expiration_date) end	
													



		--- набивки ---
		,stuffing_sort_row						INT					NULL -- используется для расчетов
		,stuffing_production_name				VARCHAR(100)		NULL
		,stuffing_production_date_from			DATETIME			NULL
		,stuffing_production_date_to			DATETIME			NULL
		,stuffing_available_date				DATETIME			NULL
		,stuffing_expiration_date				DATETIME			NULL
		,stuffing_maturation					tinyint				NULL
		,stuffing_maturation_and_packaging		tinyint				NULL
		,stuffing_transit_from_production_days	tinyint				null	

		,stuffing_begin_production_date_from	DATETIME			NULL -- дата с которой можем закладывать
		,stuffing_begin_production_date_to		as stuffing_begin_production_date_from + stuffing_maturation
		,stuffing_begin_available_date			as stuffing_begin_production_date_from + stuffing_maturation_and_packaging + stuffing_transit_from_production_days

		,stuffing_kg							dec(11,5)			NULL

		,stuffing_current_KOS				as case when stuffing_production_date_to >= stuffing_expiration_date	then null  
													when stuffing_production_date_to >  stuffing_available_date		then null
													when stuffing_expiration_date	 <= stuffing_available_date		then 0.000000
													when stuffing_production_date_to  = stuffing_available_date		then 1		
													else DATEDIFF(day, stuffing_available_date, stuffing_expiration_date) * 1.0 / DATEDIFF(day, stuffing_production_date_to, stuffing_expiration_date) end

		,stuffing_KOS_in_day				as case when stuffing_production_date_to >= stuffing_expiration_date then null	
													when stuffing_production_date_to >  stuffing_available_date	 then null
													else 1.0 / DATEDIFF(day, stuffing_production_date_to, stuffing_expiration_date) end	




		-- заявки и план продаж
		,shipment_sales_channel_id		TINYINT					NULL
		,shipment_sales_channel_name	VARCHAR(25)				NULL
		,shipment_branch_id				VARCHAR(20)				NULL	
		,shipment_branch_name			VARCHAR(100)			NULL	
		,shipment_customer_id			VARCHAR(20)				NULL
		,shipment_customer_name			VARCHAR(100)			NULL

		,shipment_priority				TINYINT					NULL
		,shipment_priority_for_stuffing tinyint					NULL -- для набивок когда сортировку делаем по приоритету
		,shipment_date					DATETIME				NULL
		,shipment_min_KOS				DEC(7,6)				NULL
		,shipment_kg					dec(11,5)				NULL

		-- расчетные поля

		,stock_shipment_kg				dec(11,5)				NULL
		,stock_net_need					as case when data_type in ('ЗАЯВКИ', 'ПЛАН ПРОДАЖ') then nullif( shipment_kg - isnull(stock_shipment_kg, 0)   , 0) end

		,stuffing_marking_kg			dec(11,5)				NULL			   
		,stuffing_shipment_kg			dec(11,5)				NULL	-- кол-во которое уже отгружено из набивки включая маркировку
		,stuffing_net_need				as case when data_type in ('ЗАЯВКИ', 'ПЛАН ПРОДАЖ') then nullif(   shipment_kg - isnull(stock_shipment_kg, 0) - isnull(stuffing_shipment_kg, 0)   , 0) end

)



L.Otujktd
Focha,

Я бы попробовал все перенести в объектное представление и в linq завернуть потихоньку и что-то респараллелить/закешировать. Плюс в это во всем что можно прикрутить визуализацию и красивые диаграммы

Как понимаю если mssql то C# наверное надо попробовать.

mayton
А зачем индексы создаются и убиваются? Странная практика.

Из Ораклового опыта... я-бы их 1 раз создал как HIDDEN. И потом в запросах активировал бы когда
надо хинтами.

И еще вопрос
1) Сколько всего строк в табличке plan_production_finished_products?
2) Сколько из них реально используются в расчетах?


1) Строк 100 000 всего
2) Цикл бегает по строкам
Спасибо, что-то не подумал включать и отключать, так и сделаю


полудух
Focha
Алгоритм все считает в 2 хранимках на сервере, но мне кажется, реализация на t-sql мягко говоря это не то.

а чего нет? Чем ближе к данным, тем лучше.
считает "всё"
считает быстро
считает правильно
работает - не тронь (с)

если тащить это куда-то ИЗ базы, значит уже лишнюю работу делать
быстрее будет, только если алгоритмы говно, тогда конечно можно взять C++ и заюзать евойные алгоритмы
это будет оптимально.
Focha
А вы делали большие и сложные расчеты

а это разве "большой и сложный"?
сходите к синоптикам, посмотрите, как они погоду считают Картинка с другого сайта.


А как же совершенствовать свое творение?
На момент когда разрабатываешь с нуля кажется расчет сложный, а когда завершаешь разработку, то понимаешь, что тут всего 10 строк кода.
CLR работает внутри базы, так что думаю попробовать перенести расчет на C# CLR, но это не значит, что я отключу хранимки. Хочу попробовать


полудух
Focha
данный кусок работает ~10 секунд, а все 2 минуты. я думаю где-то есть истина, что такие расчеты "легче" разработать на чем-то другом.

это от запросов и алгоритма зависит
перетащить данные в C++ будет ещё дольше
но скорость расчётов останется ~такой же, если алгоритм не изменить

Да, зависит, вот и думаю, что на C# можно придумать другой алгоритм
5 сен 19, 08:57    [21964191]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
monstrU
я бы тут рассматривал выбор - бизнес логику держать в БД или в приложении.
сейчас ты выбрал вариант 2.
у обеих есть плюсы и минусы.
по бд
плюсы - в теории сравнительно быстро работает (на практике как угодно), просто подменить
минусы- трудозатратно в разработке и сопровождении, юнит тесты в архитектуре не предусмотрены

бизнес логика в приложении
плюсы - на вменяемом железе производительность на уровне, разработка на высокоуровневом языке C# или похожем, писать сложную логику проще, юнит тесты применять можно
минусы - обновление выполнять только с обновлением приложения (если это минус) , дополнительно в приложении надо слой бизнес логики строить.

у тебя задачи логистики - там сложность логики может быть любая.
лучше писать ее по юнит тестам, чтобы понимать что за логика реализована.

у тебя вот написаны 2 процедуры - как ты будешь уверен через 3 месяца, что они поддерживают тот же функционал, что и сегодня без тестов? никак.

обычно заводят логический слой - типа классы OrderService, в котором реализовывают методы, занимающиеся формированием заказа, как у тебя. в БД такие классы не лезут - для этого отдельный слой заводят.

в общем срач не первый на эту темы.

подходов 2 - у каждого есть плюсы и минусы. выбери для себя что тебе важнее по приоритетам и его и используй


Почему я выбрал 2, если бизнес логику держу в БД. Очень интересный ответ, спасибо
5 сен 19, 09:02    [21964198]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
ViPRos
Member

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

оставь как есть
5 сен 19, 11:21    [21964343]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 938
индексы забыли.
Focha
А как же совершенствовать свое творение?

так совершенствовать надо знания БД и алгоритмику
вот так нельзя делать вообще никогда:
where data_type in ('заявки', 'план продаж') 
	and reason_ignore_in_calculate is null;

"заявки" и "план продаж" это справочники и искать надо, соответственно, по ID

автор
Например задача, мне нужно сделать график отгрузки, с учетом графика работы и вместимости машин. Алгоритм должен заполнить машину на 99%-100%, кол-во машин ограничено, заказ нельзя разделять (в 1 машину можно больше 1 заказа, но нельзя 0.5 заказа). Задача стандартная в логистике.

не выглядит как неподъёмная для plsql задача
но если прям никак, то сделайте свой SELECT и посчитайте, где удобно
хоть посмотрите, а оно вам вообще поможет или всё таки дело в алгоритмах
5 сен 19, 11:50    [21964380]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
ViPRos
Focha,
оставь как есть
а я не собирался менять, я думаю о других инструментах

полудух
индексы забыли.
так совершенствовать надо знания БД и алгоритмику
вот так нельзя делать вообще никогда:
"заявки" и "план продаж" это справочники и искать надо, соответственно, по ID
не выглядит как неподъёмная для plsql задача
но если прям никак, то сделайте свой SELECT и посчитайте, где удобно
хоть посмотрите, а оно вам вообще поможет или всё таки дело в алгоритмах

индексы создаются позже, когда таблица данными заполниться, по совету выше переделал, на включение и выключение индексы.
Спасибо за совет "так совершенствовать надо знания БД и алгоритмику" и еще CLR совершенствовать буду
5 сен 19, 12:25    [21964413]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Focha
1) Строк 100 000 всего
2) Цикл бегает по строкам
Спасибо, что-то не подумал включать и отключать, так и сделаю

Смотри. Эффективность альтернативного решения должна базироваться на том что мы.

1) Из таблицы в 100 000 строк выбираем выборку X строк
where data_type in ('заявки', 'план продаж') 
	and reason_ignore_in_calculate is null;


и сохраняем их в коллекции CLR/C++/Java/Python e.t.c.

2) Выполняем процессинг данных в коллекциях в точности по тому-же алгоритму который реализован в T-SQL
+

Есть ли какое-то международное название у этого алгоритма? Что это? Транспортная задача? Transport Problem?
Combinatorial optimization? Если мы найдем ее каноническую формулировку то - будет и коробочное решение.

3) Сохраняем результат в #log_change

Недостатки.

Мы должны гарантировать что трансфер X строк в коллекции будет быстрее чем 2 минуты.
Если это не так - то альтернативное решение бесполезно.

При этом мы должны быстро сбрасывать результаты в лог изменений. Если они будут медленнее чем 2 минуты
то альтернатива тоже не подходит.

Объем коллекций (хеш-таблиц и деревьев и графов) в памяти не должен превышать доступную память машины
где идет вычисление. Выполнять это напрямую на сервере также опасно. Память сервера обычно занята задачами
БД и как-то забирать у нее ресурсы - нехорошо. Теряется контроль над ситуацией. ДБА тоже поставлен в сложное
положение.
5 сен 19, 14:59    [21964639]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
L.Otujktd
Member

Откуда:
Сообщений: 81
Focha,
Я так понимаю задачка у Вас на перспективу, тк входные данные одни, а вариантов обработки потенциально много. Те вопрос в том, как разработать систему, которую можно былобы гибко адаптировать под другие алгоритмы используя какие-то уже готовые блоки. на выходе вообще получается подобие nosql , судя по общей картине.
5 сен 19, 22:08    [21964953]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 938
Focha
индексы создаются позже, когда таблица данными заполниться, по совету выше переделал, на включение и выключение индексы.

я говорю - DDL без индексов это просто портянка
"создаются позже" это зачем/почему?
5 сен 19, 22:28    [21964970]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
mayton
Смотри. Эффективность альтернативного решения должна базироваться на том что мы.
1) Из таблицы в 100 000 строк выбираем выборку X строк
и сохраняем их в коллекции CLR/C++/Java/Python e.t.c.
2) Выполняем процессинг данных в коллекциях в точности по тому-же алгоритму который реализован в T-SQL
3) Сохраняем результат в #log_change
Недостатки.
Мы должны гарантировать что трансфер X строк в коллекции будет быстрее чем 2 минуты.
Если это не так - то альтернативное решение бесполезно.
При этом мы должны быстро сбрасывать результаты в лог изменений. Если они будут медленнее чем 2 минуты
то альтернатива тоже не подходит.
Объем коллекций (хеш-таблиц и деревьев и графов) в памяти не должен превышать доступную память машины
где идет вычисление. Выполнять это напрямую на сервере также опасно. Память сервера обычно занята задачами
БД и как-то забирать у нее ресурсы - нехорошо. Теряется контроль над ситуацией. ДБА тоже поставлен в сложное
положение.
Сервер используется как раз для расчетов, не для учета каких-то данных.
Ваше утверждение больше говорит о том как посчитать, я понимаю, что любой алгоритм можно написать на CLR/C++/Java/Python e.t.c. , пока из всех ответом мне больше нравиться перенести на C# и ООП, не факт, что будет быстрее, но я получу внутренне спокойствие, что делаю все верно. Python/R тоже вариант
L.Otujktd
Focha,
Я так понимаю задачка у Вас на перспективу, тк входные данные одни, а вариантов обработки потенциально много. Те вопрос в том, как разработать систему, которую можно былобы гибко адаптировать под другие алгоритмы используя какие-то уже готовые блоки. на выходе вообще получается подобие nosql , судя по общей картине.
Спасибо вам, вы мне помогаете более точно определить, что я хочу, только не разработать, а какой инструмент выбрать.
Может сможете посоветовать, что использовать?
полудух
Focha
индексы создаются позже, когда таблица данными заполниться, по совету выше переделал, на включение и выключение индексы.

я говорю - DDL без индексов это просто портянка
"создаются позже" это зачем/почему?
Вы можете забыть про mssql? представьте у меня есть задача, данные хранятся в таблице и мне нужно произвести расчет без t-sql
6 сен 19, 09:11    [21965075]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
monstrU
Member

Откуда: Москва
Сообщений: 1164
Focha
Вы можете забыть про mssql? представьте у меня есть задача, данные хранятся в таблице и мне нужно произвести расчет без t-sql


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

и все равно, где у тебя хранятся данные -в таблице, их отдает веб сервис, конструируешь их в оператовной памяти.
так ты плавно дойдешь до формирования логического слоя БЛ в приложении. и при получении советов - написать clr в БД будешь думать - нафиг мне внедрять C# в бд если эта логика и так в приложении сидит
6 сен 19, 09:32    [21965091]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 938
Focha
Вы можете забыть про mssql? представьте у меня есть задача, данные хранятся в таблице и мне нужно произвести расчет без t-sql

да вы всё никак в толк не возьмёте, что вам нужно будет перетаскивать данные из БД в
Focha
CLR/C++/Java/Python e.t.c.

а делать вам это через WHERE, где те самые индексы и участвуют
у вас и сейчас алгоритмы тормозят частично из-за индексов
но потом у вас всё будет тормозить ещё и потому, что 100000 строк надо перетащить в другое место Картинка с другого сайта.
6 сен 19, 10:10    [21965123]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
ИВП
Member

Откуда:
Сообщений: 238
Как-то задача нечетко сформулирована.
Ограничения есть, а целевой функции нет.
Просто распихать груз по транспортным средствам? Можно по-разному, а что критерием является?
6 сен 19, 10:43    [21965159]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
Тема закрыта, буду копать в сторону алгоритмов и C#
6 сен 19, 11:27    [21965192]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Есть готовый код который работает. Разве мы не можем получить из него алгоритм?

Это называется реверс-инжинеринг.

Конешно лучше не решать данную задачу таким образом а генерализировать ее.
Найти обобщённый подход. И решить через него. Канонически.
6 сен 19, 14:00    [21965356]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Программирование Ответить