Найвищі рівні плану стосуються видалення рядків із базової таблиці (кластерного індексу) та підтримання чотирьох некластеризованих індексів. Два з цих індексів підтримуються строково за рядком, при цьому обробляються кластерні видалення індексу. Це "+2 некластеризовані індекси", виділені зеленим кольором внизу.
Для інших двох некластеризованих індексів оптимізатор вирішив, що найкраще зберегти ключі цих індексів до робочого столу tempdb (Eager Spool), а потім відтворити котушку двічі, сортуючи за індексними клавішами для просування послідовного шаблону доступу.
Заключна послідовність операцій стосується збереження первинних та вторинних xml
індексів, які не були включені у ваш сценарій DDL:
З цим робити не багато. Некластеризовані індекси та xml
індекси повинні зберігатися синхронізованими з даними в базовій таблиці. Витрати на підтримку таких індексів є частиною компромісу, який ви здійснюєте, створюючи додаткові індекси на таблиці.
Однак, xml
індекси особливо проблемні. Оптимізатору дуже важко точно оцінити, скільки рядків буде кваліфіковано в цій ситуації. Насправді це дико завищує xml
показник, в результаті чого для цього запиту надається майже 12 ГБ пам'яті (хоча під час виконання використовується лише 28 МБ):
Ви можете розглянути можливість видалення в менших партіях, сподіваючись зменшити вплив надмірного надання пам'яті.
Ви також можете перевірити виконання плану без використання сортування OPTION (QUERYTRACEON 8795)
. Це прапор без документації, тому слід спробувати його лише на розробці або тест-системі, ніколи у виробництві. Якщо отриманий план набагато швидше, ви можете захопити XML плану та використовувати його для створення посібника по плану для виробничого запиту.