Есть два практически идентичных запроса, отличающихся только условием
LIKE '%что-то%' и
LIKE 'что-то%'. Соответственно разница в планах только
INDEX RANGE SCAN и
INDEX FULL SCAN по поисковому полю.
Первый план
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 2 0.01 0.02 0 0 0 0
Execute 2 0.00 0.00 0 0 0 0
Fetch 2 0.15 0.14 2 15950 0 2
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 6 0.16 0.16 2 15950 0 2
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 43
Rows Row Source Operation
------- ---------------------------------------------------
1 COUNT STOPKEY
1 VIEW
1 SORT UNIQUE STOPKEY
6 NESTED LOOPS
1194 NESTED LOOPS
1194 NESTED LOOPS
398 INDEX RANGE SCAN IDX_N2 (object id 9553)
1194 TABLE ACCESS BY INDEX ROWID TABLE_SUBJECT
1194 INDEX RANGE SCAN IDX_SEARCHNAME (object id 10166)
1194 TABLE ACCESS BY INDEX ROWID TABLE_SUBJECT
1194 INDEX UNIQUE SCAN PK_TAB_SUBJECT (object id 10160)
6 INDEX RANGE SCAN IDX_SUBJECT_P (object id 10170)
И второй
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 2 0.02 0.02 0 8 0 0
Execute 2 0.00 0.00 0 0 0 0
Fetch 2 254.98 420.94 0 1734520 0 4
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 6 255.00 420.96 0 1734528 0 4
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 43
Rows Row Source Operation
------- ---------------------------------------------------
2 COUNT STOPKEY
2 VIEW
2 SORT UNIQUE STOPKEY
10 NESTED LOOPS
1990 NESTED LOOPS
1990 NESTED LOOPS
398 INDEX RANGE SCAN IDX_N2 (object id 9553)
1990 TABLE ACCESS BY INDEX ROWID TABLE_SUBJECT
1990 INDEX FULL SCAN IDX_SEARCHNAME (object id 10166)
1990 TABLE ACCESS BY INDEX ROWID TABLE_SUBJECT
1990 INDEX UNIQUE SCAN PK_TAB_SUBJECT (object id 10160)
10 INDEX RANGE SCAN IDX_SUBJECT_P (object id 10170)
Откуда взялось
1734528 чтений, если разница только в типе сканирования одного индекса?
Индекс по полю varchar2(50), статистика есть, записей немного: около 200.000
Для проверки, слегка изменив запрос, убрал первое сканирование индекса
IDX_N2. Как видно, полный просмотр индекса выполняется достаточно быстро. Не могу понять, в какую сторону стоит смотреть ((
3 запрос
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 2 0.02 0.01 0 0 0 0
Execute 2 0.00 0.00 0 0 0 0
Fetch 2 0.26 0.45 0 2660 0 4
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 6 0.28 0.47 0 2660 0 4
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 43
Rows Row Source Operation
------- ---------------------------------------------------
2 COUNT STOPKEY
2 VIEW
2 SORT UNIQUE STOPKEY
10 NESTED LOOPS
5 NESTED LOOPS
5 TABLE ACCESS BY INDEX ROWID TABLE_SUBJECT
5 INDEX FULL SCAN IDX_SEARCHNAME (object id 91226)
5 TABLE ACCESS BY INDEX ROWID TABLE_SUBJECT
5 INDEX UNIQUE SCAN PK_TAB_SUBJECT (object id 10160)
10 INDEX RANGE SCAN IDX_SUBJECT_P (object id 10170)