table.name индексировано? если нет, нормуль, сойдет. если да, прощай индексный доступ, но можно пойти чуть другим путем:
| Код | select * from table where table.name = :param union all select * from table where :param is null
|
возможность использования индекса при определенном значении параметра - сохраняется приведу пример 1) DDL
| Цитата | SQL> create table test(val ) as select level from dual connect by level < 10000;
Table created.
SQL> create index test$val$idx on test(val);
Index created. SQL> variable param number; SQL> execute :param := 1
PL/SQL procedure successfully completed. SQL> set autotrace traceonly explain statistics
|
2) Оба варианта запроса выполняю вхолостую, чтоб поттянулись кэши, произошел парсинг, не влияло на статистику
3)Ваш вариант запроса
| Цитата | SQL> select * from test where val = :param or :param is null;
Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=595 Bytes=7 735)
1 0 TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=7 Card=595 Byt es=7735)
Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 20 consistent gets 0 physical reads 0 redo size 345 bytes sent via SQL*Net to client 431 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
|
Мы видим в плане фуллскан и видим 20 согласованных чтений 4) мой вариант запроса
| Цитата | SQL> select * from test where val = :param union all select * from test where :param is null;
Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=10099 Bytes =131287)
1 0 UNION-ALL 2 1 INDEX (RANGE SCAN) OF 'TEST$VAL$IDX' (INDEX) (Cost=1 Car d=100 Bytes=1300)
3 1 FILTER 4 3 TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=7 Card=999 9 Bytes=129987)
Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 345 bytes sent via SQL*Net to client 431 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
|
Здесь мы тоже видим фуллскан в плане, но количество чтений всего три, что дает основания полагать, что хоть фуллскан и есть в плане, на практике эта ветка плана не выполняется. |