Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Настройка производительности – подсистема хранения






 

Настройка уровня блока данных. Сцепленные строки

 

В некоторых случаях одного блока данных может быть мало для того, чтобы вместить какую-либо строку данных целиком. Например, общий объем строки изначально (т.е. еще при вставке) больше, чем размер блока данных. В этом случае сторока располагается в последовательности или в цепочке блоков (chain of data blocks). Такая строка часто называется «сцепленной» (chained row).

В другом случае строка изначально помещается в блок целиком, но при выполнении обновлений (updates), приводящих к увеличению объема строки (например, при изменении некоторых столбцов типа VARCHAR2), она может исчерпать весь свободный объем внутри блока, зарезервированный через указание ненулевого PCTFREE. В этом случае строка «мигрирует» в блок, где она может поместиться целиком. Если размер строки меньше размера блока, она мигрирует целиком, иначе создается цепочка блоков для строки. При этом ROWID этой строки остается неизменным, в блоке данных, где она находилась до перемещения, остается указатель на блок(и), где лежат данные строки. Это делается для того, чтобы операции индесного чтения (использующие значение ROWID) смогли корректно работать.

Оба этих случая могут привести к снижению скорости выполнения операций ввода/вывода, т.к. приходится сканировать более чем один блок для получения данных одной строки.

Для того, чтобы выявить наличие сцепленных и мигрировавших строк, можно воспользоваться командой ANALYZE с выражением LIST CHAINED ROWS INTO < chained_rows_table >, где < chained_rows_table > - некоторая таблица определенной структуры, в которую заносится информация о каждой сцепленной или мигрировавшей строке. Скрипт %ORACLE_HOME%\RDBMS\ADMIN\utlchain.sql создает подобную таблицу с именем CHAINED_ROWS. Эту таблицу можно использовать для обычных таблиц, где используется тип ROWID для указания логического адреса строки таблицы в БД. Скрипт %ORACLE_HOME%\RDBMS\ADMIN\utlchn1.sql создает подобную таблицу, но для таблиц, организованных по индексу (index-organized tables), где используется тип UROWID.

Например, необходимо собрать статистику по сцепленным и мигрировавшим строкам для некоторой таблицы test1 (если не укfзана фраза INTO < chained_rows_table >, предполагается, что будет использована таблица CHAINED_ROWS):

 

ANALYZE TABLE test1 LIST CHAINED ROWS;

 

Если в таблице CHAINED ROWS содержится более 10% от общего числа строк в таблице, то рекомендуется провести реорганизацию этих строк. Это можно проиллюстрировать следующим примером (выполняется под SYS'ом):

 

--создание тестового табличного пространства

create tablespace test datafile 'D: \oracle\oradata\orcl9\test001.dbf'

size 10m autoextend off

extent management local uniform size 40k

SEGMENT SPACE MANAGEMENT AUTO;

 

--создание тестовой таблицы

SQL> create table test1 (num number(8), name varchar2(256)) tablespace test;

 

Table created.

 

SQL>

--информация о свежесозданной таблице, выделен 1 экстент размеров в 2 блока, всего 16Кб.

SQL> column segment_name format a24

SQL>

SQL> select segment_name, blocks, bytes, extents

2 from dba_segments

3 where segment_name ='TEST1';

 

SEGMENT_NAME BLOCKS BYTES EXTENTS

------------------------ ---------- ---------- ----------

TEST1 5 40960 1

--вставка строк в тестовую таблицу

SQL> declare

2 n number;

3 begin

4 for n in 1..7322 loop

5 insert into test1 values(n, 's '||to_char(n));

6 end loop;

commit;

8 end;

9 /

 

PL/SQL procedure successfully completed.

 

SQL> select count(*) rows_test1 from test1;

 

ROWS_TEST1

----------

 

--объем таблицы увеличился, выделены дополнительные экстенты

SQL> column segment_name format a24

SQL>

SQL> select segment_name, blocks, bytes, extents

2 from dba_segments

3 where segment_name ='TEST1';

 

SEGMENT_NAME BLOCKS BYTES EXTENTS

------------------------ ---------- ---------- ----------

TEST1 20 163840 4

 

этот запрос показывает, сколько блоков реально заняты данными, а не просто зарезервированы

 

1 SELECT SUBSTR(ROWID, 10, 6) insert_test1, count(*) from test1

2* group by ROLLUP(SUBSTR(ROWID, 10, 6))

SQL> /

 

INSERT COUNT(*)

------ ----------

AAAAAM 484

AAAAAN 498

AAAAAO 454

AAAAAP 454

AAAAAQ 454

AAAAAR 455

AAAAAS 454

AAAAAT 454

AAAAAU 454

AAAAAV 454

AAAAAW 454

 

INSERT COUNT(*)

------ ----------

AAAAAX 454

AAAAAZ 437

AAAAAa 454

AAAAAb 454

AAAAAc 454

 

17 rows selected.

 

--16 блоков заняты строками таблицы TEST1.

 

--обновление поля name типа VARCHAR2 с целью явного увеличения размера строки:

 

SQL> update test1 set name =

2 name||'1234567890987654321qwertyuiopasdfghjklzxcvbnm';

 

7322 rows updated.

 

SQL> commit;

 

Commit complete;

 

--как изменился размер таблицы

SQL> select segment_name, blocks, bytes, extents

2 from dba_segments

3 where segment_name ='TEST1'

4 /

 

SEGMENT_NAME BLOCKS BYTES EXTENTS

------------------------ ---------- ---------- ----------

TEST1 110 901120 22

 

--а как изменилось распределение строк по блокам? На первый взгляд, совсем не изменилось.

Но ведь добавлено порядка 90 блоков!!!

 

SQL> SELECT SUBSTR(ROWID, 10, 6) insert_test1, count(*) from test1

2 group by ROLLUP(SUBSTR(ROWID, 10, 6))

3 /

 

INSERT COUNT(*)

------ ----------

AAAAAM 484

AAAAAN 498

AAAAAO 454

AAAAAP 454

AAAAAQ 454

AAAAAR 455

AAAAAS 454

AAAAAT 454

AAAAAU 454

AAAAAV 454

AAAAAW 454

 

INSERT COUNT(*)

------ ----------

AAAAAX 454

AAAAAZ 437

AAAAAa 454

AAAAAb 454

AAAAAc 454

 

17 rows selected.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.