Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 как заставить Oracle использовать индекс  [new]
with as
Guest
---create view v_tab as 
with t1 as (--десятки миллионов записей
select --+ HINT - ????????????? inline не помогает
       tab1.id, ................,
       row_number() over (.............) as RN
from tab1
join tab2 on tab1.partition = tab2.partition and tab1.id1 = tab2.id1
join tab3 on tab3.partition = tab2.partition and tab3.id1 = tab2.id1
 where 1 = 1
   ----and tab1.id = 1234656789 ---- !!!!!!!!!!!!!! 20 записей - 0,1 сек INDEX SCAN tab1
           ), --t1
     t2 as (
select *
from (     
select id,..................... from t1
 union all
select id,..................... from t1 where RN = 1 
      )
where id is NOT NULL      
), -- t2           
     t3 as (select id, COUNT(*) from t1
             group by id
            
            )
select --+ HINT - ?????????????
        * 
from t3
 where 1 = 1
   ----and t3.id = 1234656789 ---- !!!!!!!!!!!!!! 400 сек FULL SCAN t1 materialize t1

;            
1 ноя 13, 06:57    [15062258]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
with as
Guest
Оштбка
---create view v_tab as 
with t1 as (--десятки миллионов записей
select --+ HINT - ????????????? inline не помогает
       t1.id, tab2.id as id_2, ................,
       row_number() over (............. order by tab2.id) as RN
from tab1
left join tab2 on tab1.partition = tab2.partition and tab1.id1 = tab2.id1
left join tab3 on tab3.partition = tab2.partition and tab3.id1 = tab2.id1
 where 1 = 1
   ----and tab1.id = 1234656789 ---- !!!!!!!!!!!!!! 20 записей - 0,1 сек INDEX SCAN tab1
           ), --t1
     t2 as (
select *
from (     
select id,id_2,..................... from t1
 union all
select id,id_2,..................... from t1 where RN = 1 
      )
where id_2 is NOT NULL      
), -- t2           
     t3 as (select id, COUNT(*) from t2------:)))))))))))))
             group by id
            
            )
select --+ HINT - ?????????????
        * 
from t3
 where 1 = 1
   ----and t3.id = 1234656789 ---- !!!!!!!!!!!!!! 400 сек FULL SCAN t1 materialize t1

;            
1 ноя 13, 07:17    [15062270]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
Elic
Member

Откуда:
Сообщений: 29991
Так
1 ноя 13, 08:54    [15062402]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
Elic. моё почтение (не хотел писать) заставило
Выручай, можно функцтию с параметром - это не то))))))))))))))
1 ноя 13, 11:09    [15063048]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
Elic, выручи
Я тебя понял, тут не то

Запрос нужен как штучно, так и читай выше create.. as ............
1 ноя 13, 13:02    [15064194]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
Да, о версии
11,2
1 ноя 13, 13:46    [15064645]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
Ну И, выручайте специалисты, я сломался
P.s. SY. ну ты то не молчи
Мне просто понравился у вас пост, когда хинт посоветовали (+ rule),хотя даже Т.К. не советует))))
1 ноя 13, 15:24    [15065628]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
Elic
Member

Откуда:
Сообщений: 29991
Да прибаньте же это недоразумение.
1 ноя 13, 15:29    [15065695]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
От тебя (Elic) я такого не ожидал
Повторюсь, пишу сюда редко
Сам не могу решить МОЮ проблему
P.S. Tебе что, выложить скрипт по созданию tab1 и т.д.
Я спрашивал - как индекс подпихнуть

P.S2. Тебя я всегда уважал, но теперь.................................................
Может быть "некий ALL". и прав был ?
1 ноя 13, 15:46    [15065858]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Elic,

да ладно, у человека горе.

OnTopic: Ограничение по t3.id никак не влияет на вычисление RN в t1, а по сему нужен fullscan - поэтому от индекса толку не будет.

для TC - перепишите запрос так, чтобы он был эквивалентен тому где 20 записей.
1 ноя 13, 15:49    [15065875]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
Вопрос к Сергей Арсеньев, КАК? Там Union есть, пробовал t1 в представление пихнуть, тот же результат
1 ноя 13, 15:58    [15065928]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
yura1973,
oracle+push_pred+аналитика
1 ноя 13, 16:00    [15065946]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
Сергей Арсенье
И кстати, это не горе, просто стало интересно,спросил совета на ФОРУМЕ, и тут такое бл................., про быдло я уже писал
(жаль его, уважал раньше)
P.S. SY забань, не интересно (форум стал подсказкой для студентов)
А ответ Я так и не получил
1 ноя 13, 16:08    [15065987]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
ten
спасибо, а куда хинт пихнуть?
1 ноя 13, 16:11    [15066005]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
123йй
Member

Откуда:
Сообщений: 1639
yura1973,

прежде чем обижаться - научитесь правильно задавать вопросы. О чем вам намекнул Elic
какие индексы по таблицам ?
какое распределение ?
ну и план.
1 ноя 13, 16:16    [15066030]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
ten,
направь хотя бы, остались ещё люди (Элик, жаль что ВЫ быдлом стали, я последний кто мог это сказать, но я это сделал)
1 ноя 13, 16:17    [15066033]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
yura1973,

Еще раз поясняю - ни t2 ни t3 никак не влияют на вычисление RN в t1.
Проброс ограничения на id внутрь него может вызвать изменение результата.

P.S. адрес по которому послал в первый раз Elic намекает, что для постороннего человека вопрос выглядит бредом в силу недостаточных исходных данных (каждый человек предполагает, что-то само собой разумеющимся, но не понятным остальным) или несвязности изложения (по тем же причинам). Он предложил сначала сформулировать задачу (например надо подсчитать то-то и то-то при условии, что ...). А потом уже переходить к методам решения.
Вместо этого получил набор фраз, про функцтию с параметром, create as и версию 11,2.

P.P.S. Вполне может оказаться, что функция это как раз то.
1 ноя 13, 16:17    [15066034]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
Сергей Арсеньев
Вы правы
Но, все показал, планы выложил, все расписал - оракла под рукой нет, t1 запихивал в представление, не помогает - обратите внимание на мои комментарии, и прочитайте тему ТОПИКА СПАСИБО
1 ноя 13, 16:26    [15066088]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
Десятки миллионов записей
Guest
Кому это ты t1 запихивал в представление-то?
1 ноя 13, 16:33    [15066132]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
yura1973,
Еще раз: протолкнуть предикат внутрь представления t1 нельзя, т.к. используется row_number. Заставить Oracle использовать какой-либо индекс (только какой, пока ни одного индекса не указано?), конечно, можно, но вот результаты этой "оптимизации" Вас явно не обрадуют.
1 ноя 13, 16:37    [15066159]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
Спасибо за помощь, думал хоть здесь помогут, придется самому)))))))))))
И обратился только
1 ноя 13, 16:38    [15066167]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
ten
пока ни одного индекса не указано?

Нет, в принципе можно догадаться, что индекс (уникальный?) по tab1.id. Но это абсолютно ничего не меняет.
1 ноя 13, 16:39    [15066173]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
yura1973
Member [заблокирован]

Откуда:
Сообщений: 60
вот и вопрос
куда его пихать - я всё пробовал, ОН(Oracle) не хочет, я бы не писал
1 ноя 13, 16:51    [15066240]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
yura1973
куда его пихать - я всё пробовал, ОН(Oracle) не хочет, я бы не писал

Т.е. Ваша задача как можно сильнее замедлить выполнение запроса ?
1 ноя 13, 17:11    [15066343]     Ответить | Цитировать Сообщить модератору
 Re: как заставить Oracle использовать индекс  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
ten
Нет, в принципе можно догадаться, что индекс (уникальный?) по tab1.id. Но это абсолютно ничего не меняет.

Тут надо догадываться о том, есть ли tab1.id в partition by

Если есть и запросы идут по небольшому количеству tab1.id, то можно помедитировать на тему:
create function f(pID1 in number) return number is
 r number;
 begin
  select sum(case when RN=1 then 2 else 1 end) into r
    from (
      select row_number() over (.............)  as RN
        from tab2
        left outer join tab3 on tab3.partition = tab2.partition and tab3.id1 = tab2.id1
      where tab2.id1=pID1
    )
  return r;
 end;

 select id, f(id1) from tab1
   where id = 1234656789;
1 ноя 13, 17:41    [15066516]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Oracle Ответить