Вам необходимо проанализировать возвращенный набор данных, чтобы определить, что является логическим (значимым) первичным ключом для возвращаемого набора результатов. В общем случае это будет намного быстрее, чем полная процедура, потому что сервер не создает набор результатов из данных во всех столбцах каждой строки каждой таблицы, он просто считает строки ... В общем, это может даже не произойти. для этого нужно прочитать фактические строки таблицы с диска, может потребоваться просто подсчитать индексные узлы ...
Затем напишите другой оператор SQL, который включает в себя только таблицы, необходимые для генерации этих ключевых столбцов (надеюсь, это подмножество таблиц в основном SQL-запросе), и тот же оператор where с теми же значениями предикатов фильтрации ...
Затем добавьте еще один необязательный параметр в Stored Proc, называемый, скажем, @CountsOnly, со значением по умолчанию false (0), так что ...
Alter Procedure <storedProcName>
@param1 Type,
-- Other current params
@CountsOnly TinyInt = 0
As
Set NoCount On
If @CountsOnly = 1
Select Count(*)
From TableA A
Join TableB B On etc. etc...
Where < here put all Filtering predicates >
Else
<Here put old SQL That returns complete resultset with all data>
Return 0
Затем вы можете просто вызвать тот же хранимый процесс с @CountsOnly, установленным равным 1, чтобы просто получить количество записей. Старый код, который вызывает proc, будет по-прежнему функционировать так, как раньше, так как значение параметра по умолчанию установлено в false (0), если оно не включено