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

Откуда: Киев
Сообщений: 20
Добрый день!
Недавно у меня возникла проблема нахождения данных с пересекающимися интевалами, например:
ID BEGIN_ID END_ID
1 1 700
1 3 5
2 7 9
Тоесть надо было выбрать первые две строки.
Благодаря Dmidek'у эта проблема решилась приблизительно так:
SELECT T1.ID, T1.BEGIN_ID, T1.END_ID
FROM TABLE_NAME T1 , TABLE_NAME T2
WHERE (T1.ID) IN (T2.ID)
AND T1.ROWID != T2.ROWID
AND  AND T2.BEGIN_ID <= T1.END_ID AND T2.END_ID >= T1.BEGIN_ID
Но при работе с большими таблицами запрос выполняеться ну очень долго.
Для ускорения я добавил новую часть в секцию WHERE:
AND (  300 BETWEEN T1.BEGIN_ID AND T1.END_ID )
И всё бы хорошо, но например для вышеуказанной таблцы вернеться только 1 строка и пересекаемых:
ID BEGIN_ID END_ID
1 1 700

Подскажите, пожалуйста, как можно модифицировать запрос, чтоб выбирались:
ID BEGIN_ID END_ID
1 1 700
1 3 5
19 май 06, 17:22    [2685635]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
lll_4
Guest
SELECT T1.ID, T1.BEGIN_ID, T1.END_ID
FROM tb T1 inner join tb T2 On
(T1.ID) = (T2.ID)
AND T1.ROWID != T2.ROWID
AND T2.BEGIN_ID <= T1.END_ID AND T2.END_ID >= T1.BEGIN_ID
19 май 06, 18:38    [2685988]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Swindler
Member

Откуда: Киев
Сообщений: 20
lll_4, мой оракл не знает inner join, знает только (+)
Тем более, (T1.ID) = (T2.ID) не всегда верное объединения, так как может быть составной ключ - в запросе не зря стоит
WHERE (T1.ID) IN (T2.ID)
так как может быть:
WHERE (T1.ID1,...T1.IDn) IN (T2.ID1,...T2.IDn)
19 май 06, 18:48    [2686012]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116152
Swindler
lll_4Тем более, (T1.ID) = (T2.ID) не всегда верное объединения, так как может быть составной ключ - в запросе не зря стоит
WHERE (T1.ID) IN (T2.ID)
так как может быть:
WHERE (T1.ID1,...T1.IDn) IN (T2.ID1,...T2.IDn)


Этого пассажа я не понял.
(T1.ID) IN (T2.ID) вообще то эквивалентно (T1.ID) = (T2.ID), но так никто не пишет. Не думаю, что я предлагал вариант с IN...
19 май 06, 19:03    [2686054]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Swindler
Member

Откуда: Киев
Сообщений: 20
dmidek, WHERE (T1.ID) IN (T2.ID) - это моя самодеятельность. Просто необходимо было связать по составным частям ключа, а писать операцию = для каждой части я не захотел. Поэтому и написал:
WHERE (T1.ID1,...T1.IDn) IN (T2.ID1,...T2.IDn)
в вырожденном случае получаеться:
WHERE (T1.ID) IN (T2.ID)
19 май 06, 19:42    [2686170]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Elic
Member

Откуда:
Сообщений: 29979
Swindler
WHERE (T1.ID1,...T1.IDn) IN (T2.ID1,...T2.IDn)
Такого синтаксиса нет. А есть:
select * from dual where (1,2) = all ((1,2));
select * from dual where (1,2) in ((1,2));
19 май 06, 20:05    [2686256]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Swindler
Member

Откуда: Киев
Сообщений: 20
Да, WHERE (T1.ID1,...T1.IDn) IN ((T2.ID1,...T2.IDn)), но проблемма то не в этом...
19 май 06, 21:55    [2686493]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить