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

Откуда:
Сообщений: 1197
Есть функция.
Вызываю функцию простым селектом - работает 8 секунд
Беру весь запрос и выполняю отдельно - работает меньше секунды.
Тестировал много раз.

Посмотрел актуальный план запроса и вижу, что когда выолняю вне функции, то срабатывает индекс у таблицы к которой запрос.
Почему данный индекс ни разу не сработал когда я вызываю функцию и как исправить?

FUNCTION [dbo].[Ru_tfGetDatal] 
(
	@Code NVARCHAR(50)
)
RETURNS @tbl TABLE 
(
    Code NVARCHAR(30),
    Name NVARCHAR(200),
    SaleDate NCHAR(8),
    Code2 NVARCHAR(30),
    Name2 NVARCHAR(200),
    Number TINYINT
)
AS
BEGIN
	
	INSERT @tbl (...)	 
		SELECT Val1, '', Val2, Val3, '',
		   ROW_NUMBER() OVER(ORDER BY MDate) as Number 
	FROM myDb as sd
	WHERE sd.Code = @Code 
	ORDER BY Number 
	
	RETURN 
END
25 июл 12, 14:59    [12914269]     Ответить | Цитировать Сообщить модератору
 Re: почему не срабатывает индекс?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
relief,

parameter sniffing
25 июл 12, 15:52    [12914658]     Ответить | Цитировать Сообщить модератору
 Re: почему не срабатывает индекс?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
CREATE FUNCTION [dbo].[Ru_tfGetDatal](@Code NVARCHAR(50))
RETURNS TABLE 
RETURN
 SELECT
  Code=CAST(Val1 AS NVARCHAR(30))
 ,[Name]=CAST(''AS NVARCHAR(200))
 ,SaleDate=CAST(Val2 AS NCHAR(8))
 ,Code2=CAST(Val3 AS NVARCHAR(30))
 ,Name2=CAST(''AS NVARCHAR(200))
 ,[Number]=ROW_NUMBER()OVER(ORDER BY MDate)
 FROM myDb
 WHERE sd.Code=@Code;
25 июл 12, 16:07    [12914796]     Ответить | Цитировать Сообщить модератору
 Re: почему не срабатывает индекс?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Исправления по-мелочи:
CREATE FUNCTION [dbo].[Ru_tfGetDatal](@Code NVARCHAR(50))
RETURNS TABLE 
RETURN
 SELECT
  Code=CAST(Val1 AS NVARCHAR(30))
 ,[Name]=CAST(''AS NVARCHAR(200))
 ,SaleDate=CAST(Val2 AS NCHAR(8))
 ,Code2=CAST(Val3 AS NVARCHAR(30))
 ,Name2=CAST(''AS NVARCHAR(200))
 ,[Number]=ROW_NUMBER()OVER(ORDER BY MDate)
 FROM dbo.myDb
 WHERE Code=@Code;
25 июл 12, 16:08    [12914811]     Ответить | Цитировать Сообщить модератору
 Re: почему не срабатывает индекс?  [new]
relief
Member

Откуда:
Сообщений: 1197
iap,

а в чем фокус?

помогло.
25 июл 12, 16:20    [12914898]     Ответить | Цитировать Сообщить модератору
 Re: почему не срабатывает индекс?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
relief
iap,

а в чем фокус?

помогло.
Читайте про различия между inline функциями и multi-statement функциями.
Первые - это параметрические представления, подставляющиеся в текст запроса перед оптимизацией.
Вторые - тормоза для самых крайних случаев. Правда, их тоже можно индексировать...
Хотя, можно утверждать, что скалярные UDF ещё хуже, чем multi-statement, но это уже другая история
25 июл 12, 16:30    [12914968]     Ответить | Цитировать Сообщить модератору
 Re: почему не срабатывает индекс?  [new]
relief
Member

Откуда:
Сообщений: 1197
iap
relief
iap,

а в чем фокус?

помогло.
Читайте про различия между inline функциями и multi-statement функциями.
Первые - это параметрические представления, подставляющиеся в текст запроса перед оптимизацией.
Вторые - тормоза для самых крайних случаев. Правда, их тоже можно индексировать...
Хотя, можно утверждать, что скалярные UDF ещё хуже, чем multi-statement, но это уже другая история


т.е. порядок нежелательности использования такой от худшей производительности к лучшей

udf
multi
inline

?
25 июл 12, 16:56    [12915172]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить