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

Откуда: Москва
Сообщений: 310
Опытные оптимизаторы и dba подскажите мне вот какую информацию.

Решил воспроизвести это на простых примерах.

SELECT @@VERSION
Microsoft SQL Server 2005 - 9.00.5000.00 (X64) Enterprise Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)


Процедуры:

CREATE PROCEDURE [dbo].[a_test](@idd INT)
AS
BEGIN
    IF OBJECT_ID('tempdb..#t1') IS NOT NULL DROP TABLE t1
	    CREATE TABLE #t1 ( ID int IDENTITY(1,1) NOT NULL,
	                                a numeric(16, 0) NOT NULL
                                        PRIMARY KEY(ID, a)
				      )

	EXEC b_test @idd
END
GO

CREATE PROCEDURE [dbo].[b_test](@idd INT)
AS
BEGIN
	INSERT INTO #t1(a)
	SELECT @idd
	
	INSERT INTO #t1(a)
	SELECT @idd+1
	
END


Открываем новую сессию и выполняем:
EXEC A_TEST 1


Выполняем:
SELECT cp.*
  FROM sys.dm_exec_cached_plans cp
  CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp
  WHERE qp.objectid = object_id('a_test')
OPTION (RECOMPILE);

SELECT cp.*
  FROM sys.dm_exec_cached_plans cp
  CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp
  WHERE qp.objectid = object_id('b_test')
OPTION (RECOMPILE);


bucketidrefcountsusecountssize_in_bytesmemory_object_addresscacheobjtypeobjtypeplan_handle
2421221409600x000000009BF4E170Compiled PlanProc0x050005005AB1866F40E3F49B000000000000000000000000

bucketidrefcountsusecountssize_in_bytesmemory_object_addresscacheobjtypeobjtypeplan_handle
649721983040x000000009C06A170Compiled PlanProc0x0500050093D57A7040A3069C000000000000000000000000


Открываем еще одну новую сессию:
EXEC a_test 1


И видим вот какую картину:
bucketidrefcountsusecountssize_in_bytesmemory_object_addresscacheobjtypeobjtypeplan_handle
2421222409600x000000009BF4E170Compiled PlanProc0x050005005AB1866F40E3F49B000000000000000000000000

bucketidrefcountsusecountssize_in_bytesmemory_object_addresscacheobjtypeobjtypeplan_handle
649721983040x00000000F4634170Compiled PlanProc0x0500050093D57A70404363F4000000000000000000000000
649721983040x000000009C06A170Compiled PlanProc0x0500050093D57A7040A3069C000000000000000000000000


Методом анализа и поиска я понял, что из-за наличия в процедуре a_test временной таблицы, которая в каждой сессии называется по-своему, оптимизатор для разных сессий воспринимает процедуре b_test как новую.

Следовательно кол-во планов на процедуру b_test будет столько, сколько ее будут запускать с разных сессий. А их может быть сотни.

Насколько это хорошо/плохо?
Переписывать подобного рода процедуры на использование постоянных, чтобы всегда был один план?
6 июн 16, 13:32    [19262544]     Ответить | Цитировать Сообщить модератору
 Re: Количество планов запросов на одну процедуру  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
Hamber,

планы смотрели , они параметризованы или нет?
6 июн 16, 13:45    [19262619]     Ответить | Цитировать Сообщить модератору
 Re: Количество планов запросов на одну процедуру  [new]
Владислав Колосов
Member

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

еще планы компилируются для разных языков соединения, если правильно помню, и прочих SET. Трассировщиком можно посмотреть все перекомпиляции.
6 июн 16, 14:05    [19262770]     Ответить | Цитировать Сообщить модератору
 Re: Количество планов запросов на одну процедуру  [new]
invm
Member

Откуда: Москва
Сообщений: 9723
Hamber
Насколько это хорошо/плохо?
Это не хорошо и не плохо. Это нормально.
Hamber
Переписывать подобного рода процедуры на использование постоянных, чтобы всегда был один план?
Лучше подумать над изменением архитектуры, - чтобы не нужно было писать универсальных процедур, способных работать с таблицами неизвестной структуры.
6 июн 16, 14:14    [19262849]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить