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

Откуда: Минск
Сообщений: 199
Запрос выполняется очень долго. Порядка 8 мин.
Вот сам текст
INSERT INTO [medianet_inc].[tmp_metadata] 
SELECT m.[comp_id] , max(m.[value_desc]) as [value_desc],  m.[meta_type_id]
FROM [medianet].[metadata] m
	LEFT JOIN [medianet_inc].[tmp_metadata] mt 
	ON m.[comp_id] = mt.[comp_id] AND mt.[meta_type_id] = m.[meta_type_id] AND m.[meta_type_id] = 10
WHERE mt.[comp_id] IS NULL
GROUP BY  m.[comp_id], m.[meta_type_id]

План:

|--Index Insert(OBJECT:([ITN2MNCatalog].[medianet_inc].[tmp_metadata].[IX_inc_tmp_metadata_k3_k1_2]), SET:([Bmk10001010] = [Bmk1000],[comp_id1011] = [ITN2MNCatalog].[medianet_inc].[tmp_metadata].[comp_id],[value_desc1012] = [ITN2MNCatalog].[medianet_inc].[tmp_metadata].[value_desc],[meta_type_id1013] = [ITN2MNCatalog].[medianet_inc].[tmp_metadata].[meta_type_id]) WITH ORDERED PREFETCH)
|--Sort(ORDER BY:([ITN2MNCatalog].[medianet_inc].[tmp_metadata].[meta_type_id] ASC, [ITN2MNCatalog].[medianet_inc].[tmp_metadata].[comp_id] ASC, [Bmk1000] ASC))
|--Table Insert(OBJECT:([ITN2MNCatalog].[medianet_inc].[tmp_metadata]), SET:([ITN2MNCatalog].[medianet_inc].[tmp_metadata].[comp_id] = [ITN2MNCatalog].[medianet].[metadata].[comp_id] as [m].[comp_id],[ITN2MNCatalog].[medianet_inc].[tmp_metadata].[value_desc] = [Expr1009],[ITN2MNCatalog].[medianet_inc].[tmp_metadata].[meta_type_id] = [ITN2MNCatalog].[medianet].[metadata].[meta_type_id] as [m].[meta_type_id]))
|--Top(ROWCOUNT est 0)
|--Parallelism(Gather Streams)
|--Table Spool
|--Stream Aggregate(GROUP BY:([m].[meta_type_id], [m].[comp_id]) DEFINE:([Expr1009]=MAX([partialagg1014])))
|--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([m].[meta_type_id], [m].[comp_id]), ORDER BY:([m].[meta_type_id] ASC, [m].[comp_id] ASC))
|--Stream Aggregate(GROUP BY:([m].[meta_type_id], [m].[comp_id]) DEFINE:([partialagg1014]=MAX([ITN2MNCatalog].[medianet].[metadata].[value_desc] as [m].[value_desc])))
|--Filter(WHERE:([ITN2MNCatalog].[medianet_inc].[tmp_metadata].[comp_id] as [mt].[comp_id] IS NULL))
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([m].[comp_id], [m].[meta_type_id], [Expr1015]) WITH ORDERED PREFETCH)
|--Index Scan(OBJECT:([ITN2MNCatalog].[medianet].[metadata].[IX_metadata_k2_k3_4] AS [m]), ORDERED FORWARD)
|--Filter(WHERE:(STARTUP EXPR([ITN2MNCatalog].[medianet].[metadata].[meta_type_id] as [m].[meta_type_id]=(10.))))
|--Index Seek(OBJECT:([ITN2MNCatalog].[medianet_inc].[tmp_metadata].[IX_inc_tmp_metadata_k3_k1_2] AS [mt]), SEEK:([mt].[meta_type_id]=(10.) AND [mt].[comp_id]=[ITN2MNCatalog].[medianet].[metadata].[comp_id] as [m].[comp_id]) ORDERED FORWARD)

Вот индекс:
CREATE NONCLUSTERED INDEX [IX_metadata_k2_k3_4] ON [medianet].[metadata] 
(
	[meta_type_id] ASC,
	[comp_id] ASC
)
INCLUDE ( [value_desc]) ON [PRIMARY]

На всяк случай план в xml в аттаче.

Спасибо

К сообщению приложен файл (ExecutionPlan.xml - 32Kb) cкачать
30 ноя 09, 12:02    [7995680]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
iljy
Member

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

вообще неплохо бы реальный, а не предпологаемый план выкладывать. Но по этому плану - чему вы собственно удивляетесь? У вас вставка 9 с гаком миллионов строк в таблицу с индексом, это еще по-божески! Можете попробовать поиграться с индексами на metadata, в плане - создать индекс, соответствующий [tmp_metadata].[IX_inc_tmp_metadata_k3_k1_2], станет на одну сортировку меньше, а она на плане 55% занимает.
30 ноя 09, 12:20    [7995847]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
_Monah_
Member

Откуда: Минск
Сообщений: 199
Есть такой
30 ноя 09, 12:31    [7995943]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
_Monah_
Member

Откуда: Минск
Сообщений: 199
Или его создать на таблице [medianet].[metadata]?
30 ноя 09, 12:33    [7995952]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
iljy
Member

Откуда:
Сообщений: 8711
_Monah_
Или его создать на таблице [medianet].[metadata]?


ага. Чтоб чтение в порядке этого индекса могло идти и сортировки лишней не было.
30 ноя 09, 12:34    [7995958]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
_Monah_
Member

Откуда: Минск
Сообщений: 199
Вот скрипт второго индекса:
CREATE NONCLUSTERED INDEX [IX_inc_tmp_metadata_k3_k1_2] ON [medianet_inc].[tmp_metadata] 
(
	[meta_type_id] ASC,
	[comp_id] ASC
)
INCLUDE ( [value_desc]) ON [PRIMARY]
GO
30 ноя 09, 12:35    [7995968]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
у вас "голый" select (без insert) за сколько отрабатывает?
--------------------------------------------------------------
Дьявол кроется в деталях.
30 ноя 09, 12:35    [7995979]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
Glory
Member

Откуда:
Сообщений: 104760
MERGE для SQL2008 ??
Индекс с IGNORE_DUP для остальных версий ?
30 ноя 09, 12:36    [7995984]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
_Monah_
Member

Откуда: Минск
Сообщений: 199
Извиняюсь. Совсем забыл
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)   Jul  9 2008 14:43:34   Copyright (c) 1988-2008 Microsoft Corporation  Developer Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2) 
30 ноя 09, 12:38    [7995992]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
iljy
Member

Откуда:
Сообщений: 8711
_Monah_
Извиняюсь. Совсем забыл
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)   Jul  9 2008 14:43:34   Copyright (c) 1988-2008 Microsoft Corporation  Developer Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2) 


Сервис пак и CU5 поставьте. А то у вас настолько странный план выходит - мне аж страшно.
30 ноя 09, 12:49    [7996077]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
_Monah_
Member

Откуда: Минск
Сообщений: 199
SP1 поставил. CU5 вряд ли получится
План тот же.

Дедушка
у вас "голый" select (без insert) за сколько отрабатывает?

За такое же время практически

Glory
MERGE для SQL2008 ??

Что-то не пойму, как здесь мерж спасет. Или как его написать, чтобы он спас
30 ноя 09, 14:48    [7997095]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
_Monah_
Member

Откуда: Минск
Сообщений: 199
Дедушка, хотя нет.
Выполнил прямо на сервере.
select после SP отработал за 1.50
30 ноя 09, 14:52    [7997118]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
Glory
Member

Откуда:
Сообщений: 104760
_Monah_


Glory
MERGE для SQL2008 ??

Что-то не пойму, как здесь мерж спасет. Или как его написать, чтобы он спас

Разве вы не пытаетесь добавить в tmp_metadata только новые записи из metadata ?
30 ноя 09, 15:18    [7997392]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
_Monah_
Member

Откуда: Минск
Сообщений: 199
Не судите строго.
Не пойму, куда там засунуть группировку
30 ноя 09, 16:03    [7997728]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Может, просто NOT EXISTS вместо LEFT JOIN ... WHERE ... IS NULL поможет?
30 ноя 09, 16:23    [7997871]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать  [new]
_Monah_
Member

Откуда: Минск
Сообщений: 199
iap, то же самое
В принципе, я прибил индекс на [medianet_inc].[tmp_metadata]. Стало в 3 раза быстрее.
Погоняю сча модуль, где это используется, посмотрю, что будет с общим временем выполнения
30 ноя 09, 17:17    [7998192]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить