Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
Ув. Коллеги! Как можно оптимальнее с точки зрения быстродействия, решить следующую задачу: Дана таблица: Код: sql 1. 2. 3. 4. Поле - [ID36] - число, в 36-ричной системе исчисления. Кто переливал данные из баз 1С 7.7 - поймёт откуда "растут ноги" у задачи. [ID36] - число строго из 6 символов, с ведущими пробелами. "Алфавит" системы исчисления - "стандартный": '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' Суть задачи: преобразовать значение колонки [ID36] из 36-ричной системы исчисления в 10-ричную, и полученным значением заполнить поле [ID10]. Сама по себе задача перевода из 36-ричной системы исчисления в 10-ричную - задача не сложная. Учитывая, что ведущий пробел, это то же самое, что и ведущий ноль, Решение #1 (самое простое, "в лоб"): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Решение #2: (основано на ascii-кодах символов: '0'..'9' : 48..57; 'A'..'Z' : 65..90 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Ну и соответственно: Код: sql 1. 2. 3. Однако для таблицы размером в 100 млн записей продолжительность выполнения update составляет примерно 1 час, т.е. примерно 3600 секунд. Можно ли каким-то образом ускорить обновление таблицы? Какие есть идеи оптимизации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 01:09 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
Vlad_Molodoj, ну по хорошему надо бы план посмотреть, где затык. Может статься, что все уходит на запись (IO) 100млн и улучшить можно лишь на пару процентов. ну а чтобы избежать расчетов по каждой строке, подсчитайте один раз и запишите в отдельную таблицу. Оттуда потом и тащить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 02:36 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
Vlad_MolodojКакие есть идеи оптимизации? Заменить скалярку на инлайновую функцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 03:23 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
Сон Веры ПавловныVlad_MolodojКакие есть идеи оптимизации? Заменить скалярку на инлайновую функцию. Это паллиатив. Спасет тока таблица. ПОЛНАЯ таблица соответствий [ID36] -> [ID10]. С индексом по [ID36] Опосля чего join и ... фсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 06:28 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
aleks222Сон Веры Павловныпропущено... Заменить скалярку на инлайновую функцию. Это паллиатив. Спасет тока таблица. ПОЛНАЯ таблица соответствий [ID36] -> [ID10]. С индексом по [ID36] Опосля чего join и ... фсе. йез. зы. слово "паллиатив" понравилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 11:12 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
aleks222Спасет тока таблица. ПОЛНАЯ таблица соответствий [ID36] -> [ID10]. С индексом по [ID36] Vlad_Molodoj[ID36] - число строго из 6 символов 36^6-1=2176782335. Ну, ничё так оптимизация. Из области военно-полевой хирургии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 11:34 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
Интересный вопрос - а если сделать [ID10] вычисляемым persisted столбцом, то это поможет топикстартеру или нет? Формула расчёта для ID10 уже есть. Если развивать идею с отдельной таблицей для join-a, то сначала: а) select distinct ID36, convert(int, NULL) as ID10 в временную таблицу; б) сравниваем число строк в исходной таблице и во временной. Если число строк в временной таблице больше 1/4 - идею в топку, временную таблицу туда же. в) если продолжаем работу - рассчитываем и заполняем ID10 в новой таблице, строим индексы по Id36, и update исходной таблицы рассчитанными значениями из временной, удаляем индекс на временной таблице, удаляем временную таблицу. Индекс на исходной таблице - с ним по вкусу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 12:03 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
Vlad_Molodoj, суть задачи guid -> int что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 12:05 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
Vlad_Molodoj, попробуйте переписать функцию как inline табличную. Скалярная препятствует созданию параллельного плана выполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 13:34 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 15:23 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
Хотя простое Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Планировщик оценивает как в 4.5 раза менее затратное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 15:57 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
KopellyХотя простое ... Планировщик оценивает как в 4.5 раза менее затратное.Кто бы сомневался. Vlad_Molodoj, используйте Решение #1, только перепишите на инлайн. Скалярные функции будут медленные, даже если функция будет содержать только код return 0, это бай дизайн ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 00:24 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
Интересно, сколько еще раз надо написать об инлайн-функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 10:45 |
|
||
|
MS SQL 2016 оптимизация функции
|
|||
|---|---|---|---|
|
#18+
Vlad_MolodojМожно ли каким-то образом ускорить обновление таблицы? Какие есть идеи оптимизации?Во-первых, ваша первая функция неверна - не учитывается '0'. Обе ваши реализации примерно одинаково тормозные, ибо, как уже писали, - скалярные функции на T-SQL не блещут производительностью. Для вашего конкретного случая (update), можно ощутимо увеличить производительность, объявив функции с опцией with schemabinding. Это уберет из плана выполнения ненужный table spool. Еще немного ускорить можно, и об этом писали, - переписать функцию как инлайновую. Но значительного выигрыша по сравнению со скалярной с привязкой к схеме не будет - затраты на манипуляции со строками сильно выше затрат на вызов скалярной функции. И параллелиться этот вариант с тоже не будет, ибо в простом update параллелить нечего. Вариант 21511445 будет хорош, если вам не жалко примерно 30Гб на таблицу соответствий и у обеих таблиц имеется кластерный индекс по [ID36]. И в этом варианте возможно распараллеливание соединения таблиц. В общем, есть задачи, которые на чистом T-SQL решаются плохо. Ваша как раз из таких. Если действительно нужно существенно ускорить выполнение - пишите функцию конвертации на SQLCLR - будет быстрее всего вышеперечисленного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 17:40 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39663858&tid=1689516]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 348ms |

| 0 / 0 |
