5 мая 2008 г.

Максимальное значение db_file_multiblock_read_count

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

Он используется стоимостным оптимизатором (Cost-based Optimizer) для вычисления суммарного кол-ва операций чтения для полного просмотра таблицы (full table scan).

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

Самый лёгкий способ узнать максимальный размер db_file_multiblock_read_count - это присвоить этому параметру очень большое значение и он скорректируется до максимально возможного размера:

SQL> select name, value from v$parameter
2 where name = 'db_file_multiblock_read_count';

NAME VALUE
------------------------------ ----------
db_file_multiblock_read_count 8

SQL> alter session set db_file_multiblock_read_count=100000000;

System altered

SQL>
SQL> select name, value from v$parameter
2 where name = 'db_file_multiblock_read_count';

NAME VALUE
------------------------------ ----------
db_file_multiblock_read_count
128

Этот запрос был выполнен на Oracle 9.2.0.8, размер блока БД - 8K, Solaris 5.9.
Максимальное значение этого параметра зависит от внутреннего параметра (константы) SSTIOMAX, который зависит от версии Oracle и размера блока базы данных. Это вырезка из Металинка Note:131530.1:
What is SSTIOMAX?
-----------------

SSTIOMAX is an internal parameter/constant used by oracle, which limits the
maximum amount of data transfer in a single IO of a read or write operation.
This parameter is fixed and cannot be tuned/changed.


Relationship between SSTIOMAX and db_file_multiblock_read_count (MBRC)
----------------------------------------------------------------------

More often than not, DBAs try to increase the db_file_multiblock_read_count
parameter (which can be set in the init.ora), in an attempt to optimize the
IO performance of the read and write operations.

Normally, with a higher value of MBRC, the IO performance is expected to be
better. So, users tend to increase this parameter to a higher value, in case
they find it beneficial. But, there is a limitation on this.

The limitation is, the product of db_block_size and MBRC cannot exceed the
SSTIOMAX. For example:

db_block_size * db_file_multiblock_read_count <= SSTIOMAX (which is predefined for a particular version of oracle) If the value of the product exceeds this, then the value of db_file_multiblock_read_count set in the init.ora is ignored and it is set as follows: db_file_multiblock_read_count = SSTIOMAX/db_block_size (rounded)

В Oracle 9i SSTIOMAX = 1M, то есть если
размер блока БД 16K, то максимальный размер db_file_multiblock_read_count = 1M / 16K = 64;
размер блока БД 8K, то максимальный размер db_file_multiblock_read_count = 1M / 8K = 128;
размер блока БД 4K, то максимальный размер db_file_multiblock_read_count = 1M / 4K = 256;

Для сравнения, в Oracle 7.3 SSTIOMAX был равен 128K.