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

Откуда: дровишки?
Сообщений: 6067
Необходимо оптимизировать sql-запрос, но я ещё не волшебник, поэтому прошу помочь советом.

Есть запрос следующего вида:
select
    *
from
    t1
    left join t2 on t2.field1 = t1.field1 or t2.field2 = t1.field1

Выполняется он около часа. При этом если закомментить одно из условий в join-е или заменить OR на AND, то запрос выполняется 8 секунд. Хочу избавиться от условия OR.

Замена
t2.field1 = t1.field1 or t2.field2 = t1.field1
на
t1.field1 in (t2.field1, t2.field2)
или
not ((t2.field1 <> t1.field1) and (t2.field2 <> t1.field1))
нужного эффекта не даёт.

Мб можно заменить исходную конструкцию на UNION?
select
    *
from
    t1
    left join t2 on t2.field1 = t1.field1
union
select
    *
from
    t1
    left join t2 on t2.field2 = t1.field1

Взлетит? Или такие вещи как-то иначе делаются?
30 окт 14, 20:47    [16779480]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса - нужен совет  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
brbrbr
Мб можно заменить исходную конструкцию на UNION?
select
    *
from
    t1
    left join t2 on t2.field1 = t1.field1
union
select
    *
from
    t1
    left join t2 on t2.field2 = t1.field1

Взлетит? Или такие вещи как-то иначе делаются?
Это обычный способ. Должен взлететь.
Хотя ничего не было сказано про индексы.
И звёздочка в данном случае - плохо!
30 окт 14, 20:51    [16779492]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса - нужен совет  [new]
brbrbr
Member

Откуда: дровишки?
Сообщений: 6067
iap
brbrbr
Мб можно заменить исходную конструкцию на UNION?
select
    *
from
    t1
    left join t2 on t2.field1 = t1.field1
union
select
    *
from
    t1
    left join t2 on t2.field2 = t1.field1


Взлетит? Или такие вещи как-то иначе делаются?
Это обычный способ. Должен взлететь.
Хотя ничего не было сказано про индексы.
И звёздочка в данном случае - плохо!

Понял, спасибо.

Звёздочка для примера, чтобы не нагромождать. Некластерные индексы имеются по каждому из используемых полей.
30 окт 14, 20:58    [16779506]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса - нужен совет  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
И union тоже плохо. Нужно union all.
30 окт 14, 21:18    [16779542]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса - нужен совет  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
Не, наврал. union нужен.
30 окт 14, 21:21    [16779551]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса - нужен совет  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
invm,

с union all будут дубликаты
30 окт 14, 21:35    [16779600]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса - нужен совет  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
brbrbr,

а чтобы два раза не писать select..join и фильтры, можно сделать так

select *
from t2
cross apply (
    select t2.field1
    union all
    select t2.field2
) as fields(id)
join t1 on t1.field1 = fields.id
where ...

тут строгое равенство после ON можно заменить на exists(.. intersect ..), в зависимости от того как планируете обрабатывать NULL
31 окт 14, 00:31    [16780178]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса - нужен совет  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Shakill, поправка насчет дубликатов: вместо union all -> union, либо вместо select t2.field2 -> select t2.field2 where t2.field2 <> t2.field1, в зависимости от NULL, опять же
31 окт 14, 00:37    [16780188]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса - нужен совет  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
brbrbr, OR используйте только с INNER.
31 окт 14, 11:19    [16781745]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить