6 мая 2008 г.

Одноблочное и многоблочное чтения
(single-block & multi-block read)

Если при полном просмотре таблицы (full table scan) выполняется многоблочное чтение, то это положительно влияет на производительность. То есть, за одну операцию ввода/вывода читается несколько блоков, и вся таблица будет прочитана с файла в буферный кэш за минимальное количество операций ввода/вывода.

Кол-во блоков, которое будет прочитано из файла в буферный кэш за одну системную операцию ввода/вывода устанавливается параметром db_file_multiblock_read_count. В OLTP системах он обычно равен от 8 до 16, а в OLAP системах от 32 и выше. На большинстве платформ значение db_file_multiblock_read_count может быть равен максимум 128, об это написано в предыдущей теме.

С помощью представления v$filestat можно посмотреть статистику по количеству одноблочных и многоблочных чтений. Описание полей из документации (только те, что интересуют нас и относятся к чтению):

FILE# Number of the file
PHYRDS Number of physical reads done
PHYBLKRD Number of physical blocks read
SINGLEBLKRDS Number of single block reads
В списке полей нет поля о кол-ве многоблочных чтений, но его мы можем получить отняв SINGLEBLKRDS (так как, за одну операцию одноблочного чтения читается один блок) от суммарного количества физических чтений PHYRDS:
MULTIRDS = PHYRDS-SINGLEBLKRDS
А кол-во блоков прочитанных в режиме многоблочного чтения можно получить отняв SINGLEBLKRDS от суммарного кол-ва прочитанных блоков PHYBLKRD:
MULTIBLKRDS = PHYBLKRD-SINGLEBLKRDS

Еще один важный параметр, который можно получить - это среднее количество блоков прочитанных в многоблочном чтении. Если этот параметр близок к db_file_multiblock_read_count, то это хорошо. Это значит, что при многоблочном чтении из файла в буферный кэш, за минимальное количество операций ввода/вывода, читается максимальное количество блоков.
BLKSMULTIBLKRDS = MULTIBLKRDS/MULTIRDS

Скрипт:
select round(SINGLEBLKRDS/PHYBLKRD,2) SINGLEBLKRDS_PCT,
round((PHYBLKRD-SINGLEBLKRDS)/PHYBLKRD,2) MULTIBLKRDS_PCT,
round((PHYBLKRD-SINGLEBLKRDS)/(PHYRDS-SINGLEBLKRDS),2) BLKSMULTIBLKRDS,
k.tablespace_name
from v$filestat t, dba_data_files k
where t.file#=k.file_id
order by 1

Здесь приблизительный результат:
SINGLEBLKRDS_PCT MULTIBLKRDS_PCT BLKSMULTIBLKRDS TABLESPACE_NAME
0 1 7,74 CCCTBS
0 1 7,83 CCCTBS
0 1 7,88 CCCTBS
0 1 15,73 USERS
0,01 0,99 7,88 CCCTBS
0,01 0,99 14,65 DDDDTBS
0,02 0,98 11,82 DATA_MED
0,03 0,97 11,73 DATA_MED
0,05 0,95 13,54 AAA_BBB
0,07 0,93 1,03 EEEETBS
0,26 0,74 14,49 DATA_SML
0,3 0,7 10,32 GGGDATA
0,31 0,69 9,35 SYSTEM
0,49 0,51 11,32 DATA_BIG
0,5 0,5 11,41 DATA_BIG
0,52 0,48 10 DATA_BIG
0,52 0,48 11,47 DATA_BIG
0,53 0,47 10,21 DATA_BIG
0,68 0,32 14,52 DATA_BIG
0,91 0,09 14,68 DATA_BIG_IX
0,91 0,09 15,28 DATA_BIG_IX
0,92 0,08 1 UNDO
0,92 0,08 14,81 DATA_BIG_IX
0,92 0,08 15,08 DATA_BIG_IX
0,93 0,07 15,32 DATA_BIG_IX
0,98 0,02 1 AAA_BBB_IX
0,99 0,01 1,65 FFFFTBS
1 0 1 DATA_SML_IX
1 0 1 DATA_MED_IX
Как показывает отчет, в табличных пространствах, где хранятся индексы (_IX) почти нет (или очень низкий процент) многоблочного чтения, думаю это из-за того, что в них нет таблиц, соответсвенно не бывает полных просмотров таблиц (table full scan) и очень низок процент fast full index scan.