В SQL Server 2008R2 sproc у меня есть следующий код для вычисления общего количества записей, возвращаемых динамическим запросом:
-- count the actual number of results
DECLARE @rowcount TABLE (Value int);
INSERT INTO @rowcount
EXEC('SELECT COUNT(*) ' + @sqlBody);
SELECT @varcharActualNumResults = VALUE FROM @rowcount;
Динамический запрос разбит на три части: @sqlTop,@sqlBody и @ sqlBottom.
Я хочу знать, сколько записей на самом деле возвращается @sqlBody, но фактическим выполнением является сцепленный @sqlTop + @sqlBody + @ sqlBottom.
Проблема в том, что приведенный выше запрос занимает 24136 мс (примерно 24 секунды), где фактическое количество записей составляет около 18 000.
Другая проблема возникает, когда я хочу получить количество строк для всего запроса:
EXEC (@sqlTop + @sqlBody + @sqlBottom)
SET @NumberOfResultsReturned = @@ROWCOUNT;
Это выполнение занимает примерно две секунды.
Вот пример запроса:
SELECT TOP(10) Title
FROM ItemData
WHERE (
FREETEXT(Title, '"windshield"')
OR
( [Title] LIKE '%mazda 6%' )
)
AND ( WebsiteID=1 )
ORDER BY DateAdded DESC
@ sqlBody содержит все, что находится между FROM и ORDER BY.
Как это можно оптимизировать?
ОБНОВЛЕНИЕ
В моем sproc я определил свою временную таблицу, а затем попытался заполнить ее с помощью команды EXEC.Однако в командной строке EXEC я получаю сообщение об ошибке, указывающее, что временная таблица должна быть определена:
DECLARE @Temp_Results TABLE (ItemListID BIGINT, Title VARCHAR(255) )
EXEC ('INSERT INTO @Temp_Results (ItemListID, Title) (' + @sqlTop + @sqlBody + ')')
Если я возьму команду exec и выполню SQL, она будет работать нормально.Как я могу обойти это?