Производительность процедуры SQLstored с нехваткой памяти, выделенной серверу - PullRequest
0 голосов
/ 27 января 2020

Обнаружена проблема с несколькими различными базами данных (размеры 500 МБ, 10 ГБ, 27 ГБ).

У нас есть хранимая процедура, которая выполняет некоторую подготовку данных, выполняет 110 операторов, таких как:

https://www.brentozar.com/pastetheplan/?id=HyDZIv2WU

Выражения в принципе одинаковы, изменяются только таблицы и имеют 1 - 3 столбца идентификаторов, все части PK. Простые таблицы назначений.

Object1 - временная таблица, ie.

create table Object1 (Coulmn1 int primary key(Column1))

Object2,3 и 4 идентичны по структуре, ie.

create table Object2 (Column2 smallint, Column1 int, primary key (Column2, Column1)) on PartitionSchema1(Column2)

Когда я вызываю процедуру на база данных любого размера (сервер sql перезапущен для очистки памяти) с оперативной памятью 2 ГБ, назначенной серверу SQL, выполнение занимает 16-22 секунды. Общий объем данных ~ 6-7 МБ. (Большая часть данных в любом упоминании базы данных находится в таблицах, которые НЕ затрагиваются процедурой.

С 4 ГБ памяти процедура занимает ~ 2 секунды

Когда я вызываю каждое утверждение самостоятельно из PowerShell в al oop, для 2 ГБ это занимает около 5 секунд, для 4 ГБ памяти около 4 секунд (то есть выполнение каждого оператора быстрее при малой памяти, немного медленнее при старшей памяти)

если я удаляю объединение всех и одна половина оператора, выполнение даже на 2 ГБ занимает ~ 1 секунду в любой части union all.

Если я разделю оператор union all на две вставки, он работает лучше, чем union, но все еще занимает около 5 секунд на выполнение процедуры.

ПРИМЕЧАНИЕ. Object4 содержит 0 строк.

Кто-нибудь сталкивался с подобной проблемой? Ищете какие-либо материалы для чтения по этой проблеме.

РЕДАКТИРОВАТЬ: Интересный вывод из sp_whoisactive enter image description here

...