powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / На чем создать расчет, поделитесь опытом
39 сообщений из 39, показаны все 2 страниц
На чем создать расчет, поделитесь опытом
    #39856499
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, вот уже не первый месяц я понимаю, что можно сделать проще, а не изобретать велосипед.

Например на сервере mssql хранятся данные:
Отгрузка:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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,	
) 



График работы:
Код: sql
1.
2.
3.
4.
5.
create table #schedule_work
(
	 dt_tm			datetime	not null
	,dw			smallint	    null
)



Список машин :
Код: sql
1.
2.
3.
4.
5.
create table #cars
(
	 car		int		not null
	,volume		dec(11,5)	    null
)



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

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


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

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


Спасибо
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39856552
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha что посмотреть и что почитать Ну, вероятно, алгоритмически - про задачу линейного раскроя (как правило, она рассматривается как частный случай задачи о рюкзаке).

Focha где писали сложные расчеты и какой язык использовали?
Данная задача - несложная, пока нет лимита по ресурсам. А у тебя их и не будет, вероятно... так что пофиг. какой язык лучше знаешь, на том и пиши... да хоть в Excel поиск решения используй.
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39856738
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaFocha что посмотреть и что почитать Ну, вероятно, алгоритмически - про задачу линейного раскроя (как правило, она рассматривается как частный случай задачи о рюкзаке).

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

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

Я смотрю вы это делаете в Excel
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39856744
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FochaЯ смотрю вы это делаете в ExcelУ меня вообще таких задач нет. Но когда появляются (было лет семь назад, помнится) - Эксель вполне себе справился.

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

Наверное, есть средства, либо специально под этот класс задач заточенные, либо несложно к ним применимые... та же генетика, к примеру. Но увы, конкретных не назову, не моя область.
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39856784
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНаверное, есть средства, либо специально под этот класс задач заточенные, либо несложно к ним применимые... та же генетика, к примеру. Но увы, конкретных не назову, не моя область.


Мне данная область интересна, но куда копать пока не пойму.
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39856874
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Focha,

Добрый вечер! Если есть алгоритм то все-равно на каком языке это реализовывать.
Проще наверное перевести все в объектное представление и реализовать все на с#. Тк при желании можно спокойно прикрутить и тесты и orm и отлаживать проще
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39856896
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы запихнул расчет в clr-процедуру
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39856927
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор пишет что у него уже есть 2 хранимки которые все считают.

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

Верно?
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39856931
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L.OtujktdЕсли есть алгоритм то все-равно на каком языке это реализовывать.
Проще наверное перевести все в объектное представление и реализовать все на с#. Тк при желании можно спокойно прикрутить и тесты и orm и отлаживать проще
Я вот думал о C# и CLR, но хочу узнать ваше мнение, каким образом у вас построены расчеты / алгоритмы / бизнес процессы или как еще там называют это


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


maytonАвтор пишет что у него уже есть 2 хранимки которые все считают.
Но автор считает что это - не феньшуй.
Верно?
Да, ваш комментарий 100% отображает мою проблемы.
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857007
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha,

Я бы оставил хранимки. Если они делают дело, то чудесно. Если считаете, что алгоритм не оптимальный, то нужно поискать другой алгоритм. Наверняка есть что-то специализированное. Ну и соответственно внешнее и затратное по всем параметрам.
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857029
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIFocha,

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

Алгоритм оптимальный, работает быстро, считает все правильно.
Мне интересен подход, как другие делают расчеты не на SQL, произвести "сложные" расчеты и заложить алгоритм.
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857031
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha

Сколько времени в среднем работает расчет графика отгрузки?
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857199
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonKreatorXXI,
Сколько времени в среднем работает расчет графика отгрузки?

данный кусок работает ~10 секунд, а все 2 минуты. я думаю где-то есть истина, что такие расчеты "легче" разработать на чем-то другом.
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857221
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha,

не на SQL делают, когда не хотят привязываться к конкретному SQL. Либо PL этого SQL убогий (или его совсем нет). Ну ещё может быть, что задача специфическая, совсем не ложится под возможности конкретного SQL. А у Вас уже всё на сервере. Круто!
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857336
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha,

Твоя цель - уменьшить время работы алгоритма?
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857378
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonFocha,
Твоя цель - уменьшить время работы алгоритма?
нет, моя цель узнать какие еще есть варианты.
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857382
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FochamaytonFocha,
Твоя цель - уменьшить время работы алгоритма?
нет, моя цель узнать какие еще есть варианты.
Выше по тексту тебе предложили хранимые процедуры на базе clr.
Хороший вариант. Я плюсую т.к и T-SQL и CLR это технологии
от одного производителя. И соотв. проблем с типами не будет.
Все будет совместимо.

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

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

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

Надеюсь на твоё понимание.
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857399
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonFochaпропущено...
нет, моя цель узнать какие еще есть варианты.
Выше по тексту тебе предложили хранимые процедуры на базе clr.
Хороший вариант. Я плюсую т.к и T-SQL и CLR это технологии
от одного производителя. И соотв. проблем с типами не будет.
Все будет совместимо.

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

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

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

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

без проблем, вот часть, распределяет текущие остатки между заявками с учетом срока годности, мой вопрос был не как реализовать, а где вы производите расчеты и что используете.
Может кто-то делает расчеты на C# CLR или Python или R или не знаю на VBA, пока я не услышал "у нас в компании алгоритмы и расчеты на CLR в основном и часть на SQL"
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
-- создаем индексы для расчетов		
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  
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857410
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть описание таблички plan_production_finished_products в виде ddl?
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857437
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Focha,

Я бы попробовал все перенести в объектное представление и в linq завернуть потихоньку и что-то респараллелить/закешировать. Плюс в это во всем что можно прикрутить визуализацию и красивые диаграммы
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857449
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем индексы создаются и убиваются? Странная практика.

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

И еще вопрос
1) Сколько всего строк в табличке plan_production_finished_products?
2) Сколько из них реально используются в расчетах?
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857664
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FochaАлгоритм все считает в 2 хранимках на сервере, но мне кажется, реализация на t-sql мягко говоря это не то.
а чего нет? Чем ближе к данным, тем лучше.
считает "всё"
считает быстро
считает правильно
работает - не тронь (с)

если тащить это куда-то ИЗ базы, значит уже лишнюю работу делать
быстрее будет, только если алгоритмы говно, тогда конечно можно взять C++ и заюзать евойные алгоритмы
это будет оптимально.
FochaА вы делали большие и сложные расчеты
а это разве "большой и сложный"?
сходите к синоптикам, посмотрите, как они погоду считают
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857666
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fochaданный кусок работает ~10 секунд, а все 2 минуты. я думаю где-то есть истина, что такие расчеты "легче" разработать на чем-то другом.
это от запросов и алгоритма зависит
перетащить данные в C++ будет ещё дольше
но скорость расчётов останется ~такой же, если алгоритм не изменить
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857667
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
where data_type in ('заявки', 'план продаж') 
	and reason_ignore_in_calculate is null;



Код: sql
1.
2.
3.
-- удаляем индексы
drop index NoCl_stock_sort_row on calc.plan_production_finished_products
drop index NoCl_stock on calc.plan_production_finished_products  


мда, ну тут вообще не к БД претензии
если увидим DDL таблицы, думаю будем плакать всем форумом
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857701
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы тут рассматривал выбор - бизнес логику держать в БД или в приложении.
сейчас ты выбрал вариант 2.
у обеих есть плюсы и минусы.
по бд
плюсы - в теории сравнительно быстро работает (на практике как угодно), просто подменить
минусы- трудозатратно в разработке и сопровождении, юнит тесты в архитектуре не предусмотрены

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

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

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

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

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

подходов 2 - у каждого есть плюсы и минусы. выбери для себя что тебе важнее по приоритетам и его и используй
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857703
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсть описание таблички plan_production_finished_products в виде ddl?

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

Одна таблица используется в расчетах.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
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.OtujktdFocha,

Я бы попробовал все перенести в объектное представление и в 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# можно придумать другой алгоритм
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857706
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUя бы тут рассматривал выбор - бизнес логику держать в БД или в приложении.
сейчас ты выбрал вариант 2.
у обеих есть плюсы и минусы.
по бд
плюсы - в теории сравнительно быстро работает (на практике как угодно), просто подменить
минусы- трудозатратно в разработке и сопровождении, юнит тесты в архитектуре не предусмотрены

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

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

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

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

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

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

Почему я выбрал 2, если бизнес логику держу в БД. Очень интересный ответ, спасибо
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857794
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha,

оставь как есть
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857818
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
индексы забыли.
FochaА как же совершенствовать свое творение?
так совершенствовать надо знания БД и алгоритмику
вот так нельзя делать вообще никогда:
Код: sql
1.
2.
where data_type in ('заявки', 'план продаж') 
	and reason_ignore_in_calculate is null;


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

авторНапример задача, мне нужно сделать график отгрузки, с учетом графика работы и вместимости машин. Алгоритм должен заполнить машину на 99%-100%, кол-во машин ограничено, заказ нельзя разделять (в 1 машину можно больше 1 заказа, но нельзя 0.5 заказа). Задача стандартная в логистике.
не выглядит как неподъёмная для plsql задача
но если прям никак, то сделайте свой SELECT и посчитайте, где удобно
хоть посмотрите, а оно вам вообще поможет или всё таки дело в алгоритмах
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857837
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosFocha,
оставь как есть
а я не собирался менять, я думаю о других инструментах

полудухиндексы забыли.
так совершенствовать надо знания БД и алгоритмику
вот так нельзя делать вообще никогда:
"заявки" и "план продаж" это справочники и искать надо, соответственно, по ID
не выглядит как неподъёмная для plsql задача
но если прям никак, то сделайте свой SELECT и посчитайте, где удобно
хоть посмотрите, а оно вам вообще поможет или всё таки дело в алгоритмах
индексы создаются позже, когда таблица данными заполниться, по совету выше переделал, на включение и выключение индексы.
Спасибо за совет " так совершенствовать надо знания БД и алгоритмику " и еще CLR совершенствовать буду
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39857954
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha1) Строк 100 000 всего
2) Цикл бегает по строкам
Спасибо, что-то не подумал включать и отключать, так и сделаю

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

1) Из таблицы в 100 000 строк выбираем выборку X строк
Код: sql
1.
2.
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 минуты
то альтернатива тоже не подходит.

Объем коллекций (хеш-таблиц и деревьев и графов) в памяти не должен превышать доступную память машины
где идет вычисление. Выполнять это напрямую на сервере также опасно. Память сервера обычно занята задачами
БД и как-то забирать у нее ресурсы - нехорошо. Теряется контроль над ситуацией. ДБА тоже поставлен в сложное
положение.
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39858157
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Focha,
Я так понимаю задачка у Вас на перспективу, тк входные данные одни, а вариантов обработки потенциально много. Те вопрос в том, как разработать систему, которую можно былобы гибко адаптировать под другие алгоритмы используя какие-то уже готовые блоки. на выходе вообще получается подобие nosql , судя по общей картине.
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39858170
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fochaиндексы создаются позже, когда таблица данными заполниться, по совету выше переделал, на включение и выключение индексы.
я говорю - DDL без индексов это просто портянка
"создаются позже" это зачем/почему?
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39858255
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.OtujktdFocha,
Я так понимаю задачка у Вас на перспективу, тк входные данные одни, а вариантов обработки потенциально много. Те вопрос в том, как разработать систему, которую можно былобы гибко адаптировать под другие алгоритмы используя какие-то уже готовые блоки. на выходе вообще получается подобие nosql , судя по общей картине.
Спасибо вам, вы мне помогаете более точно определить, что я хочу, только не разработать, а какой инструмент выбрать.
Может сможете посоветовать, что использовать?
полудухFochaиндексы создаются позже, когда таблица данными заполниться, по совету выше переделал, на включение и выключение индексы.
я говорю - DDL без индексов это просто портянка
"создаются позже" это зачем/почему?
Вы можете забыть про mssql? представьте у меня есть задача, данные хранятся в таблице и мне нужно произвести расчет без t-sql
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39858267
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FochaВы можете забыть про mssql? представьте у меня есть задача, данные хранятся в таблице и мне нужно произвести расчет без t-sql

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

и все равно, где у тебя хранятся данные -в таблице, их отдает веб сервис, конструируешь их в оператовной памяти.
так ты плавно дойдешь до формирования логического слоя БЛ в приложении. и при получении советов - написать clr в БД будешь думать - нафиг мне внедрять C# в бд если эта логика и так в приложении сидит
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39858286
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FochaВы можете забыть про mssql? представьте у меня есть задача, данные хранятся в таблице и мне нужно произвести расчет без t-sql
да вы всё никак в толк не возьмёте, что вам нужно будет перетаскивать данные из БД в
FochaCLR/C++/Java/Python e.t.c.
а делать вам это через WHERE, где те самые индексы и участвуют
у вас и сейчас алгоритмы тормозят частично из-за индексов
но потом у вас всё будет тормозить ещё и потому, что 100000 строк надо перетащить в другое место
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39858306
ИВП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то задача нечетко сформулирована.
Ограничения есть, а целевой функции нет.
Просто распихать груз по транспортным средствам? Можно по-разному, а что критерием является?
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39858327
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема закрыта, буду копать в сторону алгоритмов и C#
...
Рейтинг: 0 / 0
На чем создать расчет, поделитесь опытом
    #39858425
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть готовый код который работает. Разве мы не можем получить из него алгоритм?

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

Конешно лучше не решать данную задачу таким образом а генерализировать ее.
Найти обобщённый подход. И решить через него. Канонически.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / На чем создать расчет, поделитесь опытом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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