Каково влияние включения / отключения перемещения строк в Oracle 10g?

мы используем oracle 10G, и одна из таблиц занимает много времени, если мы запрашиваем/удаляем данные. Эта таблица содержит около 10 млн. записей.

недавно мы обнаружили, что ROW_MOVEMENT отключен в этой таблице, мы хотим понять следующее:

  1. какой прирост производительности мы можем получить, если включить ROW_MOVEMENT ?
  2. есть ли минусы включения ROW_MOVEMENT ?
  3. какое движение строки триггера ? Как oracle решает, что ему нужно переместить ряды ?

любая помощь будет высоко ценится.

спасибо заранее !!

3 ответов


движение строки в основном применяется к таблицам раздела. Позволяет перемещать строки по разделам. При отключенном движении строки, которое является значением по умолчанию, вы не можете переместить строку с обновлением:

SQL> CREATE TABLE part_table (ID NUMBER)
  2  PARTITION BY RANGE (ID)
  3     (PARTITION p0 VALUES LESS THAN (1),
  4      PARTITION p1 VALUES LESS THAN (MAXVALUE));

Table created

SQL> INSERT INTO part_table VALUES (0);

1 row inserted

SQL> UPDATE part_table SET ID = 2;

UPDATE part_table SET ID = 2

ORA-14402: updating partition key column would cause a partition change

когда вы разрешаете движение строк, вы можете перемещать строки с обновлением:

SQL> ALTER TABLE part_table ENABLE ROW MOVEMENT;

Table altered

SQL> UPDATE part_table SET ID = 2;

1 row updated

эта функция в большинстве случаев не влияет на производительность: строки хранятся и запрашиваются точно так же, включена ли функция или нет. Однако, когда строка движение включено, строки могут быть физически перемещены (аналогично delete+insert) с помощью ALTER TABLE SHRINK SPACE например. этой в свою очередь, может повлиять на кластерный индекс, который может повлиять на производительность некоторых запросов.

движение строки отключено по умолчанию, потому что это означает, что rowid строки могут измениться, что не является обычным поведением в Oracle.


Также см. http://www.dba-oracle.com/t_callan_oracle_row_movement.htm

движение строки необходимо для следующих операций:

  • перемещение строк между разделами (Секционированные таблицы)
  • Flashback таблиц
  • таблицы сокращения (компакт, каскад, нормальный)

ответ на ваш вопрос: нет повышения производительности, если вы включите движение строк, но вы можете сжать таблицы, которые увеличат вашу производительность для полных запросов таблицы.

ASKTOM также дает очень хороший ответ на ваш вопрос:

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:35203106066718

относительно сокращения (которое требует движения строки):

Я бы предложил бенчмаркинг -- собирать данные о производительности таблицы до и после выполнения операции. Вы ожидали бы полного сканирование для более эффективной работы после ожидаю диапазон индекса сканирование должно быть неизменным или "лучше", поскольку у вас больше строк блок упакован вместе (меньше распространения данных). Вы бы искали это произойдет -- statspack или инструменты, доступные в dbconsole, будут быть полезным для измерения этого (объем работы, выполняемой вашим запросы со временем)


недостатком движения строки является то, что ROWIDS может быть изменен. Поэтому, если у вас есть какие-либо запросы на основе ROWID Они могут возвращать неверные результаты