Если единственное различие между двумя планами запросов - это параллелизм, попробуйте поставить OPTION (MAXDOP 1)
в конце запроса, чтобы ограничить его последовательным планом.
Относительно того, почему они различаются, я не уверен, но я помню, что оптимизатор SQL Server 2000 был слишком привередлив. Как и в вашем случае, мы обычно видели, что пакеты специальных запросов будут быстрыми, а тот же запрос через sp_executesql
будет медленным. Никогда полностью не выяснил, что происходит.
Последовательность v и параллель определенно могут объяснить разницу в скоростях. В SQL Server 2000 для параллельных планов используются все процессоров на компьютере , а не только те, которые ему необходимы:
Если SQL Server решает использовать параллелизм, он должен использовать все настроенные процессоры (как определено конфигурацией подсказки запроса MAXDOP) для выполнения параллельного плана. Например, если вы используете MAXDOP = 0 на 32-стороннем сервере, SQL Server пытается использовать все 32 процессора, даже если семь процессоров могут выполнять работу более эффективно по сравнению с последовательным планом, в котором используется только один процессор. Из-за этого поведения «все или ничего», если SQL Server выбирает параллельный план и вы не ограничиваете подсказку запроса MAXDOP [...], время, которое требуется SQL Server для координации всех процессоров на высокопроизводительном сервере перевешивает преимущества использования параллельного плана.
По умолчанию, я считаю, что для всего сервера значение MAXDOP
равно 0, что означает использование максимально возможного количества. Если вы недавно обновили свой сервер базы данных, добавив больше процессоров для повышения производительности, это может иронично объяснить, почему ваша производительность страдает. Если это так, вы можете попытаться установить подсказку MAXDOP
для числа процессоров, которые у вас были раньше, и посмотреть, поможет ли это.