Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];

Вниз

Векторные запросы. Оракл и все остальные СУБД   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.009 c
2-1214667019
NewQuestion
2008-06-28 19:30
2008.07.27
Разделитель целой и дробной части в денежной единице.


2-1213986979
Kaer
2008-06-20 22:36
2008.07.27
Парамерт функции


15-1213034385
cosinus
2008-06-09 21:59
2008.07.27
Подскажите идею по реализации задачи.


3-1202816869
Kuibida
2008-02-12 14:47
2008.07.27
Что за база такая (форматы файлов *.d и *.i) ?


15-1213172370
vajo
2008-06-11 12:19
2008.07.27
Почему-то перегружается компьютер при страте Виндовс ХР





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский