логические чтения

AlexFF__|
Дата: 20.11.2009 15:51:01
Есть два практически идентичных запроса, отличающихся только условием 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)
+
[latex][/latex]
Elic
Дата: 20.11.2009 16:19:57
AlexFF__|
   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)
Откуда взялось 1734528 чтений, если разница только в типе сканирования одного индекса?
Так понятней? :)
AlexFF__|
Дата: 20.11.2009 16:29:27
Elic
AlexFF__|
   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)
Откуда взялось 1734528 чтений, если разница только в типе сканирования одного индекса?
Так понятней? :)

нет :(
AlexFF__|
Дата: 20.11.2009 16:37:04
я думал, что во фрагменте
  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)
создается два набора данных, которые потом и соединяются в цикле.
Timm
Дата: 20.11.2009 16:37:14
AlexFF__|
Elic
AlexFF__|
   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)
Откуда взялось 1734528 чтений, если разница только в типе сканирования одного индекса?
Так понятней? :)

нет :(

Nested loop выполняет вторую ветку столько раз, сколько вернула строк первая.
AlexFF__|
Дата: 20.11.2009 16:41:15
Timm
AlexFF__|
Elic
AlexFF__|
   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)
Откуда взялось 1734528 чтений, если разница только в типе сканирования одного индекса?
Так понятней? :)

нет :(

Nested loop выполняет вторую ветку столько раз, сколько вернула строк первая.

Соединил с помощью merge, все правильно говорите. Странно, почему у меня сложилось такое неверное впечатление из чтения док. Пора чинить мозги :(