|
|
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
У меня в проекте очень часто вызывается одна хранимая процедура. Все работает уже очень давно, но я решил сейчас её хоть как-нибудь оптимизировать по производительности. Эта процедура резервирования товара. Она прежде всего работает с двумя относительно не большими таблицами: Rezerved (7000записей)-резервы и несколько большей Ost(200000) записей. Записи в обоих таблицах очень часто меняются множеством пользователей одновременно в рамках транзакции на запись каждого документа. Она работает в 2-х режимах 1)В Rezerved больше чем в Ost. Нужно убрать резерв. В этом случае делается курсор по некоторым записям Rezerved (которые для данного товара и для данного магазина) Количество записей всегда >0, но практически в 99.999999% случаях очень мало, < 5. В среднем где-то 80% только 1 запись. Мы проходим по этому курсору и делаем UPDATE или DELETE записям ID которых нам дает этот курсор. Процедура работала уже лет 10 и все это время в ней был обычный курсор "cursor for" хотя от него было нужно только пройти по нему один раз в одном направлении (самое распространенное и элементарное использование) , только сегодня я поставил "cursor local fast_forward for". Надеюсь одно это уже должно улучшить ситуацию. И сейчас думаю как лучше дальше поступить? Сохранять запрос который сейчас идет в курсор в таблицу-переменную и создавать курсор только когда в ней больше чем одна запись, а если одна запись то делать все те же действия но без курсора? Прекрасно понимаю что курсор всегда вредит производительности, но будет ли выигрыш в данной ситуации? Создание таблицы-переменной специально для этого, это ведь мизер и не должно тут ухудшить производительность. Окончательный ответ может дать только непосредственная проверка, но с этим к сожалению не просто, ибо процедура эта работает вместе с множеством других сложных и довольно тормознутых операций и она меняет данные к тому же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 22:34 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
Да забыл сказать. Использую Delphi 2010 и компоненты доступа к MSSQL - SDAC 6.11.23 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 22:37 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
Все состояния предмета (остаток,резерв,приход и т.д.) следует хранить в одной таблице. Я сделал именно так и никаких проблем оптимизации по нескольким таблицам не возникает. БД с указанной таблицей в составе системы торговли работает уже более 15 лет в сотнях мест... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 22:50 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
bilovМы проходим по этому курсору и делаем UPDATE или DELETE записям ID которых нам дает этот курсор.Зачем делать медленный цикл? Почему не написать это одним запросом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 23:48 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
Обычно, количество товара определяется на любую дату как Ближайшая Инвентаризация + Приход (от Инвентаризации до нужной даты) - Расход (от инвентаризации до нужной даты). Итого намечается ТРИ таблички, в которых не нужно ничего пересчитывать и удалять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 08:01 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
Все это было определено за лет 7 до меня или ещё раньше. Ни времени, ни желания, ни полномочий то менять у меня нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 09:00 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
bilovВсе это было определено за лет 7 до меня или ещё раньше. Ни времени, ни желания, ни полномочий то менять у меня нет. Структура БД неверная. Кто накосячил, пусть тот и исправляет. Если нет полномочий менять структуру, тогда бесполезно возиться с оптимизацией. Безногому костыли уже не помогут... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 09:16 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
miksoft, Вы считаете что в моем случае курсор вида Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. возможно и имеет смысл (с учетом той статистики о которой я написал вначале) переделать как запрос? Как-то с использованием последних современных оконных функций типа Код: sql 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 09:19 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
Резервирование - это ЧЕТВЁРТАЯ табличка, которая появляется в цепочке Количество на Дату = Ближайшая Инвентаризация + Приход - Расход - Резерв И ничего пересчитывать не нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 09:31 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
Курсор вполне оптимальный, ИМХО. По каким полям есть индексы и какие ? Статистики обновляете ? Как вариант - рассмотреть возможность вызывать процедуру как-нибудь реже или в отложенном режиме. Таблица-переменная не поможет. Даже ухудшит ситуацию. Структура БД неверная. Кто накосячил, пусть тот и исправляет.Отличный совет. Но дартаньянский... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 09:41 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
bilov, merge используй избавься от курсоров. А вообще текст скрипта таблиц с индексами, текст процедуры T-SQL и план запроса в студию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 09:42 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
d7ibilovВсе это было определено за лет 7 до меня или ещё раньше. Ни времени, ни желания, ни полномочий то менять у меня нет. Структура БД неверная. Кто накосячил, пусть тот и исправляет. Если нет полномочий менять структуру, тогда бесполезно возиться с оптимизацией. Безногому костыли уже не помогут... Ога, все сломать и написать заново - так победим (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 09:43 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
d7i, Я обязательно об этом заявлю после того как уволюсь и получу расчет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 12:53 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
Дед-Папыхтет, Таблица резервов (меньшая из двух) у меня такая Код: 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. Проблемы в ней видно сразу. По логике ни одно из полей не должно быть NULL никогда, а они имеют такую возможность. Наверное это тоже вредит чуть чуть. Надо будет на работе вопрос поднять. Можно было бы и текст процедуры выложить, но он здоровый довольно, только логику вопроса затуманит. А курсор с которым сражаюсь я выкладывал, можно найти по "set @Delta =@K_Res-@K_Ost" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 22:39 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
bilov, А ты можешь словами сформировать задачу? В 1-2 абзаца ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 08:26 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
Дед-Папыхтетbilov, А ты можешь словами сформировать задачу? В 1-2 абзаца Желательно сразу что бы было понятно что такое @K_Res, @K_Ost. Ну и Количество меньше дельта или больше дельта в коде виден апдейт делит, а вот смысл этого не ясен. Я к тому когда смысл понятен, можно эффективнее найти решение, а не подбивать существующий код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 08:30 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
Курсор сам по себе очень медленный функционал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 09:21 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
эндиКурсор сам по себе очень медленный функционал.Но иногда сильно выручает. Н-р организовать привязку партий по ФИФО курсором выходит эффективнее, чем запросами. По моему опыту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 09:28 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
bilov, и результат запроса плиз print @@version ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 10:01 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
Дед-Папыхтет, Тут в этом всем хозяйстве смысл длиною в жизнь. Мня забанят сразу если я значительную часть этой портянки тут выложу. На данный момент решаю часть задачи связанную с этим курсором. Думаю поставить проверку типа такого Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. может что-то другое, более щадящее поставить? например так Код: sql 1. 2. 3. , а потом к @tbD обращаться, но тут говорят многие что таблица-переменная это плохо. И вообще имеет ли смысл это делать учитывая " Rezerved (7000записей)." И для данного курсора справедливо "Количество записей всегда >0, но практически в 99.999999% случаях очень мало, < 5. В среднем где-то 80% только 1 запись. Мы проходим по этому курсору и делаем UPDATE или DELETE записям ID которых нам дает этот курсор" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 10:24 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
Дед-Папыхтет, print @@version Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Feb 10 2012 19:39:15 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 10:27 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
У меня одного возник вопрос "а Delphi тут при чём"? Кроме этого bilovИспользую Delphi 2010 и компоненты доступа к MSSQL - SDAC 6.11.23 нет ничего, относящегося к этому разделу форума. Может, лучше перенести в раздел по MSSQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 11:01 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
goldmi45У меня одного возник вопрос "а Delphi тут при чём"? Кроме этого bilovИспользую Delphi 2010 и компоненты доступа к MSSQL - SDAC 6.11.23 нет ничего, относящегося к этому разделу форума. Может, лучше перенести в раздел по MSSQL?пожалуй +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 11:13 |
|
||
|
Тонкости оптимизации для небольшой но очень часто используемой хранимой процедуры MSSQL
|
|||
|---|---|---|---|
|
#18+
bilov, Я попытался воспроизвести на случайных данных Код: 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. у меня чота сколько не пробовал выходит на апдейт списывает дельту и дельта обнуляется цикл заканчивается. Я в упор не понимаю пока что ты хочешь сделать в итоге. Или данные приведи какие то инсерт в таблицу в этот скрипт дополни что бы разные вариации изменений удалений были. Или как то поясни что делать то должен этот курсор? PS: а зачем в сортировке - order by RecID DESC, D_Reg DESC, N_Reg DESC указаны D_Reg, N_Reg? у тебя сортировка стоит изначально по уникальному RecID, внутри уникальных строк сортировки не будет никакой - это на работу не влияет, но настораживает смысл этого кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 12:34 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39632968&tid=2040969]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
185ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 493ms |

| 0 / 0 |
