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

Откуда:
Сообщений: 1100
Microsoft SQL Server 2000 - 8.00.760 (Intel X86)
Dec 17 2002 14:22:05
Copyright (c) 1988-2003 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 (Build 3790: )

Проблема: растёт tempdb.

Есть процедура размером в 1500 строк. В ней активно используются select into (знаю, что плохо, но пока руки не доходят поправить), UDF (table, inline, scalar). В самой процедуре есть курсор, который закрывается и деаллокируется. В вызываемых процедурах и функциях курсоров нет. БОльшая часть процедуры обёрнута в транзакцию.
Так вот, эта процедура вызывается около 20000 раз. Работает в сумме около 3 часов. За это время tempdb (файл данных) вырастает почти до 40 ГБ. Также вырастает время исполнения самой процедуры (от 100 мс до 1-2 с). В частности вырастает время исполнения одного элементарного update типа:
update lp
	set
	TempNot = 1,
	DayCalc =
			cast(
				(@dtTo-@dtFrom)-
				(case when @dtTo < dtTo then @dtTo else dtTo end - case when @dtFrom > dtFrom then @dtFrom else dtFrom end)
				as int)
from #ListPrivilages lp
inner join #AbsentTenants glt
	on lp.TenantID = glt.TenantID

план этого запроса такой:
StmtText                                                                                                                                                                                        StmtId     NodeId     Parent     PhysicalOp       LogicalOp       Argument                                                                                                                                                                   DefinedValues                                                                                                                                                     EstimateRows EstimateIO EstimateCPU AvgRowSize TotalSubtreeCost OutputList                              Warnings   Type       Parallel   EstimateExecutions
-------- ------ ------ ------ ---------- --------- -------- ------------- ------------ ---------- ----------- ---------- ---------------- ---------- -------- ---- -------- ------------------
Table Update(OBJECT:([tempdb].[dbo].[#ListPrivilages]), SET:([#ListPrivilages].[DayCalc]=[Expr1005], [#ListPrivilages].[TempNot]=1)) 0 0 Table Update Update OBJECT:([tempdb].[dbo].[#ListPrivilages]), SET:([#ListPrivilages].[DayCalc]=[Expr1005], [#ListPrivilages].[TempNot]=1) 10 0,0113514 1E-005 21 0,0626038 PLAN_ROW 0 1
|--Compute Scalar(DEFINE:([Expr1005]=Convert([@dtTo]-[@dtFrom]-(If ([@dtTo]<[glt].[dtTo]) then [@dtTo] else [glt].[dtTo]-If ([@dtFrom]>[glt].[dtFrom]) then [@dtFrom] else [glt].[dtFrom])))) 0 1 0 Compute Scalar Compute Scalar DEFINE:([Expr1005]=Convert([@dtTo]-[@dtFrom]-(If ([@dtTo]<[glt].[dtTo]) then [@dtTo] else [glt].[dtTo]-If ([@dtFrom]>[glt].[dtFrom]) then [@dtFrom] else [glt].[dtFrom]))) [Expr1005]=Convert([@dtTo]-[@dtFrom]-(If ([@dtTo]<[glt].[dtTo]) then [@dtTo] else [glt].[dtTo]-If ([@dtFrom]>[glt].[dtFrom]) then [@dtFrom] else [glt].[dtFrom])) 10 0 1E-006 23 0,0512425 [Bmk1000], [Expr1004], [Expr1005] PLAN_ROW 0 1
|--Top(ROWCOUNT est 0) 0 2 1 Top Top 10 0 1E-006 133 0,0512415 [Bmk1000], [glt].[dtFrom], [glt].[dtTo] PLAN_ROW 0 1
|--Stream Aggregate(GROUP BY:([Bmk1000]) DEFINE:([glt].[dtFrom]=ANY([glt].[dtFrom]), [glt].[dtTo]=ANY([glt].[dtTo]))) 0 3 2 Stream Aggregate Aggregate GROUP BY:([Bmk1000]) [glt].[dtFrom]=ANY([glt].[dtFrom]), [glt].[dtTo]=ANY([glt].[dtTo]) 10 0 7,45E-005 133 0,0512405 [Bmk1000], [glt].[dtFrom], [glt].[dtTo] PLAN_ROW 0 1
|--Bookmark Lookup(BOOKMARK:([Bmk1001]), OBJECT:([tempdb].[dbo].[#AbsentTenants] AS [glt])) 0 4 3 Bookmark Lookup Bookmark Lookup BOOKMARK:([Bmk1001]), OBJECT:([tempdb].[dbo].[#AbsentTenants] AS [glt]) [glt].[dtFrom], [glt].[dtTo] 10 0,00625 1,1E-005 45 0,051166 [Bmk1000], [glt].[dtFrom], [glt].[dtTo] PLAN_ROW 0 1
|--Nested Loops(Inner Join, OUTER REFERENCES:([lp].[TenantID])) 0 5 4 Nested Loops Inner Join OUTER REFERENCES:([lp].[TenantID]) 10 0 4,18E-005 29 0,044905 [Bmk1000], [Bmk1001] PLAN_ROW 0 1
|--Index Scan(OBJECT:([tempdb].[dbo].[#ListPrivilages] AS [lp]), ORDERED FORWARD) 0 6 5 Index Scan Index Scan OBJECT:([tempdb].[dbo].[#ListPrivilages] AS [lp]), ORDERED FORWARD [Bmk1000], [lp].[TenantID] 10 0,0375785 8,95E-005 19 0,037668 [Bmk1000], [lp].[TenantID] PLAN_ROW 0 1
|--Index Seek(OBJECT:([tempdb].[dbo].[#AbsentTenants] AS [glt]), SEEK:([glt].[TenantID]=[lp].[TenantID]) ORDERED FORWARD) 0 7 5 Index Seek Index Seek OBJECT:([tempdb].[dbo].[#AbsentTenants] AS [glt]), SEEK:([glt].[TenantID]=[lp].[TenantID]) ORDERED FORWARD [Bmk1001] 1 0,0063285 7,9603E-00 19 0,00719518 [Bmk1001] PLAN_ROW 0 10

Обе таблицы создаются в этой же хранимке. Время выполнения запроса (по профайлеру) увеличивается даже в том случае, если этот запрос обрабатывает 0 строк. В таблицах содержится порядка 10 строк.

Эта ситуация не зависит от сервера.
Что же происходит?
11 сен 04, 16:08    [952940]     Ответить | Цитировать Сообщить модератору
 Re: Разрастание tempdb  [new]
KOLCHOZ_POSTEVENT
Guest
Если все вызовы с одного коннекта,то tempdb расти не должна,а вот если хотя-бы с 2,то мило-дело.
А теперь,если у Вас 2 коннекта вместе трясут tempdb через select into,то добро пожаловать,блокировки,и производительность,сответственно,вниз.
12 сен 04, 13:07    [953326]     Ответить | Цитировать Сообщить модератору
 Re: Разрастание tempdb  [new]
Alexes
Member

Откуда:
Сообщений: 1100
Коннект один. Растёт время выполнения только одного вышеприведённого запроса и, повторюсь, tempdb. Помнится, с tempdb у Crimean была похожая ситуация, но там не вполне корректно была организована работа с курсорами.
12 сен 04, 15:43    [953391]     Ответить | Цитировать Сообщить модератору
 Re: Разрастание tempdb  [new]
KOLCHOZ_POSTEVENT
Guest
Тогда я бы посоветовал отследить при поощи count(*),количество строк в таблах #ListPrivilages , #AbsentTenants,от запуска к запуску. Возможно,и такое приходилось наблюдать,каюсь,у самого себя, при создании врем.таблицы,из-за пропущенного условия в where,котороё должно связывать исходные таблицы(а оно по разгильдяйству пропущенно),начинается сплошной перехлёст и кол-во записей на выходе ратёт по экспоненте.
12 сен 04, 16:37    [953412]     Ответить | Цитировать Сообщить модератору
 Re: Разрастание tempdb  [new]
Alexes
Member

Откуда:
Сообщений: 1100
Таблички создаются и, следовательно, уничтожаются в этой хранимке. Число записей в них невелико.
13 сен 04, 11:17    [954194]     Ответить | Цитировать Сообщить модератору
 Re: Разрастание tempdb  [new]
Copyright
Member

Откуда: Volgograd=>Moscow=>Volgograd
Сообщений: 1049
>Проблема: растёт tempdb

Не мешало бы уточнить
А что вы делали для того, чтобы решить эту проблему???
Что у вас в tempdb растет - лог или данные???

P.S Подозреваю, что растет Log
Copyright мой
13 сен 04, 11:55    [954340]     Ответить | Цитировать Сообщить модератору
 Re: Разрастание tempdb  [new]
Copyright
Member

Откуда: Volgograd=>Moscow=>Volgograd
Сообщений: 1049
Copyright
>Проблема: растёт tempdb

Не мешало бы уточнить
А что вы делали для того, чтобы решить эту проблему???
Что у вас в tempdb растет - лог или данные???

P.S Подозреваю, что растет Log
Copyright мой
13 сен 04, 11:57    [954345]     Ответить | Цитировать Сообщить модератору
 Re: Разрастание tempdb  [new]
Alexes
Member

Откуда:
Сообщений: 1100
Я уже написал, что растёт файл данных.
Что я делал - избавился от табличных переменных, проверил, как работают курсоры.
13 сен 04, 11:58    [954355]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить