Текущий архив: 2008.07.27;
Скачать: CL | DM;
ВнизВекторные запросы. Оракл и все остальные СУБД Найти похожие ветки
← →
ANB (2008-02-13 09:44) [40]Откуда взялся вопрос :
Пример :
имеем Т1 и Т2. У Т1 - составной ПК по ИД_1 и ИД_2. Т2 ссылается на Т1 полями Т1_ИД_1 и Т1_ИД_2.
Надо : вытащить ином (часто бывает нужно) записи из Т2 по определенному набору записей в Т1. Раньше чесал репу и таки обычно джойнил. А недавно накопал фичу :
select * from T2 where (Т1_ИД_1, Т1_ИД_2) in (select ИД_1, ИД_2 from T1).
Удобно. Аналогичная фича нашлась и для update - когда надо обновить набор полей из одной записи другой таблицы.
update T1
set (F1, F2, F3) = (select F1, F2, F3 from T2).
Причем фичу накопал в книжке для чайников. Абыдно.
Вот я и интерисуюсь - а нету ли какой нибудь фичи для облегчения векторных запросов. Аналитика помогает, но не очень.
ЗЫ. Век живи век учись.
← →
Johnmen © (2008-02-13 09:57) [41]
> А недавно накопал фичу :select * from T2 where (Т1_ИД_1,
> Т1_ИД_2) in (select ИД_1, ИД_2 from T1).
Эта "фича" на порядок медленнее, чем соединение.
Т.е. налицо твой регресс :)
← →
Кщд (2008-02-13 10:30) [42]если так
select /*+ use_nl(t1 t2) no_merge(t2) push_pred(t2) index(t1 pk_t1)*/ t1.*, t2.*
from t1 t1
join
(
select /*+ index(it i_t2$id_t1_id) */it.*
from t2 it
where it.id = (
select it2.id
from t2 it2
where it2.t1_id = it.t1_id
and it2.f5 = (select max(it3.f5)
from t2 it3
where it3.t1_id = it.t1_id
)
and rownum < 2
)
) t2
on t1.id = t2.t1_id
← →
ANB (2008-02-13 11:19) [43]
> Кщд (13.02.08 10:30) [42]
3 обращения к Т2. Мона обойтись двумя.
А вот это :
and it2.f5 = (select max(it3.f5)
не будет толком работать, если есть дубли Ф5.
> Johnmen © (13.02.08 09:57) [41]
Соединение иногда может дать дубли, от которых придется избавляться группировкой, что тоже не шустро.
← →
Johnmen © (2008-02-13 12:22) [44]
> ANB (13.02.08 11:19) [43]
> Соединение иногда может дать дубли,
Что за дубли?
А "фича" дублей не дает?
ЗЫ
У меня такое ощущение, что в изучении SQL ты свернул на какую-то боковую дорожку...:)
И при этом тебе кажется, что она основная.
← →
Кщд (2008-02-13 13:56) [45]>ANB (13.02.08 11:19) [43]
>3 обращения к Т2. Мона обойтись двумя.
обращения не к таблице, но строго к индексу
необходимы для повышения производительности
>А вот это :
>and it2.f5 = (select max(it3.f5)
>не будет толком работать, если есть дубли Ф5.
работать будет, т.к. rownum
могу выложить скрипты на создание таблиц/индексов
у меня при мощности в 45млн на T2 запрос работает 5-10 секунд
← →
ANB (2008-02-13 14:30) [46]
> Кщд (13.02.08 13:56) [45]
Ну и плюс сортировка по 2-м полям не учтена.
Это частное решение. Таким я тоже пользуюсь.
> А "фича" дублей не дает?
Когда это ИН дублил записи ? Его всегда и юзают, чтобы дублей не было
select * from T where ID in (2,2,2,2,2) - вернет всегда одну запись.
← →
Кщд (2008-02-13 14:54) [47]>ANB (13.02.08 14:30) [46]
ответ ориентирован на первоначальную постановку задачи)
включить в него частные случае (типа сортировки и т.п.) легко без существенного ущерба производительности
и, собственно, применим как минимум на MS SQL, Oracle & FB
← →
ANB (2008-02-14 09:08) [48]
> ответ ориентирован на первоначальную постановку задачи)
> включить в него частные случае (типа сортировки и т.п.)
>
как раз частный случай, если сортировка идет по одному полю, легко разруливается агрегатными функциями. Попробуй модифицировать свой запрос, чтобы сортировка шла по 2-м полям.
В оракле через аналитику попроще выходит - всего 2 обращения к таблице и плюс завсегда можно настроить использование индексов. Да и распараллеленному фуллскану не помешает.
← →
Кщд (2008-02-14 09:25) [49]>ANB (13.02.08 09:32) [39]
укажите, пожалуйста, номер Вашего поста в этой ветке, с пояснением про сортировку
видимо, я Вас неверно понял
← →
Кщд (2008-02-14 09:26) [50]>В оракле через аналитику попроще выходит
через аналитику будет гарантированно дольше
← →
ANB (2008-02-14 13:34) [51]
> укажите, пожалуйста, номер Вашего поста в этой ветке, с
> пояснением про сортировку
да мне не лень еще раз написать.
В подчиненной таблице Т2 данные сортируются по ИД_Т1, Ф5, Ф6, Ф7, ИД.
И вот по этому набору полей надо искать последнюю в группе по ИД_Т1.
> через аналитику будет гарантированно дольше
Практически так же как с агрегатными функциями. А если полей сортировки больше одного, то агрегатом вообще задерешься делать.
Страницы: 1 2 вся ветка
Текущий архив: 2008.07.27;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.008 c