Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory,

Во первых в краткости, меньше всяких функции и ходов, то есть лаконично.
Во вторых, новые технологии, то есть использовать всю мощь 2012 Сервера
30 июн 14, 16:36    [16239758]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kimel
Во первых в краткости, меньше всяких функции и ходов, то есть лаконично.

Ага. Типа одной команды UNGROUPING ?

Kimel
Во вторых, новые технологии, то есть использовать всю мощь 2012 Сервера

Это чтобы все процессоры были заняты на 100% ? И вся память была забита данными ? И чтобы диски не проистаивали ?
30 июн 14, 16:38    [16239771]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
_djХомяГ,

В этом способе что вы дали, есть существенный недостаток, который будет, НУ ОЧЕНЬ сильно тормозить при ОБНОВЛЕНИИ.
Смотрите
-----надо продать 15 штук
declare @to_sale table(itemid int,qty int)
insert into @to_sale 
select 1,15
-----на складе 2 партии товара 
declare @store table(itemid int,qty int,partid int)
insert into @store
select 1,0,1
union all
select 1,10,2
union all
select 1,10,3
union all
select 1,10,4
union all
select 1,10,5;
select * from @store
;

with cte 
as
(
   select itemid,partid,qty,(select sum(qty) from @store s1 where s.itemid=s1.itemid and s.partid>=s1.partid) as tot
   from @store s 
  
)
-------списываем с хранилища 
select 
  case when s.qty-(tot-c.qty)>c.qty then c.qty 
       when s.qty-(tot-c.qty)<0      then 0
       else s.qty-(tot-c.qty)
  end     , 
  c.itemid,c.partid
from cte c join @to_sale s 
on c.itemid=s.itemid

Выходит, что
у нас в селекте
NewOstatok ProductID PartID
011
1012
513
014
015

Если представить реальную таблицу на 100т партий, то выйдет
в результате такая же таблица на 100т
Теперь не хитрый вопрос.
Почему нельзя в ВЫВОДЕ этого запроса ВЫВОДИТЬ только ИЗМЕНЕННЫЕ партии, остальные не выводить, ПОТОМУ ЧТО при обновлении UPDATE придётся все 100т обновлять, а не только те которые изменились
30 июн 14, 16:43    [16239804]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Kimel,

навскидку
create table #t(id int, Ostatki int, Ostatkiafter int)

insert #t(id, Ostatki) values(1, 10)
insert #t(id, Ostatki) values(2, 10)
insert #t(id, Ostatki) values(3, 10)
insert #t(id, Ostatki) values(4, 10)

DECLARE @qty int 
SET @qty = 15
select t.id, Ostatki,  
qut = case when sum(Ostatki) over (order by t.id) - @qty < 0 then @qty 
                    when sum(Ostatki) over (order by t.id) - @qty < Ostatki then Ostatki - (sum(Ostatki) over (order by t.id) - @qty)
                    else 0 end,
Ostatkiafter= case when sum(Ostatki) over (order by t.id) - @qty < 0 then 0 
                    when sum(Ostatki) over (order by t.id) - @qty < Ostatki then sum(Ostatki) over (order by t.id) - @qty
                    else Ostatki end
from #t t 
ORDER BY t.id

drop table #t
30 июн 14, 16:44    [16239809]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory,
Я ведь серьёзно говорю.
Под мощь понятны новые фичи 2012 сервера.
30 июн 14, 16:44    [16239812]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
WarAnt
Kimel,

навскидку
create table #t(id int, Ostatki int, Ostatkiafter int)

insert #t(id, Ostatki) values(1, 10)
insert #t(id, Ostatki) values(2, 10)
insert #t(id, Ostatki) values(3, 10)
insert #t(id, Ostatki) values(4, 10)

DECLARE @qty int 
SET @qty = 15
select t.id, Ostatki,  
qut = case when sum(Ostatki) over (order by t.id) - @qty < 0 then @qty 
                    when sum(Ostatki) over (order by t.id) - @qty < Ostatki then Ostatki - (sum(Ostatki) over (order by t.id) - @qty)
                    else 0 end,
Ostatkiafter= case when sum(Ostatki) over (order by t.id) - @qty < 0 then 0 
                    when sum(Ostatki) over (order by t.id) - @qty < Ostatki then sum(Ostatki) over (order by t.id) - @qty
                    else Ostatki end
from #t t 
ORDER BY t.id

drop table #t

ОЧень интересное решение, она судя по ПЛАНУ ВЫПОЛНЕНИЯ и прочей фигне быстрее работает, так как более линейно
Но таже проблема, что и в прошлом
автор
Если представить реальную таблицу на 100т партий, то выйдет
в результате такая же таблица на 100т
Теперь не хитрый вопрос.
Почему нельзя в ВЫВОДЕ этого запроса ВЫВОДИТЬ только ИЗМЕНЕННЫЕ партии, остальные не выводить, ПОТОМУ ЧТО при обновлении UPDATE придётся все 100т обновлять, а не только те которые изменились
30 июн 14, 16:47    [16239831]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kimel
Я ведь серьёзно говорю.

Вы серьезно считаете, что если упрятать код за ширмой одной команды, то он станет круче и быстрее ?
30 июн 14, 16:48    [16239832]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
_djХомяГ
Guest
Kimel
Если представить реальную таблицу на 100т партий, то выйдет
в результате такая же таблица на 100т
Теперь не хитрый вопрос.
Почему нельзя в ВЫВОДЕ этого запроса ВЫВОДИТЬ только ИЗМЕНЕННЫЕ партии, остальные не выводить, ПОТОМУ ЧТО при обновлении UPDATE придётся все 100т обновлять, а не только те которые изменились

Ну флаг Вам в руки - если так хочется, логируйте изменения , только уверяю, наткнетесь на еще большие траблы
30 июн 14, 16:53    [16239882]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory
Kimel
Я ведь серьёзно говорю.

Вы серьезно считаете, что если упрятать код за ширмой одной команды, то он станет круче и быстрее ?

Это не всегда так
Ведь если просто взять допустим
Таблицу
Числа
1
2
3
4
5
6
7

Теперь можно посчтать сумму как

DECLARE @i Int, @a Int
SET @i = 0
SET @a = 0
WHILE @i<=(SELECT MAX([Числа]))
BEGIN
@a = (SELECT * FROM [Числа] WHERE [Числа] = @a) + 1
END

А можно просто
SELECT SUM([Числа]) from [Числа]

Как вы думаете, что быстрее там где больше всяких функций и длинее код или там где меньше??

И в детском садике понятно, что чем лаконичнее код и чем "легче" функции тем быстрее он выполняется
30 июн 14, 16:54    [16239895]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
_djХомяГ,

Нет нет нет, я не об этом какикие ещё логи и измененния!!???
Мы говорим только о выборке.
То есть в выборке должны быть только те партии КОТОРЫЕ ПОДЛЕЖАТ ИЗМЕНЕНИЮ.
Потому, что и так понятно зачем остальные брать в выборку? Какой от них толк
30 июн 14, 16:56    [16239909]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kimel
И в детском садике понятно, что чем лаконичнее код и чем "легче" функции тем быстрее он выполняется

Смешно. Т.е. если я спрячу цикл в UDF, то он сразу станет легче и быстрее.
30 июн 14, 16:57    [16239918]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory,

А попробуйте никуда не прятать и сократить, в этом вся соль
30 июн 14, 16:58    [16239924]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36928
Kimel
Как вы думаете, что быстрее там где больше всяких функций и длинее код или там где меньше??
Т.е. для вас основной критерий - кол-во букв в запросе что ли?
30 июн 14, 17:00    [16239934]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
_djХомяГ
Guest
А откуда сервер узнает какие подлежат изменению - из логики ( в данном случае FIFO) или наобум ?
30 июн 14, 17:00    [16239936]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kimel
Glory,

А попробуйте никуда не прятать и сократить, в этом вся соль

Да вы стратег. Наверное вы знаете, как там внутри 2012 реализована каждая функция
30 июн 14, 17:02    [16239959]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
_djХомяГ
А откуда сервер узнает какие подлежат изменению - из логики ( в данном случае FIFO) или наобум ?

Я тоже подумал, вот какие идеи у меня есть.

Вот запрос приведу, что бы был под рукой
+ SQL
SET STATISTICS TIME ON;
create table #t(id int, Ostatki int, Ostatkiafter int)

insert #t(id, Ostatki) values(1, 10)
insert #t(id, Ostatki) values(2, 10)
insert #t(id, Ostatki) values(3, 10)
insert #t(id, Ostatki) values(4, 10)
select * from #t
DECLARE @qty int 
SET @qty = 15
select t.id, Ostatki,  
qut = case when sum(Ostatki) over (order by t.id) - @qty < 0 then @qty 
                    when sum(Ostatki) over (order by t.id) - @qty < Ostatki then Ostatki - (sum(Ostatki) over (order by t.id) - @qty)
                    else 0 end,
Ostatkiafter= case when sum(Ostatki) over (order by t.id) - @qty < 0 then 0 
                    when sum(Ostatki) over (order by t.id) - @qty < Ostatki then sum(Ostatki) over (order by t.id) - @qty
                    else Ostatki end
from #t t
ORDER BY t.id
SET STATISTICS TIME OFF;
drop table #t

Вот результат
id Ostatk qut Ostatkiafter
1 10 15 0
2 10 5 5
3 10 0 10
4 10 0 10

Судя по всем там где qut > 0, то те Id партии и Ostatky мне и нужны.
Потмоу что остальных вычесления не затронут

Нужно что-то типа WHERE qut > 0 но у меня не выходит вот запрос
+
SET STATISTICS TIME ON;
create table #t(id int, Ostatki int, Ostatkiafter int)

insert #t(id, Ostatki) values(1, 10)
insert #t(id, Ostatki) values(2, 10)
insert #t(id, Ostatki) values(3, 10)
insert #t(id, Ostatki) values(4, 10)
DECLARE @qty int 
SET @qty = 15
select t.id, Ostatki,  
qut = case when sum(Ostatki) over (order by t.id) - @qty < 0 then @qty 
                    when sum(Ostatki) over (order by t.id) - @qty < Ostatki then Ostatki - (sum(Ostatki) over (order by t.id) - @qty)
                    else 0 end,
Ostatkiafter= case when sum(Ostatki) over (order by t.id) - @qty < 0 then 0 
                    when sum(Ostatki) over (order by t.id) - @qty < Ostatki then sum(Ostatki) over (order by t.id) - @qty
                    else Ostatki end
from #t t
WHERE qut > 0
ORDER BY t.id
SET STATISTICS TIME OFF;
drop table #t

Даёт ошибку Сообщение 207, уровень 16, состояние 1, строка 18
Недопустимое имя столбца "qut".

Очень странно, помогите
30 июн 14, 17:08    [16240004]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kimel
Очень странно, помогите

И этот человек рассуждает о фичах.
Имена вычисляемых полей запроса доступны только в ORDER BY этого запроса.
30 июн 14, 17:12    [16240031]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory,

получается что бы убрать ненужны строиз запроса, всё это дело нужно в ещё один select завернуть?
30 июн 14, 17:13    [16240037]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kimel
получается что бы убрать ненужны строиз запроса, всё это дело нужно в ещё один select завернуть?

Только не говорите, что "это опять же возврат к процедурам, всякие условия CASE и так далее"
30 июн 14, 17:15    [16240051]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory,

SET STATISTICS TIME ON;
create table #t(id int, Ostatki int, Ostatkiafter int)

insert #t(id, Ostatki) values(1, 10)
insert #t(id, Ostatki) values(2, 10)
insert #t(id, Ostatki) values(3, 10)
insert #t(id, Ostatki) values(4, 10)
DECLARE @qty int 
SET @qty = 15
select * from(
select t.id, Ostatki,  
qut = case when sum(Ostatki) over (order by t.id) - @qty < 0 then @qty 
                    when sum(Ostatki) over (order by t.id) - @qty < Ostatki then Ostatki - (sum(Ostatki) over (order by t.id) - @qty)
                    else 0 end,
Ostatkiafter= case when sum(Ostatki) over (order by t.id) - @qty < 0 then 0 
                    when sum(Ostatki) over (order by t.id) - @qty < Ostatki then sum(Ostatki) over (order by t.id) - @qty
                    else Ostatki end
from #t t


) as a
WHERE qut > 0 
drop table #t

Вот так я получаю то, что нужно. Но это не кошерно, 2 селекта, можно как-то сократить, нужна лаконичность
30 июн 14, 17:16    [16240054]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kimel
Но это не кошерно, 2 селекта, можно как-то сократить, нужна лаконичность

Вы что серьезно считаете, что здесь 2 запроса ?
Вы наверное всерьез думаете, что сервер выполняет запрос именно в том порядке, как вы написали ?
30 июн 14, 17:18    [16240068]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory,

Я надеюсь что оптимизатор запросов сделает что-то на уровне СЕРВЕРА 2012 и выше!
30 июн 14, 17:19    [16240078]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kimel
Я надеюсь что оптимизатор запросов сделает что-то на уровне СЕРВЕРА 2012 и выше!

Фейспалм он сделает.
30 июн 14, 17:20    [16240084]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Glory,

Почему?
30 июн 14, 17:23    [16240100]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация Алгоритма FIFO для Списания остатков  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kimel
Glory,

Почему?

Потому что SQL - это декларативный язык.
Вы указываете серверу, что вы хотите получить. А не то, как это надо сделать.
30 июн 14, 17:25    [16240109]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить