Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] 3 вперед Ctrl→ все |
Kimel Member Откуда: Украина Сообщений: 334 |
Glory, Во первых в краткости, меньше всяких функции и ходов, то есть лаконично. Во вторых, новые технологии, то есть использовать всю мощь 2012 Сервера |
30 июн 14, 16:36 [16239758] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Ага. Типа одной команды UNGROUPING ?
Это чтобы все процессоры были заняты на 100% ? И вся память была забита данными ? И чтобы диски не проистаивали ? |
||||
30 июн 14, 16:38 [16239771] Ответить | Цитировать Сообщить модератору |
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 Выходит, что у нас в селекте
Если представить реальную таблицу на 100т партий, то выйдет в результате такая же таблица на 100т Теперь не хитрый вопрос. Почему нельзя в ВЫВОДЕ этого запроса ВЫВОДИТЬ только ИЗМЕНЕННЫЕ партии, остальные не выводить, ПОТОМУ ЧТО при обновлении UPDATE придётся все 100т обновлять, а не только те которые изменились |
|||||||||||||||||||
30 июн 14, 16:43 [16239804] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
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] Ответить | Цитировать Сообщить модератору |
Kimel Member Откуда: Украина Сообщений: 334 |
Glory, Я ведь серьёзно говорю. Под мощь понятны новые фичи 2012 сервера. |
30 июн 14, 16:44 [16239812] Ответить | Цитировать Сообщить модератору |
Kimel Member Откуда: Украина Сообщений: 334 |
ОЧень интересное решение, она судя по ПЛАНУ ВЫПОЛНЕНИЯ и прочей фигне быстрее работает, так как более линейно Но таже проблема, что и в прошлом
|
||||
30 июн 14, 16:47 [16239831] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вы серьезно считаете, что если упрятать код за ширмой одной команды, то он станет круче и быстрее ? |
||
30 июн 14, 16:48 [16239832] Ответить | Цитировать Сообщить модератору |
_djХомяГ
Guest |
Ну флаг Вам в руки - если так хочется, логируйте изменения , только уверяю, наткнетесь на еще большие траблы |
||
30 июн 14, 16:53 [16239882] Ответить | Цитировать Сообщить модератору |
Kimel Member Откуда: Украина Сообщений: 334 |
Это не всегда так Ведь если просто взять допустим Таблицу
Теперь можно посчтать сумму как 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] Ответить | Цитировать Сообщить модератору |
Kimel Member Откуда: Украина Сообщений: 334 |
_djХомяГ, Нет нет нет, я не об этом какикие ещё логи и измененния!!??? Мы говорим только о выборке. То есть в выборке должны быть только те партии КОТОРЫЕ ПОДЛЕЖАТ ИЗМЕНЕНИЮ. Потому, что и так понятно зачем остальные брать в выборку? Какой от них толк |
30 июн 14, 16:56 [16239909] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Смешно. Т.е. если я спрячу цикл в UDF, то он сразу станет легче и быстрее. |
||
30 июн 14, 16:57 [16239918] Ответить | Цитировать Сообщить модератору |
Kimel Member Откуда: Украина Сообщений: 334 |
Glory, А попробуйте никуда не прятать и сократить, в этом вся соль |
30 июн 14, 16:58 [16239924] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
|
||
30 июн 14, 17:00 [16239934] Ответить | Цитировать Сообщить модератору |
_djХомяГ
Guest |
А откуда сервер узнает какие подлежат изменению - из логики ( в данном случае FIFO) или наобум ? |
30 июн 14, 17:00 [16239936] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Да вы стратег. Наверное вы знаете, как там внутри 2012 реализована каждая функция |
||
30 июн 14, 17:02 [16239959] Ответить | Цитировать Сообщить модератору |
Kimel Member Откуда: Украина Сообщений: 334 |
Я тоже подумал, вот какие идеи у меня есть. Вот запрос приведу, что бы был под рукой
Вот результат
Судя по всем там где qut > 0, то те Id партии и Ostatky мне и нужны. Потмоу что остальных вычесления не затронут Нужно что-то типа WHERE qut > 0 но у меня не выходит вот запрос
Даёт ошибку Сообщение 207, уровень 16, состояние 1, строка 18 Недопустимое имя столбца "qut". Очень странно, помогите |
|||||||||||||||||||||||||
30 июн 14, 17:08 [16240004] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
И этот человек рассуждает о фичах. Имена вычисляемых полей запроса доступны только в ORDER BY этого запроса. |
||
30 июн 14, 17:12 [16240031] Ответить | Цитировать Сообщить модератору |
Kimel Member Откуда: Украина Сообщений: 334 |
Glory, получается что бы убрать ненужны строиз запроса, всё это дело нужно в ещё один select завернуть? |
30 июн 14, 17:13 [16240037] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Только не говорите, что "это опять же возврат к процедурам, всякие условия CASE и так далее" |
||
30 июн 14, 17:15 [16240051] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вы что серьезно считаете, что здесь 2 запроса ? Вы наверное всерьез думаете, что сервер выполняет запрос именно в том порядке, как вы написали ? |
||
30 июн 14, 17:18 [16240068] Ответить | Цитировать Сообщить модератору |
Kimel Member Откуда: Украина Сообщений: 334 |
Glory, Я надеюсь что оптимизатор запросов сделает что-то на уровне СЕРВЕРА 2012 и выше! |
30 июн 14, 17:19 [16240078] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Фейспалм он сделает. |
||
30 июн 14, 17:20 [16240084] Ответить | Цитировать Сообщить модератору |
Kimel Member Откуда: Украина Сообщений: 334 |
Glory, Почему? |
30 июн 14, 17:23 [16240100] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Потому что SQL - это декларативный язык. Вы указываете серверу, что вы хотите получить. А не то, как это надо сделать. |
||
30 июн 14, 17:25 [16240109] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] 3 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |