Sql Server 2008 R2 - преобразованные вызовы расширенных процедур SSMA (процедуры IMPL), влияющие на производительность - PullRequest
0 голосов
/ 11 ноября 2010

Мы работаем над проектом миграции с Oracle на SQL Server 2008. Таким образом, у нас есть много функций пакета Oracle, которые раньше вызывали другие хранимые процедуры. Эти функции были преобразованы SSMA в процедуры IMPL, которые выполняются посредством расширенных процедур из функций. Мы преобразовали большинство таких функций в простой UDF, где это было возможно. Теперь мы сталкиваемся с особой проблемой производительности. Запросы, вызывающие такие функции с помощью вызовов процедур IMPL, выполняются дольше. Интересно то, что те же самые запросы выполнялись на старом сервере с Sql Server 2008 за 2 минуты. Теперь на новом сервере с SQL Server 2008 R2 это занимает очень много времени (около 25-30 минут).

Мы убедились, что индексы и статистика также актуальны. Мы также заметили, что вызовы IMPL проходят через базы данных master и sysdb и используют внутренние таблицы для хранения и передачи результата обратно из вызова процедуры IMPL в функцию. Их распределение пространства отличается от старого сервера. Но им не хватает места. Могут ли они быть причиной проблемы? Есть ли какие-либо рекомендации по распределению пространства баз данных master / sysdb?

Базы данных имеют размер около 300 ГБ, а база данных tempdb - около 50 ГБ.

Старый сервер

  • SQL Server 2008 / Windows
  • Xenon Quad Core x4 - 3 ГГц, 64 ГБ ОЗУ

Новый сервер

  • SQL Server 2008 R2 RTM
  • Opteron 6 ядер x6 - 2,2 ГГц, 64 ГБ ОЗУ

Пожалуйста, дайте мне знать, если потребуется дополнительная информация.

Спасибо

1 Ответ

0 голосов
/ 01 февраля 2011

Пользовательские функции в SQL Server - это не просто SP, которые могут возвращать значение (например, они не могут изменять таблицы базы данных). Функции Oracle могут делать в основном то же, что и процедуры. Поэтому многие функции Oracle преобразуются в хранимую процедуру func_name $ IMPL + некоторую функцию-обертку (насколько я помню, она вызывает соответствующую процедуру $ IMPL через специфический для SSMA расширенный SP). В тех случаях, когда это возможно, SSMA будет стараться избегать непосредственного вызова функций (вместо этого генерируя вызов для соответствующего ... $ IMPL SP), но некоторые случаи не рассматриваются. Эти более сложные случаи приведут к прямому вызову сгенерированной функции-оболочки. Я полагаю, что они действительно довольно медленные :( Просто SSMA не нашел автоматического преобразования в вашем случае ... Поэтому вы должны попытаться изменить сгенерированный код SQL Server для непосредственного использования хранимых процедур func_name $ IMPL (просто используя обычные EXEC и не вызывая функции-обертки столько, сколько вы можете, пока производительность вас не устраивает).

...