Появление buffer sort в oracle 11.2 в select for update


Начиная с 11.2.0.1 появилась новая строка "buffer sort" в планах с for update.
Пример:
DB11G/XTENDER> explain plan for
  2  select *
  3  from t_for_update
  4  where
  5    id=1
  6    and dt between date'2012-01-01'
  7               and date'2012-01-02'
  8  for update;

Explained.
DB11G/XTENDER> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------
Plan hash value: 3273240857
--------------------------------------------------------------------------------------
| Id  | Operation          | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                 |     1 |    11 |     2   (0)| 00:00:01 |
|   1 |  FOR UPDATE        |                 |       |       |            |          |
|   2 |   BUFFER SORT      |                 |       |       |            |          |
|*  3 |    INDEX RANGE SCAN| IX_T_FOR_UPDATE |     1 |    11 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("ID"=1 AND "DT">=TO_DATE(' 2012-01-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "DT"<=TO_DATE(' 2012-01-02 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss'))
О причинах вкратце рассказывается тут. Цитата оттуда:
"buffer sort" is an operation to sort the data in private memory (sort area). However, there isn't any sort operation require in our query. We could understand that Oracle just adopt the mechanism to avoid read data from buffer cache when fetching data. Not only will it decrease the CR number, but also reduce latch requests.
Правда тут кое-что неверно: Джонатан Льюис поясняет, что операция buffer sort в таких случаях не включает сортировок. Вот вывод трассировки 10032 для for update с 32 записями:
---- Sort Statistics ------------------------------
Input records                             32
Output records                            32
Total number of comparisons performed     0
Total amount of memory used               2048
Uses version 1 sort
В 10053 трассировке видно, что стоимостной оптимизатор не анализирует планы без buffer sort'a, поэтому механизм прошит жестко и отключить его можно хинтом /*+ opt_param( 'optimizer_features_enable' '11.1.0.7' ) */
или если так не работает, то optimizer_features_enable('11.1.0.7'). Версию, естественно, ставить можно любую ниже 11.2.0.1

Comments

Отправить комментарий