9 июня 2011 г.

oracle: Full Table Scans

http://aguppi.blogspot.com/2011/06/oracle-access-path.html
  • Читает все строки таблицы ниже HWM .
  • Оптимален для получения большого количества данных из таблицы.
  • Блоки читаются последовательно, поэтому можно настроить I/O, чтобы за раз считывалось несколько блоков. Настраиваем параметр инициализации DB_FILE_MULTIBLOCK_READ_COUNT.
  • Каждый блок читается только один раз.
  • Если есть условия, то запрос отбрасывает строки не попадающие под условия.
Когда оптимизатор использует Full Table Scans

  • Отсутствие индекса, когда нет подходящего для запроса индекса.
  • Большое кол-во данных, когда оптимизатор предполагает, что запрос вернёт большинство строк таблицы.
  • Маленькая таблица, если дешевле прочитать всю таблицу, чем использовать индекс.
  • High Degree of Parallelism. A high degree of parallelism for a table skews the optimizer toward full table scans over range scans. Examine the DEGREE column in ALL_TABLES for the table to determine the degree of parallelism.
Hints
Чтобы принудительно использовать Full Table Scans используются хинты.
/*+ FULL(tab_name) */

SELECT /*+ FULL(e) */ employee_id, last_name
  FROM employees e
  WHERE last_name LIKE :b1;