Допустим, у нас есть таблица с 6 миллионами записей.
CREATE TABLE MYTABLE
(
KEY1 NUMBER(15),
ANALYSENO NUMBER(15),
ADDRESSNO NUMBER(15),
ABC NUMBER(3),
ABCDETAIL CLOB
)
И у меня есть два запроса.
первый:
Select m.*,
CASE WHEN dbms_lob.INSTR(m.ABCDETAIL,'ABC$$') = 0 THEN '' ELSE
dbms_lob.SUBSTR(m.ABCDETAIL,dbms_lob.INSTR(m.ABCDETAIL,'##AAA')-dbms_lob.INSTR(m.ABCDETAIL,'ABC$$')-10,dbms_lob.INSTR(m.ABCDETAIL,'ABC')+10) END) as SOMECALC
from MYTABLE m
where m.ABC = 1
and ROWNUM < 1000
and CASE WHEN dbms_lob.INSTR(m.ABCDETAIL,'ABC$$') = 0 THEN '' ELSE
dbms_lob.SUBSTR(m.ABCDETAIL,dbms_lob.INSTR(m.ABCDETAIL,'##AAA')-dbms_lob.INSTR(m.ABCDETAIL,'ABC$$')-10,dbms_lob.INSTR(m.ABCDETAIL,'ABC')+10) END like '%AAA%';
второй:
Select a.* from
(Select m.*,
CASE WHEN dbms_lob.INSTR(m.ABCDETAIL,'ABC$$') = 0 THEN '' ELSE
dbms_lob.SUBSTR(m.ABCDETAIL,dbms_lob.INSTR(m.ABCDETAIL,'##AAA')-dbms_lob.INSTR(m.ABCDETAIL,'ABC$$')-10,dbms_lob.INSTR(m.ABCDETAIL,'ABC')+10) END as SOMECALC
from MYTABLE m
where m.ABC = 1
and ROWNUM < 1000) a
where a.SOMECALC like '%AAA%';
Единственное отличие состоит в том, что во втором запросе функции расчета не используются в операторе where. И будьте осторожны, я использую оператор ROWNUM ‹ 1000 для запроса where.
Итак, вопросы следующие
1- есть ли разница между двумя запросами?
2- можем ли мы сказать, что оператор ROWNUM ‹ 1000 вычисляется последним при выполнении всех операторов?
3- использование некоторых функций (длина, случай, когда, instr и т. д.) лениво оценивается?