DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Дополнительные советы и ресурсы


В этом приложении предлагаются рекомендации, помогающие улучшить производительность некоторых задач, которые приходится регулярно выпол­нять АБД. Рассматриваются советы по настройке утилит Oracle 

ехру imp 

и 

SQI* Loader. 

Кроме того, дается пример файла инициализации Oracle (init.ora) на основе релевантных (относящиеся к рассматриваемому вопросу) параметров, упоминающихся в книге, которые собраны в функциональные группы, а также для справочных целей организуется единый файл. И последнее по порядку, но не по степени значимости, представлен раздел, из которого можно брать допол­нительную информацию для дальнейшей помощи в ваших трудах по настройке.
Настройка утилиты Export
До появления Oracle 7.3 было всего несколько возможностей для настройки производительности утилиты экспорта. Одна из них — использование большего размера параметра buffer для выборки нескольких строк в память и записи их в экспортируемый файл дампа. Другая — создание для утилиты экспорта исполни­мого модуля single-task, который задействует меньше ресурсов.
В Oracle 7.3 значительное улучшение производительности было достигнуто благодаря применению нового параметра — 

direct. 

Прямой экспорт минует Orac­le SGA и выполняет запись непосредственно в экспортируемый файл дампа. Этот параметр необходимо задать явно, т. к. его значение по умолчанию равно п (что означает отсутствие прямого экспорта). Чтобы иметь возможность прово­дить экспорт в прямом режиме, задайте
Другой параметр,        можно использовать в соединении со стандарт-
ным (в этом случае применяется Oracle SGA) или прямым путем экспорта. Зна­чение по умолчанию для этого параметра равно размеру буфера операционной системы 

{bufsiz)m 

зависит от платформы. Установка 

recordlength 

равным или кратным размеру блока базы данных помогает увеличить производительность экспорта.
В приводимой ниже таблице суммируются результаты наших тестов, для то­го чтобы показать, как эти параметры влияют на производительность. Тесты проводились для базы данных Oracle 8.1.7, эксплуатирующейся на сервере с ОС АГХ 4.3.3. Других пользователей у сервера не было, и база данных стартовала за­ново перед проведением каждого теста. Все приводимые времена являются средними по итогам трех тестов с применением каждого параметра. Для полу­чения значений времени использовалась команда Экспорту подвергались .4 952 153 строки таблицы.

Использовавшиеся параметры

Стандартный (без каких-либо ■ параметров)
recordlength- 16384

buffer=1048576
buffer=1048576 recordlength=16384 buffer= 1048576 recordlength=65535
direct=y
direct=y recordlength=16384 direct=y recordlength=65535 recordlength установлен равным значению DB_BLOCK_SIZE
recordlength принимается равным своему значению по умолчанию
recordlength устанавливается равным DB_BLOCK_SIZE.
recordlength устанавливается равным максимальному значению для платформы
recordlength принимается равным своему значению по умолчанию
recordlength устанавливается равным
значению DB_BLOCK_SIZE
Настройка утилиты Import
У АБД имеется довольно мало параметров, пригодных для настройки произ­водительности утилиты импорта. Мы полагаем, что таблицы всегда создаются с подходящей фразой storage, прежде чем в них будут импортироваться данные. При таком поведении мы получаем полный контроль над размерами и размеще­нием экстентов. Если это необходимо, распределите экстенты предварительно, чтобы минимизировать динамическое выделение экстентов во время процесса импорта. Импортируя данные, не забудьте использовать параметр 

ignore:

что­бы проигнорировать любые ошибки при создании таблицы, связанные с суще­ствованием таблицы.
Рассмотрим использование установки 

commit=y 

при импорте данных. Oracle будет выдавать команду 

commit 

после каждой вставки массива. Это уменьшит ве­роятность бесконтрольного роста размера сегментов отката. Если используется
значение по умолчанию 

(commit 

и). Oracle не станет фиксировать данные (вы-
полнять операцию commit), пока не будут импортированы (вставлены) все
строки таблицы. Обратная сторона медали для установки 

(commii=y\ 

заключается
в том, что если операция импорта заканчивается        придется либо обре-
зать таблицу, либо вовсе вычеркнуть ее, прежде чем начнется рестарт процесса
импорта, так как Oracle не откатывает зафиксированные данные таблицы.
Не импортируйте индексы вместе с данными. Установите во время процесса
импорта 

inde.xes=n 

(значение по умолчанию \mport---y

Можно создать все индек-
сы после того, как будут импортированы данные. Это обеспечит намного луч-
ший контроль над производительностью построения индексов за счет
корректировки параметров        и
благодаря использованию соответственно сконфигурированной памяти для
временного табличного пространства и локально управляемого табличного
пространства. Можно также для еще большего ускорения течения процесса рас-
смотреть вопрос о        создания индексов и применении атрибутов

nobgging 

или 

unrecoverable.

Приходилось ли вам когда-нибудь слышать, чтобы пользователи жаловались
на низкую производительность после того, как была проделана работа по реор-
ганизации таблицы в течение длинных выходных? Если ответ утвердительный,
то виной всему является установка по умолчанию 

statistics=estimate 

(в Огас1е7) или
(в        Эти параметры оценивают статистику для импортируемых
объектов. Следует в зависимости от используемой версии Oracle использовать
или        Это не только избавит всех от привычного хаоса по
утрам в понедельник, но и повысит производительность импорта. Помните, что надо анализировать импортированные объекты, используя обычные проце­дуры после того, как будет успешно завершен импорт.
Следует также рассмотреть вариант с увеличением значения по умолчанию
параметра 

buffer. 

Он вычисляется по формуле (число_строк_вставляемого_мас-
сива х        Если на сервере имеется достаточное количество свобод-
ной памяти, рассмотрите вопрос о назначении части этой памяти параметру 

buffer. 

В нашем тестировании импорта параметр 

buffer 

обеспечивает (до извест­ного предела) значительное увеличение производительности.
В приводимой ниже таблице подводятся итоги тестирования, показываю­щие, как данные параметры влияют на производительность импорта. Тесты проводились для базы данных Oracle 8.1.7, работающей на сервере АГХ 4.3.3. На сервере не было других пользователей, а база данных заново стартовала пе­ред каждым тестом. Все приведенные значения времени определялись как сред­нее для трех прогонов теста с использованием каждой опции. Для сбора значений времени была использована команда timex. Таблица, в которую вы­полнялся импорт, содержала 4 952 153 строки. Средний размер строки был ра­вен 65 байт.

Используемые параметры
Затраченное время Замечания
в сек.

commit=y indexes=n ignore y
commit=y indexes=n ignore=y buffer= 1043576
commit=y indexes=n ignore=y buffer=5242880
commit=y indexes=n ignore=y buffer=10485760
594,88 312,96

289,55

288,12

В массиве вставки примерно 16131 строка
В массиве вставки примерно 80860 строк
В массиве вставки примерно 161320 строк 1

Как можно видеть, увеличение значения параметра 

buffer 

сверх 

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

buffer, 

нам удалось сократить время выпол­нения импорта почти вдвое по сравнению с аналогичным временем, когда 

buffer 

не использовался. Кроме того, установлено, что использование параметра 

recordlength 

не улучшает производительности (по крайней мере, сколько-нибудь существенно).

Настройка утилиты SQL'Loader
Oracle предлагает два метода загрузки данных в таблицы с использованием утилиты SQL*Loader. Один из них называется 

традиционным 

методом, второй — 

прямым. 

При традиционном методе Oracle подготавливает данные в 

массиве 

свя­зи для их вставки с применением обычного оператора 

insert 

(DML). Этот метод поддерживает функции SQL для форматирования данных (или массажа) во время процесса загрузки данных.
При использовании прямого метода Oracle подготавливает данные в струк­туре массива столбцов для вставки и форматирования в блоки данных, которые напрямую будут записываться в файлы данных. Прямой метод не использует
SGA и всегда вставляет данные выше максимальной отметки таблицы. Однако этим методом нельзя воспользоваться при загрузке данных некоторых типов данных, например LOB, BLOBS, вложенных таблиц и т. п.
Прямой метод выбирается, если параметр 

direct 

принимает значение TRUE.
Параметр 

raws 

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

unrecoverable 

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

(unusable), 

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

rows. 

Oracle использует для определения объема памяти, который необходимо выделить для массива связи, значения 

rows 

и 

bind/size. 

Каждая операция вставки добавляет в таблицу столько записей, сколько их в массиве связи 

(bind array). 

Другой параметр, 

readsize, 

введенный в Oracle 8.0.5, управляет размером буфера чтения, который используется для заполнения таблицы данными, прочитанны­ми из входного файла.
51084 bytes (2 rows)
24063 30 1999 1999
В следующем примере пока ыно несколько последних строк из файла прото­кола SQJL*Loaderc различными значениями 

bindsize и readsize. 

Сложность с этими двумя параметрами заключается в том, что если один из них принимает значе­ние, не совпадающее со значением по умолчанию, Oracle присваивает другому такое же значение. В наших тестах мы дали возможность утилите вычислять значение ROWS на основании значения bindsize и размера одной строки. Параметрам 

bindsize 

и 

readsize были 

оставлены их значения по умолча­нию (65535 байт):
Space allocated for bind array: Total logical records read: Total logical records rejected: Run began on Wed Nov 10 18:30:22 Run ended on Wed Nov 10 18:37:18

Elapsed time was:        00:06:56.51
CPU time was:        00:01:34.72
1047222 bytes (41   rows)
24063 30 1999 1999
Когда 

bindsize и readsize 

был и сделаны равными 1048576 байт (1 Мбайт), полу­чилось следующее:
О   Space allocated for bind  array: Total logical records read: Total logical records rejected: Run began on Thu Nov 11 00:02:23 Run ended on Thu Nov 11 00:05:06
Elapsed time was: 00:02:42/25
CPU time was:        00:01:14.59
Заметили ли вы разницу между затраченным временем и числом строк в мас-
сиве связи в этих примерах? Очевидно, что значения, назначаемые параметрам 

bindsize, read-size 

и 

rows, 

могут заметно влиять на производительность загрузки. Этот тест был выполнен, когда мы исследовали (и изучали) методики улучше­ния производительности SQL? Loader в 1999 г.
Подробное объяснение упомянутых выше параметров, а также методы вычис­лений подходящих для них значений можно найти в статье Стефана Андерта (Stephen Andert. 

SQBLoader:A Case Study in Tuning) 

по адресу http://oracle.oreilly. com/news/oradesq!load_040J.html. Стефан Аидерт был техническим рецензен­том книги Джонатана Дженника и Саньяя Мишры, опубликованной издательст­вом O'Reilly & Associates (Jonathan Gennick, Sanjay Mishra. 

Oracle SQBLoader: The Definitive Guide). 

Мы отсылаем вас к этой книге для тщательного разбора воз­можностей утилиты SQIfLoadei и способов увеличения ее производительности.

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

толъкп в справочных иша 

и 

не могут быть 

использованы в реальной жизни в том виде, как они представлены, без тщательного мониторинга и тестирования ва­шей системы.
В данном листинге конфигурированы параметры        неско-
лько        и        He рекомендуется использовать их
все одновременно. Описание любого параметра есть в книге "Справочное руко­водство по Oracle". Для этой же цели можно задать запрос к представлению V$PARAMETER и изучить столбец выходных данных Description.
# initMYDB.ora
Modification History

Name
Kirti Gaja

Date
04/16/2001 04/17/2001

Action

Created the file
Cleaned up,  added some parameters

Parameters to optimize the Database Buffer Cache and I/O db_block_buffers = 10000
buffer_pool_keep =   (buffers:500,  lru_latcb.es: .1)        # 0racle8 and above
buffer_pool_recycle = (buffers:1000, lru_latches:2) # 0racle8 and above db_file_multiblock_read_count = 16
db_writers = 10        # Oracle 7.3 and below
dbwr_writer_processes = 1        # Oracle 8 and above
dbwr_io_slaves =10        # 0racle8 and above
disk_asynch_io = TRUE        # 0racle8 and above
use_direct_io = TRUE        # Platform specific
use_ism = TRUE        # Sun Solaris,  Obsolete in 8i
db_files = 200

Parameters to optimize the Shared Pool Area

shared_pool_size = 134217728 shared_pool_reserved_size = 10485760
shared_pool_reserved_min_alloc = 5242880 # Obsolete in Oracle 8.1.3
java_pool_size = 20971520        # 0racle8i and above
large_pool_size = 10485760
large j>ool_min_alloc = 8192        # Obsolete in Oracle 8.1.3
lock_sga = TRUE        ft        Platform specific
mlock_sga = TRUE        ft        Platform specific
dml_locks = 300 sequence_caehe_entries = 100

Parameters to optimize Hash Joins

hash_area_size = 10485760 hash_multiblock_io_count = 16 hash_join_enabled = TRUE
Parameters to optimize Redo Log Buffer, ARCH and
#
log_buffer - 131072        
log_archive_dest = /u06/oradata/MYDB/archive log_archive..format - arch_%s.log log_archive_start - TRUE
log_archive_buffer_size = 128        # Obsolete in Oracle 8.1.3
log_archive_buffers =5        # Obsolete in Oracle 8.1.3

#        and        introduced a few additional parameters to manage more
#        than one log archive destination and conditions for copying log files
s to them.   Please refer to Oracle documentation for additional information.

Parameters to configure Latches
#        
log„sinnjitaneous„coDi8s - 8        8 Obsolete in Oracle
db_block„lru_l8tches = 8
#        Parameters to optimize Checkpoints
4+        
log_checkpoini._interval = 0 log_checkpoint_timeout = 1800 log_checkpoints_to_alert = TRUE

Parameters to optimize Cursors and Library Cache Performance

cursor_,space..ror_time = FALSE
row_cache_cursor=128        # Obsolete in Oracle 8.1.3
session_cached_cursors = 64
open_cursors = 256
Parameters to select        Mode and tune Optimizer
optimizerjsode = choose optiw2er_oarallel_percent = 0
optimizer_max_permutations = 79000        # Oracle 8.0.5 and above
optimizer_index_cost_adj = 1        # Oracle 8.0.5 and above
optimizer_search_limit = 1        I Oracle 8.0.5 and above
optimizer_index_caching = 99        tt Oracle 8.0.5 and above -
partition_view_enabled = true
always_anti_join = HASH

ft Parameters to optimize Parallel Query Option
parallel._max_servers = 16 para]lel_min_servers = 4
parallel_min_percent =50
parallel_server_idle_time = 5        # Obsolete in Oracle 8.1.3
parallel_automatic_tuning = FALSE        # 0racle8i and above

Parameters to optimize Sort Performance

sort_area_size = 1048576 sort_area_retained_size =  1048576
sort_direct_writes = TRUE        #        Obsolete in 8.1.3
sort_write_buffers = 8        

it

       

Obsolete in 8.1.3
sort_write_buffer_size = 32768        it        Obsolete in 8.1.3
sort_multiblock_read_count =2        #        0racle8i and above

Pointer to the conficjMYDB.ora file that stores static parameters

db_block_size = 8192 processes = 100 timed_statistics = TRUE
The following parameter enables public read access to trace
_trace_files_public = TRUE
global_names = TRUE
compatible = 8.1.6.1 rollback_segments = (rs1,rs2,rs3,rs4) u'b_naine = MYDB
control_files =  (7u03/oradata/MYDB/cntrl1.ctl,\
/u04/oradata/MYDB/cntrl2.ctl) user_duinp_dest = /u01/oracle / a d m i n / MYOB/ud и :. p со r e_duipp_dest = /uC1/oracle/adra i n / M Y D В /' cdu m p background, .di j mp_ d est = /и 01 / о г а с 1 e,/ a d m i n / M YDB / b d и го p
service name = MYOB
 









jAntivirus