Вот фон:
Версия:
Oracle 8i (не ненавидите меня за то, что я устарел. Мы обновляем!)
SQL> describe idcpdata
Name Null? Type
----------------------------------------- -------- ---------------------------
ID NOT NULL NUMBER(9)
DAY NOT NULL DATE
STONE NUMBER(9,3)
SIMPSON NUMBER(9,3)
OXYCHEM NUMBER(9,3)
PRAXAIR NUMBER(9,3)
Вот запрос, который сразу возвращается:
SQL> select to_char(trunc(day,'HH'),'DD-MON-YYYY HH24') day,
2 avg(decode(stone,-9999,null,stone)) stone,
3 avg(decode(simpson,-9999,null,simpson)) simpson,
4 avg(decode(oxychem,-9999,null,oxychem)) oxychem,
5 avg(decode(praxair,-9999,null,praxair)) praxair
6 from IDcpdata
7 where day between
8 to_date('14-jun-2009 0','dd-mon-yyyy hh24') and
9 to_date('14-jun-2009 13','dd-mon-yyyy hh24')
10 group by trunc(day,'HH');
Когда я создаю представление на основе этого запроса, только без предложения where, запрос к этому представлению с предложением where не может использовать представление. Существует высокоселективный индекс, который используется в версии прямого SQL-запроса. Полное сканирование таблицы занимает 20 минут.
create or replace view theview as
select TRUNC(day,'HH') day,
avg(decode(stone,-9999,null,stone)) stone,
avg(decode(simpson,-9999,null,simpson)) simpson,
avg(decode(oxychem,-9999,null,oxychem)) oxychem,
avg(decode(praxair,-9999,null,praxair)) praxair
from IDcpdata group by TRUNC(day,'HH');
SQL> select * from theview
2 where day between
3 to_date('14-jun-2009 0','dd-mon-yyyy hh24') and
4 to_date('14-jun-2009 13','dd-mon-yyyy hh24');
Я попробовал подсказки INDEX () в представлении, запросе и в обоих случаях. Я попробовал глобальную подсказку INDEX, указав полное имя базовой таблицы. Я также попробовал MERGE.
Мне кажется, что Oracle должен иметь возможность использовать индекс, как это делает встроенный SQL. Я просто не могу понять, как заставить это. Я уверен, что это я, а не Оракул, я просто не вижу этого.
Заранее спасибо за любые предложения!