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

Откуда:
Сообщений: 86
Имеется запрос:
Exec sp_executesql
N'
	SELECT TVID, 
		   dtMeasure
	FROM DataHVSBase
	WHERE TVID IN (@p1, @p2, @p3, @p4) AND 
	      TypeDataID = @p5 AND 
	      dtMeasure >= @p6 AND 
	      dtMeasure <= @p7 AND
	      DeleteStateCode = @p8
',
N'@p1 uniqueidentifier, @p2 uniqueidentifier, @p3 uniqueidentifier, @p4 uniqueidentifier, @p5 uniqueidentifier, @p6 datetime, @p7 datetime, @p8 int',
@p1='1515C2D3-77AE-42C6-8604-00AB59F25835',@p2='60E81E8C-16C6-4ED1-B838-00C42B6745C3',@p3='7E185DFE-724B-446D-8767-0239A556AC1B',@p4='d8e80b23-9ce0-44cf-890e-5dc966a10bfe',
@p5='C9FF1063-0774-4BAC-BA50-FDF64D1DB367', @p6='01.01.2016',@p7='31.01.2016',@p8=0

Для данного запроса формируется такой план:
Картинка с другого сайта.
Почему для каждого TVID происходит поиск в индексе?

Если выполнить такой запрос (по сути, тот же самый, исключив sp_executesql):
SELECT TVID, 
	   dtMeasure
FROM DataHVSBase
WHERE TVID IN ('1515C2D3-77AE-42C6-8604-00AB59F25835','60E81E8C-16C6-4ED1-B838-00C42B6745C3','7E185DFE-724B-446D-8767-0239A556AC1B','d8e80b23-9ce0-44cf-890e-5dc966a10bfe') AND 
	  TypeDataID = 'C9FF1063-0774-4BAC-BA50-FDF64D1DB367' AND 
	  dtMeasure >= '01.01.2016' AND 
	  dtMeasure <= '31.01.2016' AND
	  DeleteStateCode = 0

То план строится такой:
Картинка с другого сайта.

Почему через sp_executesql строится такой не понятный план? Кто-то сталкивался с подобным? Есть какие идеи, как это побороть?
Статистику обновлял, индекс перестраивал
26 апр 16, 20:19    [19110068]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql кривой план запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Max_Tpop
Если выполнить такой запрос (по сути, тот же самый, исключив sp_executesql):
SELECT TVID, 
	   dtMeasure
FROM DataHVSBase
WHERE TVID IN ('1515C2D3-77AE-42C6-8604-00AB59F25835','60E81E8C-16C6-4ED1-B838-00C42B6745C3','7E185DFE-724B-446D-8767-0239A556AC1B','d8e80b23-9ce0-44cf-890e-5dc966a10bfe') AND 
	  TypeDataID = 'C9FF1063-0774-4BAC-BA50-FDF64D1DB367' AND 
	  dtMeasure >= '01.01.2016' AND 
	  dtMeasure <= '31.01.2016' AND
	  DeleteStateCode = 0

Это не такой же запрос, исключив sp_executesql

Вот такой же запрос, , исключив sp_executesql

DECLARE @p1 uniqueidentifier, @p2 uniqueidentifier, @p3 uniqueidentifier, @p4 uniqueidentifier, @p5 uniqueidentifier, @p6 datetime, @p7 datetime, @p8 int

SET @p1='1515C2D3-77AE-42C6-8604-00AB59F25835'
SET @p2='60E81E8C-16C6-4ED1-B838-00C42B6745C3'
SET @p3='7E185DFE-724B-446D-8767-0239A556AC1B'
SET @p4='d8e80b23-9ce0-44cf-890e-5dc966a10bfe'
SET @p5='C9FF1063-0774-4BAC-BA50-FDF64D1DB367'
SET @p6='01.01.2016'
SET @p7='31.01.2016'
SET @p8=0
SELECT TVID, 
		   dtMeasure
	FROM DataHVSBase
	WHERE TVID IN (@p1, @p2, @p3, @p4) AND 
	      TypeDataID = @p5 AND 
	      dtMeasure >= @p6 AND 
	      dtMeasure <= @p7 AND
	      DeleteStateCode = @p8
26 апр 16, 20:35    [19110133]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql кривой план запроса  [new]
Max_Tpop
Member

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

Да, Вы правы.
Приведенный Вами запрос строит план аналогичный sp_executesql.
Есть этому какое-то разумное объяснение? Почему такое происходит и что можно сделать, чтобы избежать от построения такого плана?
26 апр 16, 21:18    [19110271]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql кривой план запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Max_Tpop
Есть этому какое-то разумное объяснение?

Константа не есть переменная с неизвестным значением.
Строить план для заранее известного значения и строить план для какого-то любого значения - это разные вещи
26 апр 16, 21:21    [19110286]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql кривой план запроса  [new]
Max_Tpop
Member

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

Имеются аналогичные таблицы, такой же структуры, но для них строится адекватный план, значит есть какая-то причина, которую можно устранить.
26 апр 16, 21:26    [19110304]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql кривой план запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Max_Tpop
но для них строится адекватный план,

а у вас есть личные критерии адекватности ?

Max_Tpop
значит есть какая-то причина, которую можно устранить.

причину я вам указал
Значение константы известно ДО выполнения запроса и позволяет оптимизатору использовать это явное значение при выборе плана.
А значение переменной оптимизатору неизвестно. И план строится для общего случая.

Сообщение было отредактировано: 26 апр 16, 21:31
26 апр 16, 21:31    [19110319]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql кривой план запроса  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
Max_Tpop,

Почитайте:
http://www.somewheresomehow.ru/fast-in-ssms-slow-in-app-part1/
26 апр 16, 21:34    [19110338]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить