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

Откуда: Москва
Сообщений: 10
Добрый день.

Есть такой запрос:

select OZM from AUSP where  
OZM in (select distinct code from OZM where CLASSID ='HR_0103300')  
and OZM in (select OZM from AUSP where FEATURE = 'STNDRT_PROD' and VALUE = N'ТУ 14-106-321-2010')  
and OZM in (select OZM from AUSP where FEATURE = 'VID_POSTAVKI' and VALUE = N'РЛН РСП') 
and OZM in (select OZM from AUSP where FEATURE = 'GRUP_GROT' and VALUE = N'-') 
and OZM in (select OZM from AUSP where FEATURE = 'GRUP_VITYAZHKA' and VALUE = N'-')     
and OZM in (select OZM from AUSP where FEATURE = 'KROM' and VALUE = N'О') 
and FEATURE = 'MARKA' and VALUE is not null 

Выполняется около 2 секунд.
Есть ли способ как-то оптимизировать его?

Таблица AUSP имеет следующий вид:
OZM                          FEATURE                VALUE
-------------------------------------------------------------
HR_0103500_0090 MARKA Ст5сп
HR_0103500_0090 STNDRT_PROD ТУ 14-106-377-97
HR_0103500_0090 KROM НО
HR_0103500_0090 VID_POSTAVKI ЛСТ
HR_0103500_0090 GRUP_GROT -
HR_0103500_0090 GRUP_VITYAZHKA -


Сообщение было отредактировано: 5 окт 11, 19:40
5 окт 11, 19:25    [11391066]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
aleks2
Guest
Засуньте результат каждого из
in (select  
во временные таблицы с кластерным индексом
и выполните INNER JOIN с ними.
5 окт 11, 19:38    [11391097]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
План покажите.
5 окт 11, 19:40    [11391102]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Camena, PIVOT по AUSP должен быть побыстрее чем грядка селектов.
5 окт 11, 19:49    [11391129]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
да - есть такой запрос
Guest
Camena,

IN используется как exists или inner join?
5 окт 11, 20:58    [11391354]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6900
Действительно, я тоже не понял, чем (к примеру)
and OZM in (select OZM from AUSP where FEATURE = 'STNDRT_PROD' and VALUE = N'ТУ 14-106-321-2010')
в данном случае отличается от
and FEATURE = 'STNDRT_PROD' and VALUE = N'ТУ 14-106-321-2010')
а, вернее, от полного перечисления всех FEATURE и VALUE через AND.

Или уж, дайте примерчик таблиц OZM и AUSP хотя бы в сокращенном варианте...
5 окт 11, 21:52    [11391527]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iljy
Member

Откуда:
Сообщений: 8711
AndreTM
Действительно, я тоже не понял, чем (к примеру)
and OZM in (select OZM from AUSP where FEATURE = 'STNDRT_PROD' and VALUE = N'ТУ 14-106-321-2010')
в данном случае отличается от
and FEATURE = 'STNDRT_PROD' and VALUE = N'ТУ 14-106-321-2010')
а, вернее, от полного перечисления всех FEATURE и VALUE через AND.

Тем, что FEATURE не может быть одновременно равно 'STNDRT_PROD' и 'VID_POSTAVKI'.

ТС, выдайте скрипты таблицы с индексами и покажите план. Есть несколько возможных вариантов решения.
5 окт 11, 21:56    [11391537]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Да вообще похоже на EAV, соответственно погуглить на эту тему по например так.
5 окт 11, 22:37    [11391712]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6900
iljy,

А.., да, задумался, смотрел в это время другую тему, сказал не о том... посыпаю голову пеплом

Не предлагаю, конечно, менять схему... или расписать эти "свойства-значения" по полям курсора...

А вот если попробовать использовать APPLY?
5 окт 11, 23:18    [11391813]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
AndreTM, схему там менять не надобно, эта модель в некоторых случаях достаточно удобна. Курсоры - лесом.
А вот на счет APPLY как-то тяжело придумывается как вы его поиспользовать хотите.

ИХМО пивот (ну или через MAX(CASE...)), опосля наложить фильтры - должно быть достаточно быстро.
5 окт 11, 23:48    [11391865]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Вьюху сделать и горя не знать.
DECLARE @tbl TABLE (OZM VARCHAR(50), FEATURE  VARCHAR(50), VALUE  VARCHAR(50))


INSERT INTO @tbl(OZM, FEATURE, VALUE)
SELECT
'HR_0103500_0090', 'MARKA', 'Ст5сп' UNION ALL SELECT
'HR_0103500_0090', 'STNDRT_PROD', 'ТУ 14-106-377-97' UNION ALL SELECT
'HR_0103500_0090', 'KROM','НО' UNION ALL SELECT
'HR_0103500_0090', 'VID_POSTAVKI', 'ЛСТ' UNION ALL SELECT
'HR_0103500_0090', 'GRUP_GROT','-' UNION ALL SELECT
'HR_0103500_0090', 'GRUP_VITYAZHKA', '-'

SELECT OZM
,MAX(CASE WHEN FEATURE='MARKA' THEN VALUE END) MARKA
,MAX(CASE WHEN FEATURE='STNDRT_PROD' THEN VALUE END) STNDRT_PROD
,MAX(CASE WHEN FEATURE='KROM' THEN VALUE END) KROM
,MAX(CASE WHEN FEATURE='VID_POSTAVKI' THEN VALUE END) VID_POSTAVKI
,MAX(CASE WHEN FEATURE='GRUP_GROT' THEN VALUE END) GRUP_GROT
,MAX(CASE WHEN FEATURE='GRUP_VITYAZHKA' THEN VALUE END) GRUP_VITYAZHKA
FROM @tbl
GROUP BY OZM
5 окт 11, 23:59    [11391895]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Camena
Member

Откуда: Москва
Сообщений: 10
Спасибо за ответы!

Помогла замена select на join. В итоге запрос стал выглядеть следующим образом:

select distinct main.VALUE
from AUSP main
join OZM sub6 on sub6.CLASSID = 'HR_0103100'
join AUSP sub on sub.OZM = main.OZM and sub.FEATURE = 'STNDRT_PROD' and sub.VALUE = N'ГОСТ Р 52927-2008'
join AUSP sub2 on sub2.OZM = main.OZM and sub2.FEATURE = 'KROM' and sub2.VALUE = N'НО'
join AUSP sub3 on sub3.OZM = main.OZM and sub3.FEATURE = 'VID_POSTAVKI' and sub3.VALUE = N'ЛСТ'
join AUSP sub4 on sub4.OZM = main.OZM and sub4.FEATURE = 'GRUP_GROT' and sub4.VALUE = N'-'
join AUSP sub5 on sub5.OZM = main.OZM and sub5.FEATURE = 'GRUP_VITYAZHKA' and sub5.VALUE = N'-'
where main.FEATURE = 'MARKA'
union all select VALUE as VALUE from FEATURE where CODE = 'OTHER'
order by VALUE
6 окт 11, 15:14    [11395466]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
1. distinct заменить на group by
2. непонятно зачем distinct вместе с union ALL (т.е. distinct подразумевает, что дальше будет union без all).
3. можно сджойнить только один раз саму с собой:
join AUSP sub on sub.OZM = main.OZM and
(sub.FEATURE = 'STNDRT_PROD' and sub.VALUE = N'ГОСТ Р 52927-2008')
OR (sub2.FEATURE = 'KROM' and sub2.VALUE = N'НО')
...
но надо смотреть что там план рисует.
4. странная таблица и запрос (-:
6 окт 11, 20:15    [11397834]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить