Вот что я нашел. У меня ОЧЕНЬ сложный хранимый процесс, который всегда подсчитывает информацию и помещает данные в матрицу из 17 строк, состоящую из 8 столбцов, так как она вызывается / запускается Crystal Reports каждый месяц. База данных prod была на сумасшедшем быстром сервере 96 ГБ! Недавно он был уменьшен до 32 ГБ виртуальной машины. Несмотря на то, что оно было уменьшено - оно во многих отношениях замедляло работу приложения, пока не было добавлено несколько индексов.
Затем пришло время месяца для запуска этого ежемесячного отчета с 17 строками матрицы ... и, как вы можете себе представить, оно истекло!
Вызов proc был довольно прост - 3 параметра. Дата начала, дата окончания и район, по которому необходимо выполнить фильтрацию, - равны нулю ВСЕ. Две даты были переданы из Crystal Reports как символ, и эти сохраненные параметры PROC затем использовались повсюду в этом сумасшедшем сохраненном процессе.
Каждая из 17 строк - в основном использует операторы WITH и сумасшедшие объединения для поиска строк данных перед подсчетом / поворотом результатов ... что НЕ важно в этой статье.
Так что здесь это упрощено ....
CREATE PROCEDURE [dbo].[prcMonthlyStats]
@bDate datetime
,@eDate datetime
,@districtStr varchar(120)
AS
BEGIN
SET NOCOUNT ON;
...
--the @bDate and @eDate params were DIRECTLY used throughout the 2000 lines of SQL,
--to filter data inside and out of WITH statements and various other selects!
--
--TIMES OUT!
...
CREATE PROCEDURE [dbo].[prcMonthlyStats]
@bDateStr datetime
,@eDateStr datetime
,@districtStr varchar(120)
AS
BEGIN
SET NOCOUNT ON;
--FIX! Declare 2 date time variables and simply assign the 2 date time parameters to them.
DECLARE @bDate datetime
DECLARE @eDate datetime
DECLARE @district varchar(120)
--SET THE VARIABLES FROM THE PARAMETERS PASSED IN!
SET @bDate = @bDateStr
SET @eDate = @eDateStr
SET @district = @districtStr
.....
--PRESTO! The optimizer could once again use indexes as it should.
Итак, мораль этой истории в том, что оптимизатор смог выполнить свою задачу, используя объявленные даты и время.