2015-10-21 3 views
0

Задача повышения производительности назначается мне на работе. У нас работает SQL Server 2012. БД имеет множество таблиц с миллионами строк, и для просмотра результатов отчет занимает более 30 минут.В чем преимущества «Declare @TableName» над «Create Table TableName»?

Запуск сохраненного Proc с включением плана выполнения показал, что около 98% потребляется во время «Объявить таблицу @T» и вставлять и выбирать из него. После нескольких часов испытаний и ошибок я изменил эту часть на «Создать таблицу T» и сбросил созданную таблицу в конце Proc.

Результат - очаровательный. Теперь для получения данных требуется менее 10 минут. Любой может объяснить мне причины, почему это происходит?

Я не знаю, нужно ли мне продолжать этот метод или есть что-то еще, о чем я должен заботиться.

ответ

1

Проценты - это просто оценки, которые основаны на оценках подсчета строк - и это может быть вашей проблемой. Переменные таблицы не имеют статистики, поэтому в большинстве случаев SQL Server оценивает, что в таблице 1 строка.

Если вы используете эти переменные таблицы в соединениях или что-то в этом роде, план запроса может быть очень плохим из-за неправильной оценки количества строк.

Если нет смысла использовать переменные таблицы, сначала попробуйте использовать обычную температуру. таблицы (#tableName). Если у вас много строк в этих таблицах, создание индекса (es) тоже может быть хорошей идеей.

Сравнивая план запроса, оценки количества строк и статистики вывода io должны дать вам общее представление о том, в чем разница между исполнениями. Не доверяйте таким процентам, это может быть совершенно неверно, но статистике io можно доверять (если вы не используете там также многофакторные UDF)