Я пытаюсь создать хранимую процедуру, которая извлекает информацию из нескольких таблиц в моих базах данных. Я часто использую переменную таблицу для хранения данных, поскольку мне приходится возвращать их в результирующем наборе, а также повторно использовать в последующих запросах вместо того, чтобы требовать таблицу несколько раз.
Это хороший и распространенный способ сделать это?
Так что у меня начались проблемы с производительностью при тестировании хранимой процедуры. Кстати, есть ли эффективный способ проверки без необходимости каждый раз менять параметр? Если я не изменю значения параметров, выполнение запроса займет всего несколько миллисекунд, и я предполагаю, что он использует какой-то кэш.
Итак, у меня начались проблемы с производительностью, когда накануне все работало хорошо, поэтому я заново обработал свои запросы, посмотрев, что все индексы используются правильно и т. Д. Затем я попытался переключить таблицу переменных для временной таблицы только для целей тестирования иbingo 2 или 3 следующих теста прошли как чудо, а затем снова начали появляться проблемы с производительностью. Поэтому я немного не понимаю, что здесь происходит и почему это происходит.
Я запускаю свои тесты на производственной базе данных, поскольку она ничего не обновляет и не вставляет. Есть фрагмент кода, чтобы дать вам представление о моем тестовом примере
--Stuff going on to get values in a temps table for the next query
DECLARE @ApplicationIDs TABLE(ID INT)
-- This table have over 110 000 000 rows and this query use one of its indexes. The query insert between 1 and 10-20k rows
INSERT INTO @ApplicationIDs(ID)
SELECT ApplicationID
FROM Schema.Application
WHERE Columna = value
AND Columnb = value
AND Columnc = value
-- I request the table again but joined with other tables to have my final resultset no performance issues here. ApplicationID is the clustered primary key
SELECT Columns
FROM Schema.Application
INNER JOIN SomeTable ON Columna = Columnb
WHERE ApplicationID IN (SELECT ID FROM @ApplicationIDs)
--There is where it starts happening this table has around 200 000 000 rows and about 50 columns and yes the applicationid column is indexed (nonclustered). I use this index that way in few other context and it work well just not this one
SELECT Columns
FROM Schema.SubApplication
WHERE ApplicationID IN (SELECT ID FROM @ApplicationIDs)
Сервер находится на виртуальной машине с 64 ГБ оперативной памяти, а для SQL выделено 56 ГБ.
Дайте мне знатьесли вам нужна дополнительная информация.