Промежуточные таблицы хранимых процедур SQL Server - PullRequest
1 голос
/ 10 мая 2011

В SQL Server 2005 у меня есть запрос, который включает в себя несколько соединений большого размера (каждая таблица имеет порядок от нескольких тысяч строк до нескольких миллионов строк, и в среднем таблицы, вероятно, эквивалентны 10-15 столбцы целых чисел и даты и времени.

Чтобы сделать запрос быстрее, я подумываю о том, чтобы разделить один большой запрос на хранимую процедуру, которая выполняет пару соединений, сохраняет результат, содержащий некоторую временную таблицу, а затем объединяет эту временную таблицу с другой временной таблицей, которая был также результатом нескольких соединений.

В настоящее время я использую табличные переменные для хранения промежуточных таблиц, и одна производительность заметно выше. Но в производстве tempdb, похоже, имеет узкое место IO.

Есть ли лучший способ подумать о решении такой проблемы? Я имею в виду, что использование табличных переменных здесь далеко от базы?

1 Ответ

0 голосов
/ 14 мая 2011

Табличные переменные могут занимать довольно много памяти в TempDB.

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

Если вы можете использовать стандартную таблицу или временную таблицу, к которой обращаются все этапы вашего сложного выполнения, вы можете решить проблему с памятью.

Думайте об этом как оместо для кеширования данных.Фактически, вы можете обновлять этот «кэш» каждый раз, когда запускается ваша основная хранимая процедура, просто убедитесь, что используются соответствующие транзакции и блокировки.

Представьте себе альтернативу - если вы используете огромную табличную переменную в хранимой процедуре, и хранимая процедура выполняется 10 или 20 раз одновременно ... эта табличная переменная больше не может существовать только в памяти.

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