Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SET ANSI_WARNINGS ON/OFF и план выполнения  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1050
Доброго времени суток.

Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

Занимаюсь отладкой хранимой процедуры, осуществляющей select .
Заметил, что одна только строка SET ANSI_WARNINGS OFF в начале процедуры существенно меняет план выполнения в худшую сторону (SCAN вместо SEEK в одном из подзапросов).
В документации по этому поводу ничего не нашел.

Планы: вариант с SET ANSI_WARNINGS OFF:
(см scan в 5-й строке снизу)

select    Z.ИДКолеса,    Z.ИДОткуда,    S.ИДТипыКолес,    Z.Дата as ДатаУстановки,    G.РегистрационныйЗнак,    W.ФИО,    V.Наименование as ВидНаименование,    R.Наименование,    S.ЗаводскойНомер,    Z.Причина,    Z.Примечание,    case when Z.Позиция>0      then      convert(varchar,Z.Позиция)     else      'ЗП'+convert(varchar,-Z.Позиция+1)    end as ПозицияТекст,    cast(IsNull(F.Пробег,0)+S.Пробег as numeric(18,2)) as Пробег,    R.ПробегДоИзноса,    cast(case when R.ПробегДоИзноса<>0 then(IsNull(F.Пробег,0)+0.0000+S.Пробег)/(R.ПробегДоИзноса+0.0000) else Null end as numeric(18,4)) as Износ,    cast(    case when R.ПробегДоИзноса<>0      then       case when IsNull(F.Пробег,0)+S.Пробег>R.ПробегДоИзноса       then 0       else (1-(IsNull(F.Пробег,0)+0.0000+S.Пробег)/(R.ПробегДоИзноса+0.0000))*S.Стоимость      end     else      S.Стоимость    end as numeric(18,2)) as ОстаточнаяСтоимость,    S.Стоимость,    cast(S.Стоимость-    case when R.ПробегДоИзноса<>0      then       case when IsNull(F.Пробег,0)+S.Пробег>R.ПробегДоИзноса       then 0       else (1-(IsNull(F.Пробег,0)+0.0000+S.Пробег)/(R.ПробегДоИзноса+0.0000))*S.Стоимость      end     else      S.Стоимость    end as numeric(18,2)) as Амортизация           from dbo.vПеремещениеКолесОткуда Z    outer apply (    select     F.Пробег    from dbo.fnПробегКолесКДате(Z.Дата) F where F.ИДКолеса=Z.ИДКолеса) F   inner join dbo.Колеса S on S.ИД=Z.ИДКолеса   inner join dbo.ТипыКолес R on S.ИДТипыКолес=R.ИД    inner join dbo.ВидыКолес V on R.ИДВид=V.ИД    left join dbo.Автомобили G on Z.ИДОткуда=G.ИД    left join dbo.Водители W on W.ИД=Z.ИДВодители   where Z.Дата>=@D1 and Z.Дата< @D2+1 and Z.ИДАвтомобили=-1    Order by Z.Дата,G.РегистрационныйЗнак
|--Compute Scalar(DEFINE:([Expr1044]=CASE WHEN [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0) THEN CONVERT(varchar(30),[AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция],0) ELSE 'ЗП'+CONVERT(varchar(30), -[AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]+(1),0) END, [Expr1045]=CONVERT(numeric(18,2),isnull([Expr1033],(0.00))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег],0), [Expr1046]=CONVERT(numeric(18,4),CASE WHEN [AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]<>(0.) THEN ((isnull([Expr1033],(0.00))+(0.0000))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег])/([AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]+(0.0000)) ELSE NULL END,0), [Expr1047]=CONVERT(numeric(18,2),CASE WHEN [AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]<>(0.) THEN CASE WHEN (isnull([Expr1033],(0.00))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег])>[AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса] THEN (0.000000) ELSE ((1.)-((isnull([Expr1033],(0.00))+(0.0000))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег])/([AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]+(0.0000)))*[AutoBase].[dbo].[Колеса].[Стоимость] as [S].[Стоимость] END ELSE CONVERT_IMPLICIT(numeric(38,6),[AutoBase].[dbo].[Колеса].[Стоимость] as [S].[Стоимость],0) END,0), [Expr1048]=CONVERT(numeric(18,2),[AutoBase].[dbo].[Колеса].[Стоимость] as [S].[Стоимость]-CASE WHEN [AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]<>(0.) THEN CASE WHEN (isnull([Expr1033],(0.00))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег])>[AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса] THEN (0.000000) ELSE ((1.)-((isnull([Expr1033],(0.00))+(0.0000))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег])/([AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]+(0.0000)))*[AutoBase].[dbo].[Колеса].[Стоимость] as [S].[Стоимость] END ELSE CONVERT_IMPLICIT(numeric(38,6),[AutoBase].[dbo].[Колеса].[Стоимость] as [S].[Стоимость],0) END,0)))
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([S].[ИДВодители]))
|--Sort(ORDER BY:([S].[Дата] ASC, [G].[РегистрационныйЗнак] ASC))
| |--Nested Loops(Left Outer Join, OUTER REFERENCES:([F].[ИДАвтомобили]))
| |--Nested Loops(Left Outer Join, OUTER REFERENCES:([S].[ИДКолеса], [S].[Дата]))
| | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([S].[ИДКолеса], [S].[Дата]))
| | | |--Nested Loops(Inner Join, OUTER REFERENCES:([R].[ИДВид]))
| | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([S].[ИДТипыКолес]))
| | | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([S].[ИДКолеса]))
| | | | | | |--Clustered Index Scan(OBJECT:([AutoBase].[dbo].[ПеремещениеКолес].[PK_ПеремещениеКолес] AS [S]), WHERE:([AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата]>=[@D1] AND [AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата]<[@d2]+'1900-01-02 00:00:00.000' AND [AutoBase].[dbo].[ПеремещениеКолес].[ИДАвтомобили] as [S].[ИДАвтомобили]=(-1)))
| | | | | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[Колеса].[PK_Колеса] AS [S]), SEEK:([S].[ИД]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДКолеса] as [S].[ИДКолеса]) ORDERED FORWARD)
| | | | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[ТипыКолес].[PK_ТипыКолес] AS [R]), SEEK:([R].[ИД]=[AutoBase].[dbo].[Колеса].[ИДТипыКолес] as [S].[ИДТипыКолес]) ORDERED FORWARD)
| | | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[ВидыКолес].[PK_ВидыКолес] AS [V]), SEEK:([V].[ИД]=[AutoBase].[dbo].[ТипыКолес].[ИДВид] as [R].[ИДВид]) ORDERED FORWARD)
| | | |--Top(TOP EXPRESSION:((1)))
| | | |--Compute Scalar(DEFINE:([F].[ИДАвтомобили]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДАвтомобили] as [F].[ИДАвтомобили], [F].[Позиция]=[AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]))
| | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[ПеремещениеКолес].[PK_ПеремещениеКолес] AS [F]), SEEK:([F].[ИДКолеса]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДКолеса] as [S].[ИДКолеса] AND [F].[Дата] < [AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата]) ORDERED BACKWARD)
| | |--Compute Scalar(DEFINE:([Expr1033]=CONVERT(numeric(18,2),isnull([Expr1030],(0.00))+isnull([Expr1031],(0.00)),0)))
| | |--Compute Scalar(DEFINE:([Expr1030]=CASE WHEN [Expr1074]=(0) THEN NULL ELSE [Expr1075] END, [Expr1031]=CASE WHEN [Expr1076]=(0) THEN NULL ELSE [Expr1077] END))
| | |--Stream Aggregate(DEFINE:([Expr1074]=COUNT_BIG(CASE WHEN [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0) THEN CONVERT(numeric(18,2),[Expr1020],0) ELSE (0.00) END), [Expr1075]=SUM(CASE WHEN [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0) THEN CONVERT(numeric(18,2),[Expr1020],0) ELSE (0.00) END), [Expr1076]=COUNT_BIG(CASE WHEN [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0) THEN CONVERT(numeric(18,2),[Expr1026],0) ELSE (0.00) END), [Expr1077]=SUM(CASE WHEN [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0) THEN CONVERT(numeric(18,2),[Expr1026],0) ELSE (0.00) END)))
| | |--Nested Loops(Inner Join, PASSTHRU:(IsFalseOrNull [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0)), OUTER REFERENCES:([F].[Дата], [F].[ИДАвтомобили], [Expr1014]))
| | |--Nested Loops(Inner Join, PASSTHRU:(IsFalseOrNull [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0)), OUTER REFERENCES:([F].[Дата], [F].[ИДАвтомобили], [Expr1014]))
| | | |--Compute Scalar(DEFINE:([Expr1014]=[Expr1014]))
| | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([F].[ИДКолеса], [F].[Дата]))
| | | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[ПеремещениеКолес].[PK_ПеремещениеКолес] AS [F]), SEEK:([F].[ИДКолеса]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДКолеса] as [S].[ИДКолеса] AND [F].[Дата] < [AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата]) ORDERED FORWARD)
| | | | |--Stream Aggregate(DEFINE:([Expr1014]=MIN([AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата])))
| | | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[ПеремещениеКолес].[PK_ПеремещениеКолес] AS [S]), SEEK:([S].[ИДКолеса]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДКолеса] as [F].[ИДКолеса] AND [S].[Дата] > [AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [F].[Дата]) ORDERED FORWARD)
| | | |--Compute Scalar(DEFINE:([Expr1020]=CASE WHEN [Expr1070]=(0) THEN NULL ELSE [Expr1071] END))
| | | |--Stream Aggregate(DEFINE:([Expr1070]=COUNT_BIG([AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег]), [Expr1071]=SUM([AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег])))
| | | |--Compute Scalar(DEFINE:([S].[Пробег]=[AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег]))
| | | |--Compute Scalar(DEFINE:([S].[Пробег]=[AutoBase].[dbo].[ПутевыеЛисты].[ОдометрВъезд] as [S].[ОдометрВъезд]-[AutoBase].[dbo].[ПутевыеЛисты].[ОдометрВыезд] as [S].[ОдометрВыезд]))
| | | |--Index Seek(OBJECT:([AutoBase].[dbo].[ПутевыеЛисты].[IX_ПутевыеЛисты_Автомобиль] AS [S]), SEEK:([S].[ИДАвтомобили]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДАвтомобили] as [F].[ИДАвтомобили] AND [S].[ДатаОкончания] <= isnull([Expr1014],[AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата])), WHERE:([AutoBase].[dbo].[ПутевыеЛисты].[ДатаНачала] as [S].[ДатаНачала]>=[AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [F].[Дата]) ORDERED FORWARD)
| | |--Compute Scalar(DEFINE:([Expr1026]=CASE WHEN [Expr1072]=(0) THEN NULL ELSE [Expr1073] END))
| | |--Stream Aggregate(DEFINE:([Expr1072]=COUNT_BIG([AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег]), [Expr1073]=SUM([AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег])))
| | |--Filter(WHERE:([AutoBase].[dbo].[ПутевыеЛисты].[ДатаНачала] as [S].[ДатаНачала]>=[AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [F].[Дата] AND [AutoBase].[dbo].[ПутевыеЛисты].[ДатаОкончания] as [S].[ДатаОкончания]<=isnull([Expr1014],[AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата]) AND [AutoBase].[dbo].[ПутевыеЛисты].[ИДПрицеп] as [S].[ИДПрицеп]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДАвтомобили] as [F].[ИДАвтомобили]))
| | |--Compute Scalar(DEFINE:([S].[Пробег]=[AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег]))
| | |--Compute Scalar(DEFINE:([S].[Пробег]=[AutoBase].[dbo].[ПутевыеЛисты].[ОдометрВъезд] as [S].[ОдометрВъезд]-[AutoBase].[dbo].[ПутевыеЛисты].[ОдометрВыезд] as [S].[ОдометрВыезд]))
| | |--Clustered Index Scan(OBJECT:([AutoBase].[dbo].[ПутевыеЛисты].[PK_ПутевыеЛисты] AS [S]))
| |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[Автомобили].[PK_Автомобили] AS [G]), SEEK:([G].[ИД]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДАвтомобили] as [F].[ИДАвтомобили]) ORDERED FORWARD)
|--Compute Scalar(DEFINE:([W].[ФИО]=[AutoBase].[dbo].[Водители].[ФИО] as [W].[ФИО]))
|--Compute Scalar(DEFINE:([W].[ФИО]=([AutoBase].[dbo].[Водители].[Фамилия] as [W].[Фамилия]+isnull(substring(' '+[AutoBase].[dbo].[Водители].[Имя] as [W].[Имя],(1),(2))+'.',''))+isnull(substring([AutoBase].[dbo].[Водители].[Отчество] as [W].[Отчество],(1),(1))+'.','')))
|--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[Водители].[PK_Водители] AS [W]), SEEK:([W].[ИД]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДВодители] as [S].[ИДВодители]) ORDERED FORWARD)

вариант без SET ANSI_WARNINGS OFF:
(см seek в 5-й строке снизу)

select    Z.ИДКолеса,    Z.ИДОткуда,    S.ИДТипыКолес,    Z.Дата as ДатаУстановки,    G.РегистрационныйЗнак,    W.ФИО,    V.Наименование as ВидНаименование,    R.Наименование,    S.ЗаводскойНомер,    Z.Причина,    Z.Примечание,    case when Z.Позиция>0      then      convert(varchar,Z.Позиция)     else      'ЗП'+convert(varchar,-Z.Позиция+1)    end as ПозицияТекст,    cast(IsNull(F.Пробег,0)+S.Пробег as numeric(18,2)) as Пробег,    R.ПробегДоИзноса,    cast(case when R.ПробегДоИзноса<>0 then(IsNull(F.Пробег,0)+0.0000+S.Пробег)/(R.ПробегДоИзноса+0.0000) else Null end as numeric(18,4)) as Износ,    cast(    case when R.ПробегДоИзноса<>0      then       case when IsNull(F.Пробег,0)+S.Пробег>R.ПробегДоИзноса       then 0       else (1-(IsNull(F.Пробег,0)+0.0000+S.Пробег)/(R.ПробегДоИзноса+0.0000))*S.Стоимость      end     else      S.Стоимость    end as numeric(18,2)) as ОстаточнаяСтоимость,    S.Стоимость,    cast(S.Стоимость-    case when R.ПробегДоИзноса<>0      then       case when IsNull(F.Пробег,0)+S.Пробег>R.ПробегДоИзноса       then 0       else (1-(IsNull(F.Пробег,0)+0.0000+S.Пробег)/(R.ПробегДоИзноса+0.0000))*S.Стоимость      end     else      S.Стоимость    end as numeric(18,2)) as Амортизация           from dbo.vПеремещениеКолесОткуда Z    outer apply (    select     F.Пробег    from dbo.fnПробегКолесКДате(Z.Дата) F where F.ИДКолеса=Z.ИДКолеса) F   inner join dbo.Колеса S on S.ИД=Z.ИДКолеса   inner join dbo.ТипыКолес R on S.ИДТипыКолес=R.ИД    inner join dbo.ВидыКолес V on R.ИДВид=V.ИД    left join dbo.Автомобили G on Z.ИДОткуда=G.ИД    left join dbo.Водители W on W.ИД=Z.ИДВодители   where Z.Дата>=@D1 and Z.Дата< @D2+1 and Z.ИДАвтомобили=-1    Order by Z.Дата,G.РегистрационныйЗнак
|--Compute Scalar(DEFINE:([Expr1044]=CASE WHEN [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0) THEN CONVERT(varchar(30),[AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция],0) ELSE 'ЗП'+CONVERT(varchar(30), -[AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]+(1),0) END, [Expr1045]=CONVERT(numeric(18,2),isnull([Expr1033],(0.00))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег],0), [Expr1046]=CONVERT(numeric(18,4),CASE WHEN [AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]<>(0.) THEN ((isnull([Expr1033],(0.00))+(0.0000))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег])/([AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]+(0.0000)) ELSE NULL END,0), [Expr1047]=CONVERT(numeric(18,2),CASE WHEN [AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]<>(0.) THEN CASE WHEN (isnull([Expr1033],(0.00))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег])>[AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса] THEN (0.000000) ELSE ((1.)-((isnull([Expr1033],(0.00))+(0.0000))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег])/([AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]+(0.0000)))*[AutoBase].[dbo].[Колеса].[Стоимость] as [S].[Стоимость] END ELSE CONVERT_IMPLICIT(numeric(38,6),[AutoBase].[dbo].[Колеса].[Стоимость] as [S].[Стоимость],0) END,0), [Expr1048]=CONVERT(numeric(18,2),[AutoBase].[dbo].[Колеса].[Стоимость] as [S].[Стоимость]-CASE WHEN [AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]<>(0.) THEN CASE WHEN (isnull([Expr1033],(0.00))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег])>[AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса] THEN (0.000000) ELSE ((1.)-((isnull([Expr1033],(0.00))+(0.0000))+[AutoBase].[dbo].[Колеса].[Пробег] as [S].[Пробег])/([AutoBase].[dbo].[ТипыКолес].[ПробегДоИзноса] as [R].[ПробегДоИзноса]+(0.0000)))*[AutoBase].[dbo].[Колеса].[Стоимость] as [S].[Стоимость] END ELSE CONVERT_IMPLICIT(numeric(38,6),[AutoBase].[dbo].[Колеса].[Стоимость] as [S].[Стоимость],0) END,0)))
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([S].[ИДВодители]))
|--Sort(ORDER BY:([S].[Дата] ASC, [G].[РегистрационныйЗнак] ASC))
| |--Nested Loops(Left Outer Join, OUTER REFERENCES:([F].[ИДАвтомобили]))
| |--Nested Loops(Left Outer Join, OUTER REFERENCES:([S].[ИДКолеса], [S].[Дата]))
| | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([S].[ИДКолеса], [S].[Дата]))
| | | |--Nested Loops(Inner Join, OUTER REFERENCES:([R].[ИДВид]))
| | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([S].[ИДТипыКолес]))
| | | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([S].[ИДКолеса]))
| | | | | | |--Clustered Index Scan(OBJECT:([AutoBase].[dbo].[ПеремещениеКолес].[PK_ПеремещениеКолес] AS [S]), WHERE:([AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата]>=[@D1] AND [AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата]<[@d2]+'1900-01-02 00:00:00.000' AND [AutoBase].[dbo].[ПеремещениеКолес].[ИДАвтомобили] as [S].[ИДАвтомобили]=(-1)))
| | | | | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[Колеса].[PK_Колеса] AS [S]), SEEK:([S].[ИД]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДКолеса] as [S].[ИДКолеса]) ORDERED FORWARD)
| | | | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[ТипыКолес].[PK_ТипыКолес] AS [R]), SEEK:([R].[ИД]=[AutoBase].[dbo].[Колеса].[ИДТипыКолес] as [S].[ИДТипыКолес]) ORDERED FORWARD)
| | | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[ВидыКолес].[PK_ВидыКолес] AS [V]), SEEK:([V].[ИД]=[AutoBase].[dbo].[ТипыКолес].[ИДВид] as [R].[ИДВид]) ORDERED FORWARD)
| | | |--Top(TOP EXPRESSION:((1)))
| | | |--Compute Scalar(DEFINE:([F].[ИДАвтомобили]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДАвтомобили] as [F].[ИДАвтомобили], [F].[Позиция]=[AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]))
| | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[ПеремещениеКолес].[PK_ПеремещениеКолес] AS [F]), SEEK:([F].[ИДКолеса]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДКолеса] as [S].[ИДКолеса] AND [F].[Дата] < [AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата]) ORDERED BACKWARD)
| | |--Compute Scalar(DEFINE:([Expr1033]=CONVERT(numeric(18,2),isnull([Expr1030],(0.00))+isnull([Expr1031],(0.00)),0)))
| | |--Compute Scalar(DEFINE:([Expr1030]=CASE WHEN [Expr1074]=(0) THEN NULL ELSE [Expr1075] END, [Expr1031]=CASE WHEN [Expr1076]=(0) THEN NULL ELSE [Expr1077] END))
| | |--Stream Aggregate(DEFINE:([Expr1074]=COUNT_BIG(CASE WHEN [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0) THEN CONVERT(numeric(18,2),[Expr1020],0) ELSE (0.00) END), [Expr1075]=SUM(CASE WHEN [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0) THEN CONVERT(numeric(18,2),[Expr1020],0) ELSE (0.00) END), [Expr1076]=COUNT_BIG(CASE WHEN [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0) THEN CONVERT(numeric(18,2),[Expr1026],0) ELSE (0.00) END), [Expr1077]=SUM(CASE WHEN [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0) THEN CONVERT(numeric(18,2),[Expr1026],0) ELSE (0.00) END)))
| | |--Nested Loops(Inner Join, PASSTHRU:(IsFalseOrNull [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0)), OUTER REFERENCES:([F].[Дата], [F].[ИДАвтомобили], [Expr1014]))
| | |--Nested Loops(Inner Join, PASSTHRU:(IsFalseOrNull [AutoBase].[dbo].[ПеремещениеКолес].[Позиция] as [F].[Позиция]>(0)), OUTER REFERENCES:([F].[Дата], [F].[ИДАвтомобили], [Expr1014]))
| | | |--Compute Scalar(DEFINE:([Expr1014]=[Expr1014]))
| | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([F].[ИДКолеса], [F].[Дата]))
| | | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[ПеремещениеКолес].[PK_ПеремещениеКолес] AS [F]), SEEK:([F].[ИДКолеса]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДКолеса] as [S].[ИДКолеса] AND [F].[Дата] < [AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата]) ORDERED FORWARD)
| | | | |--Stream Aggregate(DEFINE:([Expr1014]=MIN([AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата])))
| | | | |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[ПеремещениеКолес].[PK_ПеремещениеКолес] AS [S]), SEEK:([S].[ИДКолеса]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДКолеса] as [F].[ИДКолеса] AND [S].[Дата] > [AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [F].[Дата]) ORDERED FORWARD)
| | | |--Compute Scalar(DEFINE:([Expr1020]=CASE WHEN [Expr1070]=(0) THEN NULL ELSE [Expr1071] END))
| | | |--Stream Aggregate(DEFINE:([Expr1070]=COUNT_BIG([AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег]), [Expr1071]=SUM([AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег])))
| | | |--Compute Scalar(DEFINE:([S].[Пробег]=[AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег]))
| | | |--Compute Scalar(DEFINE:([S].[Пробег]=[AutoBase].[dbo].[ПутевыеЛисты].[ОдометрВъезд] as [S].[ОдометрВъезд]-[AutoBase].[dbo].[ПутевыеЛисты].[ОдометрВыезд] as [S].[ОдометрВыезд]))
| | | |--Index Seek(OBJECT:([AutoBase].[dbo].[ПутевыеЛисты].[IX_ПутевыеЛисты_Автомобиль] AS [S]), SEEK:([S].[ИДАвтомобили]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДАвтомобили] as [F].[ИДАвтомобили] AND [S].[ДатаОкончания] <= isnull([Expr1014],[AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата])), WHERE:([AutoBase].[dbo].[ПутевыеЛисты].[ДатаНачала] as [S].[ДатаНачала]>=[AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [F].[Дата]) ORDERED FORWARD)
| | |--Compute Scalar(DEFINE:([Expr1026]=CASE WHEN [Expr1072]=(0) THEN NULL ELSE [Expr1073] END))
| | |--Stream Aggregate(DEFINE:([Expr1072]=COUNT_BIG([AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег]), [Expr1073]=SUM([AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег])))
| | |--Compute Scalar(DEFINE:([S].[Пробег]=[AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег]))
| | |--Index Seek(OBJECT:([AutoBase].[dbo].[ПутевыеЛисты].[IX_ПутевыеЛисты_Прицеп] AS [S]), SEEK:([S].[ИДПрицеп]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДАвтомобили] as [F].[ИДАвтомобили] AND [S].[ДатаНачала] >= [AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [F].[Дата]), WHERE:([AutoBase].[dbo].[ПутевыеЛисты].[ДатаОкончания] as [S].[ДатаОкончания]<=isnull([Expr1014],[AutoBase].[dbo].[ПеремещениеКолес].[Дата] as [S].[Дата])) ORDERED FORWARD)
| |--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[Автомобили].[PK_Автомобили] AS [G]), SEEK:([G].[ИД]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДАвтомобили] as [F].[ИДАвтомобили]) ORDERED FORWARD)
|--Compute Scalar(DEFINE:([W].[ФИО]=[AutoBase].[dbo].[Водители].[ФИО] as [W].[ФИО]))
|--Compute Scalar(DEFINE:([W].[ФИО]=([AutoBase].[dbo].[Водители].[Фамилия] as [W].[Фамилия]+isnull(substring(' '+[AutoBase].[dbo].[Водители].[Имя] as [W].[Имя],(1),(2))+'.',''))+isnull(substring([AutoBase].[dbo].[Водители].[Отчество] as [W].[Отчество],(1),(1))+'.','')))
|--Clustered Index Seek(OBJECT:([AutoBase].[dbo].[Водители].[PK_Водители] AS [W]), SEEK:([W].[ИД]=[AutoBase].[dbo].[ПеремещениеКолес].[ИДВодители] as [S].[ИДВодители]) ORDERED FORWARD)

Проверил io статистику:
вариант SET ANSI_WARNINGS OFF:
...Таблица "ПутевыеЛисты". Число просмотров 32, логических чтений 438

вариант SET ANSI_WARNINGS on:
...Таблица "ПутевыеЛисты". Число просмотров 32, логических чтений 86
Разница существенная.

SET ANSI_WARNINGS OFF мне нужен чтобы задавить сообщение:
Внимание! Значение NULL исключено в статистических или других операциях SET.


Отсюда вопросы.
Как влияет SET ANSI_WARNINGS OFF/ON на план выполнения? Есть ли правила и закономерности? Где можно почитать?
9 дек 09, 17:52    [8042679]     Ответить | Цитировать Сообщить модератору
 Re: SET ANSI_WARNINGS ON/OFF и план выполнения  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Почитать и мне конечно интересно - структурирует.
О влияним можно немного самому догадаться из непосредственного описания из BOL о ANSI_WARNINGS и нач что он влияет (усечения, игнорирования и сбросы). Но ещё можно покопать почему у вас на конкретном запросе разница - может там размеры полей отличаются, и т.п.

Вот что там делает излишний Compute Scalar, не врубаюсь:
     |--Compute Scalar(DEFINE:([S].[Пробег]=[AutoBase].[dbo].[ПутевыеЛисты].[ОдометрВъезд] as [S].[ОдометрВъезд]-[AutoBase].[dbo].[ПутевыеЛисты].[ОдометрВыезд] as [S].[ОдометрВыезд]))

Хотя и что делает этот тоже не пойму:
     |--Compute Scalar(DEFINE:([S].[Пробег]=[AutoBase].[dbo].[ПутевыеЛисты].[Пробег] as [S].[Пробег]))


Сори, но чета не выработал привычки быстро читать текстовые планы - простыня текста.
Вот чисто разница:
|--Filter(			  WHERE:(   [ПутевыеЛисты].[ИДПрицеп]		 = [ПеремещениеКолес].[ИДАвтомобили]
AND [ПутевыеЛисты].[ДатаНачала] >= [ПеремещениеКолес].[Дата]
AND [ПутевыеЛисты].[ДатаОкончания] <= isnull([Expr1014],[ПеремещениеКолес].[Дата])
))
|--Compute Scalar(DEFINE:([ПутевыеЛисты].[Пробег]=[ПутевыеЛисты].[Пробег]))
|--Compute Scalar(DEFINE:([ПутевыеЛисты].[Пробег]=[ПутевыеЛисты].[ОдометрВъезд]-[ПутевыеЛисты].[ОдометрВыезд]))
|--Clustered Index Scan(OBJECT:([ПутевыеЛисты].[PK_ПутевыеЛисты]))

|--Compute Scalar(DEFINE:([ПутевыеЛисты].[Пробег]=[ПутевыеЛисты].[Пробег]))
|--Index Seek( OBJECT:([ПутевыеЛисты].[IX_ПутевыеЛисты_Прицеп])
, SEEK:( [ПутевыеЛисты].[ИДПрицеп] = [ПеремещениеКолес].[ИДАвтомобили]
AND [ПутевыеЛисты].[ДатаНачала] >= [ПеремещениеКолес].[Дата]
)
, WHERE:( [ПутевыеЛисты].[ДатаОкончания] <= isnull([Expr1014],[ПеремещениеКолес].[Дата]))
ORDERED FORWARD)
Кстати, ваш WHERE в Index Seek нездоровый. Тут возможно проектирование хромает но хрен с этим.
+ сам запросец нек к чему
SELECT	 Z.ИДКолеса
	,Z.ИДОткуда
	,S.ИДТипыКолес
	,Z.Дата as ДатаУстановки
	,G.РегистрационныйЗнак
	,W.ФИО
	,V.Наименование					AS ВидНаименование
	,R.Наименование
	,S.ЗаводскойНомер
	,Z.Причина
	,Z.Примечание
	,CASE	WHEN Z.Позиция > 0
		THEN        Convert(VarChar,  Z.Позиция)
		ELSE 'ЗП' + Convert(VarChar,1-Z.Позиция)
		END					AS ПозицияТекст
	,X1.Пробег
	,R.ПробегДоИзноса
	,X2.Износ
	,X2.ОстаточнаяСтоимость
	,S.Стоимость
	,S.Стоимость - X2.ОстаточнаяСтоимость		AS Амортизация
FROM	          dbo.vПеремещениеКолесОткуда	Z
	     JOIN dbo.Колеса		S ON S.ИД = Z.ИДКолеса
	     JOIN dbo.ТипыКолес		R ON R.ИД = S.ИДТипыКолес
	     JOIN dbo.ВидыКолес		V ON V.ИД = R.ИДВид
	LEFT JOIN dbo.Автомобили	G ON G.ИД = Z.ИДОткуда
	LEFT JOIN dbo.Водители		W ON W.ИД = Z.ИДВодители
	OUTER APPLY (
		SELECT	F.Пробег
		FROM	dbo.fnПробегКолесКДате(Z.Дата) F
		WHERE	F.ИДКолеса = Z.ИДКолеса
				)	F
	OUTER APPLY (
		SELECT	 IsNull(F.Пробег,0) + S.Пробег	AS Пробег
				)	X1
	OUTER APPLY (
		SELECT	 CASE	WHEN R.ПробегДоИзноса != 0
				THEN X1.Пробег / R.ПробегДоИзноса
				END			AS Износ
			,CASE	WHEN R.ПробегДоИзноса != 0
				THEN	CASE	WHEN X1.Пробег > R.ПробегДоИзноса
						THEN 0
						ELSE (1 - X1.Пробег / R.ПробегДоИзноса) * S.Стоимость
						END
				ELSE S.Стоимость
				END			AS ОстаточнаяСтоимость
				)	X2
WHERE	    Z.Дата		>= @D1
	AND Z.Дата		<  @D2+1
	AND Z.ИДАвтомобили	 = -1    
ORDER BY Z.Дата
	,G.РегистрационныйЗнак
проблемка как я понял в функции.

А может вам просто тупо где-то NOT NULL или IsNull прописать лучше. Это если вдруг задолбаетесь копать (нарезать до самого мелкого но контрольного запроса ...).

Только это - когда разберётесь, отпишитесь пжалуста.
10 дек 09, 00:48    [8043896]     Ответить | Цитировать Сообщить модератору
 Re: SET ANSI_WARNINGS ON/OFF и план выполнения  [new]
КоляПетров
Guest
[url=]http://msdn.microsoft.com/ru-ru/library/ms175088.aspx[/url]
10 дек 09, 01:13    [8043928]     Ответить | Цитировать Сообщить модератору
 Re: SET ANSI_WARNINGS ON/OFF и план выполнения  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1050
КоляПетров
[url=]http://msdn.microsoft.com/ru-ru/library/ms175088.aspx[/url]


Первое, что я сделал - стал читать БОЛ. Ткните меня носом - где там сказано про влияние на select?

Mnior

Кстати, ваш WHERE в Index Seek нездоровый.
Тут возможно проектирование хромает но хрен с этим....


Возможно. Но на проектирование я затратил достаточно времени и мог бы объяснить откуда там IsNull.
В принципе, второй вариант плана запроса меня вполне устраивает.


Mnior

...проблемка как я понял в функции.
А может вам просто тупо где-то NOT NULL или IsNull прописать лучше. Это если вдруг задолбаетесь копать (нарезать до самого мелкого но контрольного запроса ...).

Только это - когда разберётесь, отпишитесь пжалуста.


Да, именно в функции и возникают SUM, которые приводят к анси-предупреждению, именно в функции и возникает index scan. Функцию вылизывал отдельно - там самая тяжелая выборка.
Запущенная автономно, она давала 2 Index Seek - что и требовалось.
Почти очевидно, что при set ansi_warnings off один из seek превратится в scan. Сечас буду проверять. Эта функция используется в многих процедурах моей БД. И не везде я проверял планы выполнения, считая их очевидными и будучи уверенным в эффективности выборки, осуществляемой этой функцией.
Пока я вижу решение проблем - отказ от set ansi_warnings off. Стало быть, буду более осторожным с использованием ADODB.Recordset.
Но непонятка так и осталась. Пока вывод такой: при использовании set ansi_warnings off план выполнения агрегированных запросов может свалиться в Index scan.
10 дек 09, 10:13    [8044685]     Ответить | Цитировать Сообщить модератору
 Re: SET ANSI_WARNINGS ON/OFF и план выполнения  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1050
Mnior,

Если интересно. Нашел первоисточник.

Есть таблица:

CREATE TABLE [dbo].[ПутевыеЛисты](
	[ИД] [int] IDENTITY(1,1) NOT NULL,
	[ИДВодители] [int] NULL,
	[ИДАвтомобили] [int] NULL,
	[ДатаНачала] [datetime] NULL,
	[ДатаОкончания] [datetime] NULL,
	[ОдометрВыезд] [numeric](18, 2) NULL,
	[ОдометрВъезд] [numeric](18, 2) NULL,
	[Пробег]  AS ([ОдометрВъезд]-[ОдометрВыезд]),
	[Прицеп] [bit] NULL,
	[ОстатокВыезд] [numeric](18, 2) NULL,
	[ОстатокВъезд] [numeric](18, 2) NULL,
	[Комментарий] [ntext] NULL,
	[Время]  AS (datediff(minute,[ДатаНачала],[ДатаОкончания])),
	[ИДПрицеп] [int] NULL,
 CONSTRAINT [PK_ПутевыеЛисты] PRIMARY KEY CLUSTERED 
(
	[ИД] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Индексы:

CREATE NONCLUSTERED INDEX [IX_ПутевыеЛисты_Автомобиль] ON [dbo].[ПутевыеЛисты] 
(
	[ИДАвтомобили] ASC,
	[ДатаОкончания] ASC,
	[ДатаНачала] ASC
)
INCLUDE ( [ОдометрВъезд],
[ИДВодители],
[ОдометрВыезд]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]


CREATE NONCLUSTERED INDEX [IX_ПутевыеЛисты_Прицеп] ON [dbo].[ПутевыеЛисты] 
(
	[ИДПрицеп] ASC,
	[ДатаНачала] ASC,
	[ДатаОкончания] ASC
)
INCLUDE ( [Пробег]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

Заметно, что влюченный столбцы в первом индексе [ОдометрВъезд],[ОдометрВыезд]
Во втором индексе:[Пробег] - вычисляемое поле = ([ОдометрВыезд]-[ОдометрВъезд])
Так вот запрос
	select
		cast(sum(S.Пробег) as numeric(18,2)) as Пробег
	from
		dbo.ПутевыеЛисты S
	where ДатаНачала>=@D1 and ДатаОкончания<=@D2 and ИДАвтомобили=@ИДАвтомобили
Дает Index Seek всегда,
а запрос
	select
		cast(sum(S.Пробег) as numeric(18,2)) as Пробег
	from
		dbo.ПутевыеЛисты S
	where ДатаНачала>=@D1 and ДатаОкончания<=@D2 and ИДПрицеп=@ИДАвтомобили

Падает в Index scan при установке ansi_warnings off.
Видимо, дело в вычисляемом поле, являющемся включенным столбцом индекса.

В БОЛ есть про вычисляемы поля при ansi_warnings off - но только для операция записи и создания.
Получается, и при select есть эффект.
10 дек 09, 11:08    [8045140]     Ответить | Цитировать Сообщить модератору
 Re: SET ANSI_WARNINGS ON/OFF и план выполнения  [new]
КоляПетров
Guest
[Время]  AS (datediff(minute,[ДатаНачала],[ДатаОкончания])) 

BOL :

Инструкция SET может динамически изменять параметры сеанса; следовательно, инструкции SET в базе данных, содержащей индексы по представлениям и индексированные вычисляемые столбцы, должны использоваться с осторожностью. Например, приложение может установить соединение, в котором настройки по умолчанию допускают ссылки на индексированное представление или индексированный вычисляемый столбец; однако если соединение вызовет хранимую процедуру или триггер, первой инструкцией которых является SET ANSI_WARNINGS OFF, эта инструкция перекроет прежние значения по умолчанию или настройки ANSI_WARNINGS. В таком случае оптимизатор пропускает все индексированные представления или индексированные вычисляемые столбцы, когда проводит обработку любой инструкции в хранимой процедуре или триггере.

Три других параметра сеанса потенциально способны повлиять на формат результирующих наборов: DATEFIRST, DATEFORMAT и LANGUAGE. Любые функции, чьи результаты будут подвергаться влиянию изменений этих параметров, классифицируются как недетерминированные и не могут использоваться в индексированных представлениях или индексированных вычисляемых столбцах.
10 дек 09, 11:13    [8045192]     Ответить | Цитировать Сообщить модератору
 Re: SET ANSI_WARNINGS ON/OFF и план выполнения  [new]
КоляПетров
Guest
Вернее вот вычисляемый столбец
 [Пробег]  AS ([ОдометрВъезд]-[ОдометрВыезд]),
10 дек 09, 11:15    [8045202]     Ответить | Цитировать Сообщить модератору
 Re: SET ANSI_WARNINGS ON/OFF и план выполнения  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1050
КоляПетров
Вернее вот вычисляемый столбец
 [Пробег]  AS ([ОдометрВъезд]-[ОдометрВыезд]),

Да. Спасибо. Смотрю в книгу, вижу фигу:

Оптимизатор запросов не использует индекс по представлению или вычисляемому столбцу в инструкциях SELECT, выполняемых хранимой процедурой или триггером, если параметры SET настроены неправильно.
10 дек 09, 11:21    [8045262]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить