ситуации, требующие временных таблиц в хранимых процедурах - PullRequest
1 голос
/ 11 июля 2011

Кто-нибудь может объяснить ситуации, в которых нам нужно использовать временные таблицы в хранимых процедурах?

1 Ответ

1 голос
/ 11 июля 2011

Есть много случаев, когда сложное объединение может действительно сбить с толку оптимизатор и заставить его делать очень дорогие вещи.Иногда самый простой способ охладить оптимизатор - разбить сложный запрос на более мелкие части.Вы найдете много дезинформации об использовании переменной @table вместо таблицы #temp, потому что переменные @table всегда живут в памяти - это миф и не верьте этому.

Вы можетеЭто также полезно, если у вас есть запрос на выброс, который действительно выиграл бы от другого индекса, который отсутствует в базовой таблице, и вам не разрешено (или это может быть вредно) добавить этот индекс в базовую таблицу (это может бытьнапример, альтернативный кластерный индекс).Чтобы обойти это, можно поместить данные в таблицу #temp (это может быть ограниченное подмножество базовой таблицы, действуя как отфильтрованный индекс), создать альтернативный индекс в таблице #temp и запустить соединениепротив таблицы #temp.Это особенно актуально, если данные, отфильтрованные в таблицу #temp, будут использоваться несколько раз.

Бывают также случаи, когда вам необходимо выполнить много обновлений для некоторых данных, но вы не хотите обновлятьбазовая таблица несколько раз.У вас может быть несколько вещей, которые вам нужно сделать с множеством других данных, которые нельзя сделать одним запросом.Может быть более эффективно поместить затронутые данные в таблицу #temp, выполнить серию вычислений / модификаций, а затем обновить ее до базовой таблицы один раз, а не n раз.Если вы используете транзакцию с базовыми таблицами, вы можете заблокировать их от своих пользователей на длительный период времени.

Другой пример - если вы используете связанные серверы, и соединение между серверами оказывается оченьдорого.Вместо этого вы можете сначала поместить удаленные данные в локальную таблицу #temp, создать для нее индексы локально и выполнить запрос локально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...