Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
Есть база данных MS SQL Server 2008 R2 с нагрузкой 2000 транзакций в секунду. Есть таблицы lion_Tasks(uid_obj, order_new, __usn_field_order_new, и еще 40 полей) и таблица lion_Tasks_Changes_Parts(uid_task_cp, uid_user_cp, __usn_entity_cp и еще 20 полей ). На веб-сервер прилетает 10 тысяч объектов, у которых изменилось только одно поле order_new. В базе нужно обновить только 3 поля. Эти объекты передаю табличным параметром в хранимую процедуру: Код: 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. Отрабатывает 10-20 секунд. Пробовал еще такой вариант без temp-овой БД. Но результат тот же. Код: 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. Temp-овая БД находится на SSD-диске. Может кто подскажет, куда копать для ускорения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 17:30 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980 SELECT * INTO #t3 FROM @Table CREATE NONCLUSTERED INDEX IDX_T3_UID_TASK ON #t3(UUID_TASK) CREATE NONCLUSTERED INDEX IDX_T3_UID_USER ON #t3(UUID_USER)Зачем? Сделайте сразу в типе TasksNewOrderTableType (через unique-констрейнты с участием сурогатного уникального поля). Так же не ясно, зачем эти индексы нужны в принципе. Ну и планы надо смотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 17:35 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
Хорошо. Индексы уберу как написали. План для варианта с join-ами прикрепил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 18:15 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980, Планы нужны актуальные, а не оценочные. И в формате sqlplan, а не картинками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 18:18 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
Как их получить для хранимых процедур? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 18:21 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980куда копать для ускорения? Откуда уверенность, что можно "быстрее"? Таки "10 тысяч курьеров скачутобъектов". Рази тока вот так написать, если вероятность "обновить на то же самое" не нулевая Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 18:52 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980Отрабатывает 10-20 секунд. Пробовал еще такой вариант без temp-овой БД. Но результат тот же.А поля dbo.lion_Tasks.uid_obj и dbo.lion_Tasks_Changes_Parts.uid_task_cp какого типа? У первого ГУИД, и на него кластерный индекс, а второй - просто FK? Если так, то обновление 10 000 записей есть обновление 10 000 случайных страниц, и должно делаться долго. Вам нужно подумать над моделью данных и архитектурой системы, оптимальны ли они, ну или просто наращивать железо. Индексы, конечно, не нужны, как и перелив в временную таблицу, это же у вас просто передача записей для обновления, сервер их должен все прочитать, и, соответственно, скан будет самым оптимальным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 18:59 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
aleks222Рази тока вот так написать, если вероятность "обновить на то же самое" не нулеваяДа, вот это очень важно, т.к. в данном случае медленное именно обновление, если памяти достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 19:00 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980Как их получить для хранимых процедур?Профайлером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 19:01 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980Как их получить для хранимых процедур?Профайлер. Extended Events. Либо выполнить в студии, обеспечив при вызове такие же опции соединения, язык и значения параметров. После проблемного вызова, посмотрите в sys.dm_exec_procedure_stats данные по процедуре. Если last_elapsed_time много больше last_worker_time - имеют место ожидания (на блокировках и т.п.). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 19:06 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
Спасибо всем кто окликнулся. Завтра пришлю актуальный план выполнения хранимой процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 20:03 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
alexeyvggepard1980Отрабатывает 10-20 секунд. Пробовал еще такой вариант без temp-овой БД. Но результат тот же.А поля dbo.lion_Tasks.uid_obj и dbo.lion_Tasks_Changes_Parts.uid_task_cp какого типа? У первого ГУИД, и на него кластерный индекс, а второй - просто FK? Если так, то обновление 10 000 записей есть обновление 10 000 случайных страниц, и должно делаться долго. Вам нужно подумать над моделью данных и архитектурой системы, оптимальны ли они, ну или просто наращивать железо. Индексы, конечно, не нужны, как и перелив в временную таблицу, это же у вас просто передача записей для обновления, сервер их должен все прочитать, и, соответственно, скан будет самым оптимальным. Перешел на вариант без использования tempdb. dbo.lion_Tasks.uid_obj - Guid (кластерный), dbo.lion_Tasks_Changes_Parts.uid_task_cp - Guid (некластерный) - просто FK. На архитектуру думаю повлиять так: если пришло больше тысячи, обрабатывать только тысячу и кидать флаг клиенту, чтобы он другие присылал объекты. Короче разбить один большой запрос на несколько. Еще попробовал к хранимой процедуре добавить WITH RECOMPILE. Буду в логах смотреть - есть ли смысл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 08:35 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
alexeyvggepard1980Как их получить для хранимых процедур?Профайлером. Для данной ХП добыл следующие актуальные планы выполнения. CREATE PROCEDURE dbo.lion_UpdateTasksNewOrder( @Table TasksNewOrderTableType READONLY) WITH RECOMPILE AS BEGIN DECLARE @ErrorCode int SET @ErrorCode = -1 UPDATE TasksTable SET order_new = t.ORDER_NEW, __usn_field_order_new = t.USN_ORDER_NEW FROM dbo.lion_Tasks TasksTable INNER JOIN @Table t ON t.UUID_TASK = TasksTable.uid_obj IF( @@ERROR != 0 ) BEGIN SET @ErrorCode = -1 GOTO Cleanup END UPDATE TasksTableCP SET __usn_entity_cp = tcp.USN_ENTITY FROM dbo.lion_Tasks_Changes_Parts TasksTableCP INNER JOIN @Table tcp ON tcp.UUID_TASK = TasksTableCP.uid_task_cp AND tcp.UUID_USER = TasksTableCP.uid_user_cp IF( @@ERROR != 0 ) BEGIN SET @ErrorCode = -1 GOTO Cleanup END RETURN 0 Cleanup: RETURN @ErrorCode END GO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 09:35 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
Вот еще сюда закинул план: https://www.brentozar.com/pastetheplan/?id=HkkqKg6DX ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 09:45 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980Для данной ХП добыл следующие актуальные планы выполнения.Это опять оценочные планы, а не актуальные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 09:59 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
invm, запустил SQL Profiler. Создал трассировку. Запустил код в Visual Studio. Остановил трассировку. Сохранил в файле результаты. Как правильно сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 10:13 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980, Нужно добавить в трассу событие Showplan XML Statistics Profile ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 10:43 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980, Estimated -> Showplan XML Actual - > Showplan XML Statistics Profile ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 10:44 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980Temp-овая БД находится на SSD-диске. Может кто подскажет, куда копать для ускорения? Что-то должно помочь, надо тестить: 1. задействуйте минимальное логирование при записи с flag 610 и/или с хинтом TABLOCK 2. Замените конструкцию на похожую --Synchronize the target table with --refreshed data from source table MERGE Products AS TARGET USING UpdatedProducts AS SOURCE ON (TARGET.ProductID = SOURCE.ProductID) --When records are matched, update --the records if there is any change WHEN MATCHED AND TARGET.ProductName <> SOURCE.ProductName OR TARGET.Rate <> SOURCE.Rate THEN UPDATE SET TARGET.ProductName = SOURCE.ProductName, TARGET.Rate = SOURCE.Rate --When no records are matched, insert --the incoming records from source --table to target table WHEN NOT MATCHED BY TARGET THEN INSERT (ProductID, ProductName, Rate) VALUES (SOURCE.ProductID, SOURCE.ProductName, SOURCE.Rate) --When there is a row that exists in target table and --same record does not exist in source table --then delete this record from target table WHEN NOT MATCHED BY SOURCE THEN DELETE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 10:51 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980 вообще table variable то ещё зло, пробуйте прибить RECOMPILE, но всё же план Barclay, да именно merge и решает проблемы производительности, только в другу сторону ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 10:58 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
TaPaK, выставил эти две галки. Получил то что на прикрепленном скриншоте. Сюда план положил: https://www.brentozar.com/pastetheplan/?id=Bygm2bTDQ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 10:58 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980TaPaK, выставил эти две галки.Одна галка нужна - Showplan XML Statistics Profile А не Showplan Statistics Profile ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 11:02 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
invm, вот теперь только с этой галкой. Планы прикрепил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 11:11 |
|
||
|
Обновление нескольких полей у большого числа строк
|
|||
|---|---|---|---|
|
#18+
gepard1980, вот получил актуальные планы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 11:14 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39698257&tid=1689159]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
129ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
81ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 480ms |

| 0 / 0 |
