1427
Oracle для профессионалов Том Кайт торгово-издательский дом DiaSoft Москва • Санкт-Петербург • Киев 2003

Oracle для профессионалов · К 91 Oracle для профессионалов. Пер. с англ./ТомКайт- СПб.: ООО «ДиаСофтЮП», 2003

  • Upload
    others

  • View
    72

  • Download
    0

Embed Size (px)

Citation preview

  • Oracleдля профессионалов

    Том Кайт

    торгово-издательский дом

    DiaSoftМосква • Санкт-Петербург • Киев

    2003

    http://www.apress.com/ApressCorporate/supplement/1/220/1590592433-1241.zip

  • УДК 681.3. 06(075)ББК 32.973.2

    К 91КАЙТ ТОМ

    К 91 Oracle для профессионалов. Пер. с англ./ТомКайт- СПб.: ООО «ДиаСофтЮП», 2003. — 672 с.

    ISBN 5-93772-072-5

    Выход в свет в конце прошлого года этой книги издательства Wrox стал эпохальным событи-ем: впервые доходчиво и исчерпывающе раскрыты основные особенности архитектуры СУБДOracle, принципиально отличающие ее от других популярных систем управления базами данных.Причем подробно описаны и проиллюстрированы множеством примеров именно те возможнос-ти, средства и особенности Oracle, которые обеспечивают разработку эффективных приложенийдля этой СУБД и ее успешную эксплуатацию.

    Автор книги, Том Кайт, давно работает с СУБД Oracle, создает приложения и администрируетбазы данных. Многие годы он профессионально занимается решением проблем, возникающихпри использовании СУБД Oracle у администраторов и разработчиков по всему миру. На специа-лизированном сайте корпорации Oracle (http://asktom.oracle.com) Том Кайт отвечает на десяткивопросов в день. Он не только делится знаниями, но и умело подталкивает читателя к самостоя-тельным экспериментам. Следуя по указанному им пути, становишься Профессионалом.

    Если вы приступаете к изучению СУБД Oracle, — начните с этой книги. Если вы опытныйразработчик приложений или администратор баз данных Oracle, — прочтите ее и проверьте, дос-таточно ли глубоко вы знаете эту СУБД и умеете ли использовать ее возможности. Вы найдете вкниге десятки советов, описаний приемов и методов решения задач, о которых никогда не подо-зревали.

    ББК 32.973.2

    Authorized translation from the English language edition, entitled Expert One-on-One Oracle, 1st Edition byKyte, Thomas, published by Pearson Education, Inc, publishing as Wrox Press Ltd,

    Copyright © 2002All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,

    electronic or mechanical, including photocopying, recording or by any information storage retrieval system,without permission from Pearson Education, Inc.

    Russian language edition published by DiaSoft Publishing.Copyright © 2003

    Лицензия предоставлена издательством Wrox Press Ltd.

    Все права зарезервированы, включая право на полное или частичное воспроизведение в какой бы тони было форме.

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

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

    ISBN 5-93772-072-5 (рус.) © Перевод на русский язык. ООО «ДиаСофтЮП», 2003ISBN 1-861004-82-6 (англ.) © Wrox Press Ltd, 2002

    © Оформление. ООО «ДиаСофтЮП», 2003Гигиеническое заключение № 77.99.6.953.П.438.2.99 от 04.02.1999

  • Предисловие научного редактораУважаемые читатели!О СУБД Oracle написано и издано как на английском, так и на русском языке, на-

    верное, больше книг, чем обо всех остальных реляционных СУБД вместе взятых. Мно-гие из этих книг полезны и интересны. Кроме того, в сети Internet доступны десяткитысяч страниц документации, которой могут воспользоваться разработчики, админист-раторы баз данных Oracle и пользователи. В журналах, на корпоративном сайте Oracle(http://www.oracle.com) и на десятках независимых сайтов печатаются статьи но всемаспектам администрирования и использования этой СУБД.

    Тем не менее появление в конце прошлого года именно этой книги издательства Wroxстало эпохальным событием: впервые доходчиво и исчерпывающе раскрыты основныеособенности архитектуры СУБД Oracle, принципиально отличающие ее от других по-пулярных систем управления базами данных. Причем подробно описаны и проиллюст-рированы множеством примеров именно те возможности, средства и особенности Oracle,которые обеспечивают разработку эффективных приложений для этой СУБД и ее ус-пешную эксплуатацию.

    В этом нет ничего удивительного. Автор книги, Том Кайт (Tom Kyte), давно работа-ет с СУБД Oracle, создает приложения и администрирует несколько баз данных. Многие

    годы он, сотрудник корпорации Oracle, профессионально занимается решениемпроблем, возникающих при использовании СУБД Oracle у администраторов и разработ-чиков по всему миру. В дискуссионных группах соmp.databases.oracle.* и в журналеOracle Magazine, а в последние годы — еще и на специализированном сайте корпорацииOracle (http://asktom.oracle.com) Том Кайт отвечает на десятки вопросов в день.

    Я набрел на этот сайт случайно, по ссылке в одном из документов, найденном слав-ной поисковой системой Google. Потом стал его еженедельным, а со временем - ежед-невным посетителем. Меня привлекло многообразие рассматриваемых проблем и изя-щество их решения. В изложении Тома Кайта все становится простым. При этом он нетолько делится знаниями, но и умело подталкивает читателя к самостоятельным экспе-риментам. Следуя по указанному им пути, становишься Профессионалом.

    Поэтому меня очень обрадовало сообщение о выходе книги Тома Кайта «Expert one-on-one: Oracle», и я сделал все от меня зависящее, чтобы издательство «ДиаСофт» опуб-ликовало ее перевод. Этот перевод я не смог никому доверить и сделал его сам. Еслитекст на русском языке понятен и приятен для чтения, то только благодаря потрясаю-щему литературному редактору Ж. Е. Прусаковой, помогавшей мне в работе над кни-гой. Я благодарен ей, а также сотрудникам издательства «ДиаСофт» за поддержку и уси-лия, которые они приложили для выхода этой книги в свет. .

    В оригинале книга — очень большая, более 1200 страниц. В русском переводе, с раз-решения издательства Wrox, она разделена на две части. Мы хотели часть книги, наи-более принципиальную для успешного использования СУБД Oracle, выпустить как мож-но быстрее. Сейчас, когда вы читаете первую часть, посвященную архитектуре иосновным возможностям СУБД Oracle, продолжается работа над второй частью; онавыйдет несколькими месяцами позже.

  • Предисловие научного редактора

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

    Если вы приступаете к изучению СУБД Oracle, — начните с этой книги. Если выопытный разработчик приложений или администратор баз данных Oracle, — прочтитеее и проверьте, достаточно ли глубоко вы знаете эту СУБД и умеете ли использовать еевозможности. Вы найдете в книге десятки советов, описаний приемов и методов реше-ния задач, о которых никогда не подозревали.

    И, конечно же, рекомендую читать блестящие ответы и рекомендации Тома Кайтана его ежедневно обновляющемся сайте AskTom: http://asktom.oracle.com. Если корпо-рация Oracle станет общепризнанным и неоспоримым лидером на рынке производите-лей программного обеспечения, то в немалой степени благодаря тому, что и как делаетдля пользователей ее программных продуктов один человек — Том Кайт!

    В. Кравчук,OpenXS Initiative (http://openxs.net)

    12 декабря 2002 года

  • Оглавление

    Об авторе 14

    Введение 17О чем эта книга 18Для кого предназначена эта книга? 18Структура книги 20

    Основные понятия 20Структуры и утилиты базы данных 22Производительность 23Расширенные возможности SQL 23Расширяемость 24Защита 25Приложения 26

    Типографские особенности книги 26Контакты с читателями 27

    Исходный код и обновления 27Ошибки 27

    Глава 1. Разработка успешных приложений для Oracle 37Мой подход 38Подход с использованием принципа черного ящика 40Как надо (и как не надо) разрабатывать приложения баз данных 44

    Понимание архитектуры СУБД Oracle 44Избегайте длительных транзакций в среде MTS 45Используйте связываемые переменные 47

    Особенности управления одновременным доступом 51Реализация блокирования 51Многовариантность 54

    Независимость от СУБД? 59Влияние стандартов 62Возможности и функции 66Решайте проблемы просто 68Открытость 70

    Как ускорить работу? 72Взаимоотношения АБД и разработчиков 75

    Резюме 76

    Глава 2. Архитектура 79Сервер 80Файлы 87

    Файлы параметров 88Файлы данных 90Временные файлы 94Управляющие файлы 95

  • 8 ОглавлениеФайлы журнала повторного выполнения 95

    Активный журнал повторного выполнения 96Архивный журнал повторного выполнения 99

    Структуры памяти 100Области PGA и UGA 100Область SGA 105

    Фиксированная область SGA 108Буфер журнала повторного выполнения 108Буферный кэш 109Разделяемый пул 112Большой пул 114Java-пул 115

    Процессы 117Серверные процессы 117

    Выделенный и разделяемый сервер 120Фоновые процессы 123

    Фоновые процессы, предназначенные для решения конкретных задач 123Служебные фоновые процессы 131

    Подчиненные процессы 132Подчиненные процессы ввода/вывода 132Подчиненные процессы параллельных запросов 133

    Резюме 134

    Глава 3. Блокирование и одновременный доступ 137Что такое блокировки? 138Проблемы блокирования 140

    Потерянные изменения 140Пессимистическое блокирование 142Оптимистическое блокирование 143

    Блокирование 144Заблокированные вставки 145Заблокированные изменения и удаления 145

    Взаимные блокировки 146Эскалация блокирования 150

    Типы блокировок 151Блокировки ЯМД 152

    ТХ — блокировки транзакций 152ТМ — блокировки очередности ЯМД 158

    Блокировки ЯОД 159Защелки и внутренние блокировки 163Блокирование вручную. Блокировки, определяемые пользователем 163

    Блокирование вручную 164Создание собственных блокировок 164

    Что такое управление одновременным доступом? 165Уровни изолированности транзакции 165Уровень изолированности READ UNCOMMITTED 167Уровень изолированности READ COMMITTED 169Уровень изолированности REPEATABLE READ 170

    Получение согласованного ответа 170

  • Оглавление

    Предотвращение потери изменений 172Уровень изолированности SERIALIZABLE 173Транзакции только для чтения 175

    Резюме 176

    Глава 4. Транзакции 179Операторы управления транзакцией 180Требования целостности и транзакции 185Плохие привычки при работе с транзакциями 188Распределенные транзакции 194Журналы повторного выполнения и сегменты отката 197Резюме 201

    Глава 5. Повторное выполнение и откат 205Повторное выполнение 206

    Что происходит при фиксации? 207Что происходит при откате? 212Какой объем данных повторного выполнения генерируется? 214Можно ли отключить генерацию записей в журнал повторного выполнения? 224Не удается выделить новый журнал? 228Очистка блоков 230Конфликты при доступе к журналу 234Временные таблицы и данные повторного выполнения/отката 236Анализ данных повторного выполнения 240

    Откат 240Что генерирует основной/наименьший объем данных отмены? 241Оператор SET TRANSACTION 241'ORA-01555: snapshot too old' 242

    Сегменты отката очень маленькие 243Данные извлекаются в нескольких транзакциях 247Отложенная очистка блоков 249

    Резюме 254

    Глава 6. Таблицы 257Типы таблиц 257Терминология 259

    Отметка максимального уровня 259Списки свободных мест 260Параметры PCTFREE и PCTUSED 263

    Перенос строки 264Установка значений PCTFREE и PCTUSED 266

    Параметры INITIAL, NEXT и PCTINCREASE 270Параметры MINEXTENTS и MAXEXTENTS 271Параметры LOGGING и NOLOGGING 271Параметры INITRANS and MAXTRANS 271

    Таблицы, организованные в виде кучи 271Таблицы, организованные по индексу 276Таблицы в индексном кластере 290

  • 10 ОглавлениеТаблицы в хеш-кластере 298Вложенные таблицы 308

    Синтаксис вложенных таблиц 309Хранение вложенных таблиц 318

    Временные таблицы 321Объектные таблицы 330Резюме 337

    Глава 7. Индексы 341Обзор индексов в Oracle 342Индексы на основе В*-дерева 343

    Индексы совращенным ключом 348Индексы по убыванию 349Когда имеет смысл использовать индекс на основе В*-дерева? 351

    Индексы на основе битовых карт 359Когда имеет смысл использовать индекс на основе битовых карт? 361

    Индексы по функциям 363Важные детали реализации 363Пример использования индекса по функции 364Подводный камень 372

    Прикладные индексы 373Часто задаваемые вопросы об индексах 375

    Работают ли индексы с представлениями? 375Индексы и пустые значения 375Индексы по внешним ключам 378Почему мой индекс не используется? 380

    Случай 1 380Случай 2 380Случай 3 380Случай 4 380Случай 5 382Случай 6 384

    Использовались ли индексы? 385Миф: пространство в индексе никогда повторно не используется 386Миф: столбцы с максимальным количеством разных значений должны

    указываться первыми , 389

    Резюме 392

    Глава 8. Импорт и экспорт 395Простой пример 396Когда могут пригодиться утилиты IMP и ЕХР? 397

    Выявление повреждений 397Извлечение операторов ЯОД 398Клонирование схем 398Перенос табличных пространств 398Пересоздание экземпляров 399Копирование данных с одной платформы на другую 399

    Особенности использования утилит 399

  • Оглавление 11Опции 400

    Параметры утилиты ЕХР 400Параметры утилиты IMP 403

    Экспортирование больших объемов данных 405Использование параметра FILESIZE 405Экспортирование по частям 407Экспортирование в именованный канал 407Экспортирование на устройство, не поддерживающее абсолютную

    адресацию 409Выделение подмножеств данных 409Перенос данных 410Получение операторов ЯОД 415

    Преодоление ограничений с помощью сценариев 418Резервное копирование и восстановление 421Утилиты IMP/EXP (уже) не являются средствами реорганизации 423Импортирование в другие структуры 423Непосредственный экспорт 428

    Проблемы и ошибки 428Клонирование 428Использование различных версий утилит IMP/EXP 436Куда делись индексы? 437Явно и автоматически именуемые требования 439Поддержка национальных языков (NLS) 442Таблицы, расположенные в нескольких табличных пространствах 444

    Резюме 448

    Глава 9. Загрузка данных 451Введение в SQL*Loader 452Как сделать 458

    Загрузка данных с разделителями 458Загрузка данных в фиксированном формате 462Загрузка дат 464Загрузка данных с использованием последовательностей и других функций 465Изменение существующих строк и вставка новых 470Загрузка данных из отчетов 473Загрузка файла в поля типа LONG RAW или LONG 476Загрузка данных, содержащих символы новой строки 477

    Использование другого символа вместо символа новой строки 478Использование атрибута FIX 479Использование атрибута VAR 484Использование атрибута STR 485Как упростить обработку символов новой строки 486

    Выгрузка данных 487Загрузка больших объектов 498

    Загрузка больших объектов с помощью PL/SQL 498Загрузка данных больших объектов с помощью SQLLDR 501

    Загрузка массивов переменной длины и вложенных таблиц с помощью SQLLDR . 508Вызов утилиты SQLLDR из хранимой процедуры 511

  • 12 ОглавлениеПроблемы 516

    Нельзя выбрать сегмент отката 516TRUNCATE работает по-другому 516Стандартным типом поля в SQLLDR является CHAR(255) 516Опции командной строки переопределяют установки в командном файле 517

    Резюме 517

    Глава 10. Стратегии и средства настройки 519Определение проблемы 520Мой подход 522

    Настройка — непрерывный процесс 522Проектирование с учетом производительности 523Пробуйте разные подходы 525Применяйте защитное программирование 525Проверяйте производительность 526

    Связываемые переменные и разбор (еще раз) 528Используются ли связываемые переменные? 542

    SQL_TRACE, TIMED_STATISTICS и TKPROF 545Организация трассировки 546Использование и интерпретация результатов работы утилиты TKPROF 549Использование и интерпретация исходных трассировочных файлов 560

    Пакет DBMS_PROFILER 572Средства контроля и отладки 573Набор утилит StatsPack 575

    Установка утилит StatsPack 576Представления V$ 595

    Представление V$EVENT_NAME 595Представления V$FILESTAT и V$TEMPSTAT 596Представление V$LOCK 596Представление V$MYSTAT 596Представление V$OPEN_CURSOR 597Представление V$PARAMETER 599Представление V$SESSION 599Представление V$SESSION_EVENT 601Представление V$SESSION_LONGOPS 602Представление V$SESSION_WAIT 602Представление V$SESSTAT 602Представление V$SESS_IO 602Представления V$SQL и V$SQLAREA 603Представление V$STATNAME 603Представление V$SYSSTAT 603Представление V$SYSTEM_EVENT 603

    Резюме 603

    Глава 11. Стабилизация плана оптимизатора 607Обзор возможностей 608Использование стабилизации плана оптимизатора 611

  • Оглавление 13Метод настройки 611Средство разработки 616Проверка использования индексов 618Получение списка SQL-операторов, выполненных приложением 618

    Как выполняется стабилизация плана оптимизатора 619Представления OUTLINES и OUTLINE_HINTS 619

    Представления _OUTLINES 619Представления _OUTLINE_HINTS 620

    Создание хранимых шаблонов 622Привилегии, необходимые для создания хранимых шаблонов 622Использование операторов ЯОД 623Использование оператора ALTER SESSION 624

    Пользователь OUTLN 625Перенос шаблонов из одной базы данных в другую 625Получение нужного шаблона 626Управление шаблонами 629

    Операторы ЯОД 629Оператор ALTER OUTLINE 629Оператор DROP OUTLINE 631

    Пакет OUTLN_PKG 632Процедура OUTLN_PKG.DROP_UNUSED 633Процедура OUTLN_PKG.DROP_BY_CAT 633Процедура OUTLN_PKG.UPDATE_BY_CAT 633

    Проблемы 635Имена шаблонов и регистр символов 635Проблема с оператором ALTER SESSION 637Оператор DROP USER не удаляет шаблоны 637Шаблоны и параметр 'CURSOR_SHARING = FORCE' 637В шаблонах используется простое сравнение текста 639Шаблоны по умолчанию хранятся в табличном пространстве SYSTEM 639Раскрытие условий OR 639Производительность 640Пространство имен шаблонов — глобально 644

    Ошибки, которые можно допустить 645Резюме 647

    Предметный указатель 648

  • Глава 12. Аналитические функции 1037Пример 1038Как работают аналитические функции 1041

    Синтаксис 1041Функции 1043Конструкция фрагментации 1043Конструкция упорядочения 1044Конструкция окна 1046Окна диапазона 1048Окна строк 1051Задание окон 1053

    Функции 1056Примеры 1059

    Запрос первых N 1059Запрос с транспонированием 1070Доступ к строкам вокруг текущей строки 1077

    Проблемы 1081Аналитические функции в PL/SQL 1081Аналитические функции в конструкции WHERE 1083Значения NULL и сортировка 1083Производительность 1085

    Резюме 1086

    Глава 13. Материализованные представления 1089Предыстория 1090Что необходимо для выполнения примеров 1091Пример 1092Назначение материализованных представлений 1098Как работать с материализованными представлениями 1099

    Подготовка 1099Внутренняя реализация 1100

    Переписывание запроса 1101Как гарантировать использование представлений 1103

    Требования целостности 1103Измерения 1108

    Пакет DBMS_OLAP 1117Оценка размера 1117Проверка достоверности измерений 1119Рекомендация создания материализованных представлений 1121

    Проблемы 1123Материализованные представления не предназначены для систем ООТ 1123Целостность запросов при переписывании 1124

    Резюме 1124

  • Оглавление

    Глава 14. Фрагментация 1127Использование фрагментации 1128

    Повышение доступности данных 1128Упрощение администрирования 1130Повышение производительности операторов ЯМД и запросов 1131

    Как выполняется фрагментация 1134Схемы фрагментации таблиц 1134Фрагментация индексов 1139

    Локально фрагментированные индексы 1140Глобально фрагментированные индексы 1148

    Резюме 1158

    Глава 15. Автономные транзакции 1161Пример 1162Когда использовать автономные транзакции? 1164

    Проверка, записи которой не могут быть отменены 1164Метод, позволяющий избежать ошибки изменяющейся таблицы 1167Выполнение операторов ЯОД в триггерах 1168Запись в базу данных 1174

    Строгая проверка 1174Когда среда позволяет выполнять только операторы SELECT 1178

    Разработка модульного кода 1182Как работают автономные транзакции 1183

    Выполнение транзакции 1183Область действия 1185

    Переменные пакетов 1185Установки/параметры сеанса 1186Изменения в базе данных 1187Блокировки 1190

    Завершение автономной транзакции 1191Точки сохранения 1192

    Проблемы 1194Невозможность использования в распределенных транзакциях 1194Только в среде PL/SQL 1194Откатывается вся транзакция 1195Временные таблицы уровня транзакции 1196Изменяющиеся таблицы 1198

    Ошибки, которые могут произойти 1200Резюме 1201

    Глава 16. Динамический SQL 1203Сравнение динамического и статического SQL 1204Когда использовать динамический SQL? 1206Использование динамического SQL 1208

    Пакет DBMS_SQL 1208Встроенный динамический SQL 1215Сравнение пакета DBMS_SQL и встроенного динамического SQL 1220

    Связываемые переменные 1220

  • Количество столбцов выходных данных на этапе компиляции не известно 1225Многократное выполнение одного и того же оператора 1233

    Проблемы 1243Нарушение цепочки зависимостей 1243"Хрупкость" кода 1244Сложность настройки 1244

    Резюме 1245

    Глава 17. interMedia 1247Краткий исторический экскурс 1248Использование компонента interMedia Text 1249

    Поиск текста 1249Управление разнородными документами 1252Индексирование текста из различных источников данных 1252Компонент interMedia Text — часть базы данных Oracle 1255Смысловой анализ 1256Поиск в приложениях XML 1258

    Как работает компонент interMedia Text 1259Индексирование с помощью interMedia Text , 1262Оператор ABOUT 1265Поиске разделах 1266

    Проблемы 1272Компонент interMedia Text —это НЕ система документооборота 1272Синхронизация индекса 1273Индексирование информации вне базы данных 1274Службы обработки документов 1274Индекс-каталог 1275

    Возможные ошибки 1277Устаревший индекс 1277Ошибки внешней процедуры 1278

    Дальнейшее развитие 1279Резюме 1279

    Глава 18. Внешние процедуры на языке С 1281Когда используются внешние процедуры? 1282Как реализована поддержка внешних процедур? 1284Конфигурирование сервера 1285

    Проверка программы extproc 1288Проверка среды сервера 1288Проверка процесса прослушивания 1290

    Первая проверка 1290Компиляция кода extproc.с 1291Настройка учетной записи SCOTT/TIGER 1292Создание библиотеки demolib 1292Установка и запуск 1293

    Наша первая внешняя процедура 1294Оболочка 1295Код на языке С 1306

  • Оглавление

    Создание внешней процедуры 1330Установка и запуск 1334

    Внешняя процедура для сброса большого объекта в файл (LOB_IO) 1335Спецификация пакета LOB_IO 1336Код Pro*С для пакета LOB_IO 1338Создание внешней процедуры 1342Установка и использование пакета LOB_IO 1344

    Возможные ошибки 1349Резюме 1356

    Глава 19. Хранимые процедуры на языке Java 1359Когда используются хранимые процедуры на языке Java? 1360Как работают внешние процедуры на языке Java 1361

    Передача данных 1366Полезные примеры 1376

    Генерация списка файлов каталога 1376Выполнение команды ОС 1378Получение времени с точностью до миллисекунд 1381

    Возможные ошибки 1382ORA-29549 Java Session State Cleared 1382Ошибки прав доступа 1383ORA-29531 no method X in class Y 1383

    Резюме 1384

    Глава 20. Использование объектно-реляционных средств 1387В каких случаях используются объектно-реляционные средства 1388Как работают объектно-реляционные средства 1389Добавление новых типов данных в систему 1389Использование типов для расширения возможностей языка PL/SQL 1403

    Создание нового типа данных PL/SQL 1403Уникальные приемы использования наборов 1414

    SELECT * из PL/SQL-функции 1415Множественная выборка данных в записи 1418Вставка записей 1419

    Объектно-реляционные представления 1420Необходимые типы 1420Объектно-реляционное представление 1421

    Резюме 1433

    Глава 2 1 . Тщательный контроль доступа 1437Пример 1438Когда использовать это средство? 1439

    Простота сопровождения 1439Контроль доступа выполняется на сервере 1440

    Упрощение разработки приложений 1441Эволюционная разработка приложений 1441

    Отказ от совместно используемых учетных записей 1441Поддержка совместно используемых учетных записей 1441Предоставление доступа к приложению как к службе 1442

  • Оглавление

    Как реализованы средства тщательного контроля доступа 1443Пример 1: Реализация правил защиты 1445Пример 2: Использование контекстов приложений 1449

    Проблемы 1467Целостность ссылок 1467

    Тайный канал 1468Удаление строк 1469

    Кэширование курсоров 1472Экспортирование/Импортирование 1478

    Проблемы экспорта 1479Проблемы импорта 1481

    Отладка 1482Ошибки, которые могут произойти 1482Резюме 1487

    Глава 22. Многоуровневая аутентификация 1489Когда использовать многоуровневую аутентификацию? 1490Механизм многоуровневой аутентификации 1493

    Предоставление привилегии 1501Проверка промежуточных учетных записей 1502Проблемы 1503Резюме 1505

    Глава 23. Права вызывающего и создателя 1507Пример 1508Когда использовать права вызывающего 1511

    Разработка универсальных утилит 1511Приложения, работающие со словарем данных 1515Универсальные объектные типы 1518Реализация собственных средств контроля доступа 1518

    Когда использовать права создателя 1521Производительность и масштабируемость 1521Защита 1522

    Как работают процедуры с правами вызывающего 1523Права создателя 1523

    Компиляция процедуры с правами создателя 1525Права вызывающего 1528

    Разрешение ссылок и передача привилегий 1529Компиляция процедуры с правами вызывающего 1534Использование объектов-шаблонов 1535

    Проблемы 1539Права вызывающего и использование разделяемого пула 1539Производительность 1542Более надежный код для обработки ошибок 1544Побочные эффекты использования SELECT * 1546Помните о "скрытых" столбцах 1547Java и права вызывающего , 1549

    Возможные ошибки 1554Резюме 1554

  • Оглавление

    Приложение А. Основные стандартные пакеты 1557Когда используются стандартные пакеты 1558

    О стандартных пакетах 1559

    Пакеты DBMS_ALERT и DBMS_PIPE 1561Когда использовать сигналы и каналы 1562Настройка 1562

    Пакет DBMS_ALERT 1563Одновременные сигналы нескольких сеансов 1565Неоднократная передача сигнала в сеансе 1566Передача многочисленных сигналов несколькими сеансами до вызова

    процедуры ожидания 1567Пакет DBMS_PIPE 1568

    Серверы каналов или внешние процедуры? 1571Пример в сети Internet 1573

    Резюме 1573

    Пакет DBMS_APPLICATION_INFO 1574Использование информации о клиенте 1576

    Использование представления V$SESSION_LONGOPS 1577Резюме 1583

    Пакет DBMS_JAVA 1584Функции LONGNAME и SHORTNAME 1584Установка опций компилятора 1585Процедура SET_OUTPUT 1589Процедуры loadjava и dropjava 1589Процедуры управления правами 1590Резюме 1592

    Пакет DBMS_JOB 1593Однократное выполнение задания 1597Текущие задания 1601Нетривиальное планирование 1604Контроль заданий и обнаружение ошибок 1606Резюме 1608

    Пакет DBMS_JOB 1609Как загружать большие объекты? 1610Функция substr 1611

    Оператор SELECT FOR UPDATE в языке Java 1611Преобразования 1613

    Преобразование типа BLOB в VARCHAR2 и обратно 1614Преобразование данных типа LONG/LONG RAW в большой объект 1618Пример множественного однократного преобразования типа 1620Оперативное преобразование типа данных 1623

    Запись значений объекта типа BLOB/CLOB на диск 1626Выдача большого объекта на Web-странице с помощью PL/SQL 1626Резюме 1628

  • Пакет DBMS_LОСК 1629Резюме 1633

    Пакет DBMS_LOGMNR 1634Обзор 1636

    Этап 1: создание словаря данных 1637Этап 2: использование средств LogMiner 1640

    Опции и использование 1646Определение с помощью LogMiner, когда 1649Использование области PGA 1651Ограничения пакетов LogMiner 1652

    Объектные типы Oracle 1652Перемещенные или фрагментированные строки 1655Другие ограничения 1658

    Представление V$LOGMNR_CONTENTS 1658Резюме 1662

    Пакет DBMS_OBFUSCATION_TOOLKIT 1663Пакет-оболочка 1665Проблемы 1680Управление ключами 1682

    Генерация и хранение ключей в клиентском приложении 1682Хранение ключей в той же базе данных 1683Хранение ключей в файловой системе сервера базы данных 1684

    Резюме 1685

    Пакет DBMS_OUTPUT 1686Как работает пакет DBMS_OUTPUT 1687Пакет DBMS_OUTPUT в других средах 1692Обход ограничений 1696

    Использование небольшой функции-оболочки или другого пакета 1696Создание аналога пакета DBMS_OUTPUT 1697

    Резюме 1703

    Пакет DBMS_PROFILER 1704Проблемы 1714

    Резюме 1715

    Пакет DBMS_UTILITY 1716Процедура COMPILE_SCHEMA 1716Процедура ANALYZE_SCHEMA 1721

    Применение процедуры ANALYZE_SCHEMA к изменяющейся схеме 1722Процедура ANALYZE_SCHEMA анализирует не все 1723

    Процедура ANALYZE_DATABASE 1724Функция FORMAT_ERROR_STACK 1724Функция FORMAT_CALL_STACK 1726Функция GET_TIME 1729Функция GET_PARAMETER_VALUE 1730

    Оглавление

  • Оглавление

    Процедура NAME_RESOLVE 1731Процедура NAME_TOKENIZE 1734Процедуры COMMA_TO_TABLE, TABLE_TO_COMMA 1737Процедура DB_VERSION и функция PORT_STRING 1739Функция GET_HASH_VALUE 1739Резюме 1744

    Пакет UTL_FILE 1745Параметр инициализации UTL_FILE_DIR 1746Обращение к сетевым дискам в Windows 1747Обработка исключительных ситуаций 1749Как сбросить Web-страницу на диск? 1750Ограничение длины строки —1023 байт 1751Чтение содержимого каталога 1752Резюме 1754

    Пакет UTL_HTTP 1755Возможности пакета UTL_HTTP 1756Добавление поддержки протокола SSL в пакете UTL_HTTP 1758Реальное использование пакета UTL_HTTP 1765Улучшенная версия пакета UTL_HTTP 1768Резюме 1778

    Пакет UTL_RAW 1779

    Пакет UTL_SMTP и отправка электронной почты 1782UTL_SMTP — расширенный пример использования 1782Загрузка и использование интерфейса JavaMail 1787Резюме 1796

    Пакет UTL_TCP 1797Тип SocketType 1798Резюме 1811

    Приложение В. Поддержка, ошибки и сайт p2p.wrox.com 1813Форумы на сайте p2p.wrox.com 1814

    Как обратиться за поддержкой 1814Почему эта система обеспечивает наилучшую поддержку 1815

    Поиск информации об ошибках на сайте www.wrox.com 1815Поиск информации об ошибках на Web-сайте 1815Добавление информации об ошибке 1816

    Предметный указатель 1818

  • Об авторе

    Меня зовут Том Кайт. Я работаю в корпорации Oracle со времени версии 7.0.9 (длятех, кто не измеряет время версиями Oracle, уточню — с 1993 года). Однако я работал сСУБД Oracle, начиная с версии 5.1.5с (однопользовательская версия для DOS стоимос-тью 99 долларов на дискетах емкостью 360 Кбайт). До корпорации Oracle я более шестилет работал системным интегратором, занимаясь построением крупномасштабных гете-рогенных баз данных и приложений (в основном для правительственных и оборонныхучреждений). В этот период я много работал с СУБД Oracle, а точнее, помогал пользо-вателям баз данных Oracle. Я работал непосредственно с клиентами на этапе созданияспецификаций и построения систем, но чаще помогал перестраивать или настраиватьсистемы ("настройка" обычно сводилась к переделке). Кроме того, я — именно тот Том,который ведет рубрику "AskTom" в журнале Oracle Magazine, отвечая на вопросы читате-лей о сервере и инструментальных средствах Oracle. Обычно на сайте http://asktom.oracle.comя получаю за день от 30 до 40 вопросов и отвечаю на них. Раз в два месяца я публикуюподборку лучших вопросов с ответами в журнале (ответы на все вопросы доступны вWeb и, естественно, хранятся в базе данных Oracle). В общем, я занимаюсь тем, чтопомогаю людям успешно эксплуатировать СУБД Oracle. Да, а в свободное время я раз-рабатываю приложения и программное обеспечение в самой корпорации Oracle.

    В этой книге описано то, чем я занимаюсь ежедневно. Предлагаемый в ней матери-ал посвящен темам и вопросам, с которыми пользователи сталкиваются постоянно. Всепроблемы рассматриваются с позиции "если я использую это, то делаю так...". Моякнига — итог многолетнего опыта использования СУБД Oracle в тысячах различных си-туаций.

  • Благодарности

    БлагодарностиЯ хотел бы поблагодарить многих людей, помогавших мне создать эту книгу. В кор-

    порации Oracle я работаю с лучшими и наиболее яркими людьми из тех, кого мне уда-лось узнать, и они все так или иначе помогли мне. В частности, я благодарю ДжоэлаКалмана (Joel Kallman) за помощь в создании раздела книги, посвященного технологииinterMedia. В ходе работы над сайтом AskTom мне не раз пришлось обращаться к Джо-элу за помощью в этой области — он именно тот человек, к которому стоит обратиться,если речь идет об interMedia и соответствующих технологиях. Я также благодарен Дэ-виду Ноксу (David Knox) за помощь в создании примеров работы с протоколом SSL вразделе, посвященном пакету UTL_HTTP. Если бы не его знания и желание поделить-ся ими со мной, этого раздела просто не было бы. Наконец, я хочу поблагодарить всех,с кем работаю, за поддержку в испытании писательским трудом. Мне понадобилосьнамного больше времени и энергии, чем я мог себе представить, и я благодарен им запонимание моих проблем. В особенности, хочу поблагодарить Тима Хёхста (Tim Hoechst)и Майка Хичва (Mike Hichwa), которых я знаю по совместной работе уже почти 10 лет.Их постоянные вопросы и требования помогли мне разобраться с вещами, которыми ялично никогда и не подумал бы заниматься.

    Хочу также поблагодарить пользователей программного обеспечения Oracle, задаю-щих так много хороших вопросов. Если бы не они, мне и в голову не пришло бы напи-сать эту книгу. Большая часть представленной здесь информации является прямым ре-зультатом чьего-нибудь вопроса "как" или "почему".

    Наконец, и это самое главное, я благодарен за неизменную поддержку моей семье.Когда в тысячный раз слышишь: "Папа, ну почему ты все еще пишешь эту книгу?", топонимаешь, что кому-то нужен. Я просто не представляю, как бы я закончил эту книгубез постоянной поддержки моей жены Лори, сына Алана и дочери Мэган.

    15

  • Введение

    Представленный в этой книге материал сформирован на основе моего опыта раз-работки приложений Oracle и работы с коллегами-программистами, которым я помо-гал создавать надежные и устойчивые приложения для СУБД Oracle. Книга — лишьотражение того, чем я занимаюсь ежедневно, и тех проблем, с которыми постоянносталкиваются люди.

    Я описал то, что мне показалось наиболее важным, — базу данных Oracle и ееархитектуру. Я мог бы написать книгу с аналогичным названием, объясняющую, какразрабатывать приложения с помощью конкретного языка и архитектуры, например,с помощью технологии динамических HTML-страниц Java Server Pages, обращающихсяк компонентам Enterprise Java Beans, которые используют интерфейс JDBC для вза-имодействия с сервером Oracle. Однако в конечном итоге для успешного созданияподобного приложения действительно необходимо понимать темы, представленныев этой книге. Книга посвящена тому, что, по моему мнению, должно быть известновсем для успешной разработки приложений Oracle, независимо от того, программи-руются ли эти приложения на Visual Basic с использованием интерфейса ODBC, наязыке Java с использованием технологии EJB и интерфейса JDBC или на языке Perlс помощью модуля DBI. Эта книга не навязывает определенную архитектуру прило-жений; я не сравниваю трехуровневую архитектуру и архитектуру клиент-сервер. Здесьописано, что может делать база данных и что необходимо знать об особенностях ееработы. Поскольку база данных является основой любой архитектуры приложений,книга предназначена для широкой аудитории разработчиков.

  • 18 Введение

    О чем эта книгаОдна из проблем при наличии множества вариантов разработки — выяснить, ка-

    кой из них лучше всего подходит в конкретной ситуации. Все хотят получить макси-мальную гибкость (как можно больше вариантов), но при этом так, чтобы все былопросто и понятно. Oracle дает разработчикам практически неограниченный выбор.Никто еще не говорил: "Этого нельзя сделать в Oracle"; говорят иначе: "Сколько спо-собов сделать это в Oracle вам надо?". Я надеюсь, что книга поможет вам сделать пра-вильный выбор.

    Эта книга для тех, кто приветствует свободу выбора, но хотел бы получить реко-мендации и узнать особенности реализации тех или иных средств и функций Oracle.Например, СУБД Oracle предлагает замечательную возможность создания виртуаль-ной приватной базы данных (virtual private database). В документации Oracle описано,как использовать эту возможность и что она дает. В документации, однако, не сказа-но, когда ее использовать и, что видимо еще важнее, когда ее не надо использовать. Вдокументации не всегда представлены детали реализации той или иной возможности,а если они не известны, то могут неожиданно встать на вашем пути. (Речь идет не обошибках, но о предполагавшихся способах работы и первоначальном назначении со-ответствующих средств.)

    Для кого предназначена эта книга?Целевой аудиторией являются все разработчики приложений для Oracle как серве-

    ра баз данных. Книга написана для профессиональных разработчиков Oracle, инте-ресующихся тем, как решить задачу средствами этой СУБД. Практическая ориента-ция книги означает, что многие разделы будут очень интересны администраторам базданных (АБД). В большинстве примеров, приведенных в книге для демонстрацииключевых возможностей, используется утилита SQL*Plus, поэтому вы не сможете уз-нать из нее, как разрабатывать удобный и красивый графический пользовательскийинтерфейс, но зато узнаете, как работает СУБД Oracle, что позволяют сделать ее ос-новные средства и когда их нужно (и не нужно) использовать.

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

  • Введение

    Чтобы получить максимальную отдачу от этой книги, читатель должен:

    О Знать язык SQL. He обязательно быть лучшим специалистом по SQL в стране,но хорошее практическое знание существенно поможет.

    • Понимать программы на языке PL/SQL. Это не обязательное требование, нознание PL/SQL поможет "воспринять" примеры. Эта книга, например, не объяс-няет, как создавать циклы FOR или объявлять тип записи — об этом достаточнонаписано в документации Oracle и в многочисленных книгах. Однако это незначит, что вы не узнаете много нового о программировании на PL/SQL, про-чтя эту книгу. Узнаете. Вы очень близко познакомитесь со многими возмож-ностями PL/SQL и узнаете новые способы решения задач, изучите пакеты исредства, о существовании которых, возможно, даже и не подозревали.

    • Иметь определенный опыт работы с процедурным языком программирования, на-

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

    • Ознакомиться с руководством Oracle Server Concepts Manual.

    Несколько слов об этом руководстве. Из-за большого объема многих пугает доку-ментация Oracle. Если вы только начинаете изучение руководства или ранее не чи-тали подобной документации, я рекомендую начать именно с Oracle8i Concepts. Егообъем — около 800 страниц, и в нем описаны многие из фундаментальных концеп-ций Oracle, о которых вам надо знать. Это руководство не описывает все техничес-кие детали (именно этому посвящены остальные 10-20 тысяч страниц документации),но представляет все важнейшие концепции. В руководстве затронуты, в частности,следующие темы:

    • структура базы данных, организация и хранение данных;

    • распределенная обработка;

    • архитектура памяти Oracle;

    • архитектура процессов Oracle;

    • объекты пользовательской схемы (таблицы, индексы, кластеры и т.д.);

    • встроенные и определяемые пользователем типы данных;

    • хранимые процедуры;

    • особенности организации транзакций;

    • оптимизатор;

    • целостность данных;

    • управление одновременным доступом.

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

    19

  • 20 Введение

    Структура книгиЧтобы облегчить восприятие, книга поделена на шесть отдельных частей (они опи-

    саны ниже). Это не просто структурные единицы — они помогут быстрее найти наи-более существенную информацию. Книга состоит из 23 глав, каждая из которых —"мини-книга", то есть практически отдельный компонент. Изредка я ссылаюсь напримеры или возможности, описанные в других главах (часть, посвященная защите,например, больше других зависит от примеров и понятий, представленных в другихглавах). Но, как правило, вполне можно читать главу отдельно от остальной книги.Например, вовсе не нужно прочитать главу 10, чтобы понять главу 14.

    Форматы и стили глав практически идентичны:

    • Введение в описываемые средства или возможности.

    • Почему это нужно (или не нужно) использовать. Я описываю ситуации, когдаимеет смысл использовать данное средство и когда этого делать не стоит.

    • Как это использовать. Это не просто цитата из справочного руководства по язы-ку SQL, а пошаговое описание: вот что требуется, что для этого надо сделать, авот предварительные условия применения. В этом разделе рассматривается:

    Как применить то или иное средство или прием

    Примеры, примеры и еще примеры

    Отладка, поиск ошибок при реализации

    Подводные камни при использовании средства

    Устранение ошибок (превентивное)

    О Резюме, подводящее итог рассмотрения.

    В книге содержится множество примеров и большое количество кода, причем весьэтот код доступен для загрузки на сайте http://www.wrox.com. Далее представленоподробное содержание каждой части.

    Основные понятия• Глава 1. Разработка успешных приложений для Oracle. В этой главе описан мой

    принципиальный подход к программированию баз данных. Все СУБД устрое-ны по-разному, и чтобы успешно и в срок разработать приложение, использую-щее базу данных, необходимо точно знать, что и как позволяет сделать вашаСУБД. Не зная возможностей СУБД, вы рискуете в очередной раз "изобрестивелосипед", то есть создать средства, уже предоставляемые базой данных. Есливы не знаете, как работает СУБД, то с большой вероятностью будете создаватьнеэффективные и непредсказуемые приложения.

    В этой главе описывается ряд реальных приложений, при создании которых не-достаток понимания базовых концепций СУБД привел к неудаче всего проек-та. На основе такого практического подхода с контрпримерами в главе описы-ваются базовые возможности и функции СУБД, которые необходимо понимать

  • разработчикам. Идея в том, что вы не можете себе позволить рассматриватьСУБД как черный ящик, просто "отвечающий на запросы" и самостоятельнообеспечивающий требуемую масштабируемость и производительность.

    • Глава 2. Архитектура. СУБД Oracle — весьма сложная система. При каждом под-ключении к базе данных или выполнении команды UPDATE в фоновом режи-ме работает целый набор процессов, гарантирующих устойчивую работу при-ложений и поддержку целостности данных. Например, СУБД поддерживаетдостаточный объем информации для восстановления данных в исходное состо-яние при необходимости. Она кэширует данные и в случае необходимости по-вторно использует их. И так далее. В большинстве случаев все это происходитнезаметно (по крайней мере, для разработчика), но при возникновении про-блем половина успеха зависит от знания того, где искать их причину.

    В этой главе описаны три основных компонента архитектуры Oracle: структу-ра памяти (в частности, глобальная системная область — System Global Area),физические процессы и набор файлов (фалы параметров, файлы журнала по-вторного выполнения...). Знание архитектуры Oracle принципиально важно дляпонимания уникального способа реализации ряда возможностей в Oracle и еговлияния на приложения.

    • Глава 3. Блокирование и одновременный доступ. Различные СУБД выполняютодни и те же операции по-разному (то, что хорошо работает в SQL Server, мо-жет гораздо хуже работать в Oracle), и понимание реализации механизмов бло-кирования и управления одновременным доступом в Oracle жизненно важнодля создания успешно работающих приложений.

    В этой главе описан базовый подход к этим механизмам, используемый в СУБДOracle, типы применяемых блокировок (ЯМД, ЯОД, защелки...) и проблемы,возникающие при некорректной реализации блокирования (взаимные блоки-ровки, блокирование-доступа и эскалация блокировок). В разделе, посвящен-ном управлению одновременным доступом, описываются предоставляемыеСУБД Oracle функции, которые позволяют контролировать доступ пользовате-лей к базе данных и ее изменение.

    • Глава 4. Транзакции. Транзакции — фундаментальное свойство всех баз дан-ных; именно они отчасти отличают базу данных от файловой системы. И темне менее их часто понимают неправильно, а многие разработчики даже не по-дозревают, что вовсе их не используют. В этой главе описано, как правильноиспользовать транзакции в СУБД Oracle. Кроме того, автор обращает внима-ние на ряд "плохих привычек", приобретаемых при разработке приложений длядругих СУБД. В частности, рассматривается понятие неделимости транзакциии ее влияние на выполнение операторов в Oracle. Затем описываются операто-ры управления транзакциями (COMMIT, SAVEPOINT, ROLLBACK), ограни-чения целостности и распределенные транзакции (протокол двухфазной фик-сации). Наконец, рассматривается ряд реальных проблем использованиятранзакций: их регистрация и роль журнала повторного выполнения и сегмен-тов отката.

    Введение 21

  • Структуры и утилиты базы данных• Глава 5. Повторное выполнение и откат. Можно сказать, что разработчику не

    требуется столь же детально, как АБД, понимать работу журнала повторноговыполнения и сегментов отката, но разработчик должен представлять их зна-чение для базы данных. Обсудив назначение журнала повторного выполнения,мы опишем, что конкретно делает оператор COMMIT. Мы также рассмотримряд проблем, в частности объем генерируемой информации в журнале повтор-ного выполнения, отключение журнализации, а также проанализируем исполь-зование сегментов отката.

    В разделе главы, посвященном откату, мы сначала рассмотрим, какие опера-торы генерируют наибольший и наименьший объем данных для отката, а за-тем перейдем к SQL-оператору set transaction. Он обычно используется для за-дания большого сегмента отката для операции с большим объемом изменений.Затем мы займемся печально знаменитой ошибкой 'ORA-01555 snapshot too old',рассмотрим причины ее возникновения и способы предотвращения.

    • Глава 6. Таблицы. Oracle сейчас поддерживает несколько типов таблиц. В этойглаве рассмотрены все типы таблиц — произвольно организованные (обычные,"нормальные" таблицы), организованные по индексу, входящие в индексныйкластер, входящие в хеш-кластер, вложенные, временные и объектные — иописано, когда, как и почему имеет смысл использовать тот или иной тип. Вбольшинстве случаев произвольно организованных таблиц вполне достаточно,но вы должны понимать, когда другие типы могут оказаться более подходящими.

    • Глава 7. Индексы. Индексы — критический компонент проекта приложения.Правильная реализация индексов требует глубокого знания данных, их распре-деления и способов их использования. Слишком часто индексы считают второ-степенными структурами при разработке приложений, и от этого снижается ихпроизводительность.

    В этой главе мы детально рассмотрим различные типы индексов, включая ин-дексы на основе В-дерева, битовые индексы, индексы по функциям и индексыприкладных доменов, а также опишем, когда надо и не надо использовать ин-дексы определенного типа. В разделе "Часто задаваемые вопросы" мы дадимответы на некоторые из типичных вопросов типа "Работают ли индексы с пред-ставлениями?" и "А почему мой индекс не используется?".

    • Глава 8. Импорт и экспорт. Средства импорта и экспорта — одни из самых ста-рых инструментальных средств Oracle, используемые для извлечения таблиц,схем или всего определения базы данных из одного экземпляра Oracle и пере-носа их на другой экземпляр или в другую схему. Тем не менее, многие разра-ботчики не знают, как правильно их использовать. Мы рассматриваем пробле-мы экспорта больших объемов информации, разделения и переноса данных, ииспользования этих средств при резервном копировании или реорганизацииданных. Глава заканчивается описанием потенциальных ловушек и проблем прииспользовании средств экспорта и импорта данных.

    22 Введение

  • Введение

    • Глава 9. Загрузка данных. Эта глава посвящена утилите SQLLDR и описываетразличные способы использования этого средства для загрузки и измененияданных в базе данных. Среди рассмотренных тем — загрузка данных в форма-те записей с разделителями полей, обновление существующих строк и вставкановых, выгрузка данных и вызов утилиты SQLLDR из хранимой процедуры.Хотя SQLLDR тоже является давним и принципиально важным средством, но вотношении его практического использования возникает много вопросов.

    Производительность• Глава 10. Стратегии и средства настройки. Это одна из моих любимых тем, и в

    данной главе я детально описываю свой подход к настройке производительно-сти приложений Oracle, а затем предлагаю удобное практическое руководствопо применяемым средствам и методам. Начальный раздел посвящен настройкеприложений, включая такие темы, как связываемые переменные и синтакси-ческий анализ, утилиты SQL_TRACE, TIMED_STATISTICS и TKPROF, пакетDBMS_PROFILER и важность наличия средств журнализации в приложениях.После полной настройки приложений можно переходить к базе данных, в час-тности к группе утилит StatsPack и представлениям V$, широко используемымпри настройке.

    • Глава 11. Стабилизация плана оптимизатора. Разработчики, использующиеOracle 8i (и более новые версии), теперь могут сохранять набор "подсказок сер-веру", известный как план оптимизатора и детально описывающий, как лучшевыполнять в базе данных определенный SQL-оператор. Это дает несомненныепреимущества с точки зрения производительности, и мы детально описываемспособ генерации таких "шаблонов" (outlines) и управление ими.

    Расширенные возможности SQL• Глава 12. Аналитические функции. Некоторые вопросы об информации в базе

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

    • Глава 13. Материализованные представления. Некоторые "агрегирующие" зап-росы должны для получения ответа обрабатывать терабайты данных. Послед-ствия с точки зрения производительности очевидны, особенно если речь идет очасто выполняемом запросе — необходимость обработки огромного объемаданных при каждом его выполнении. При использовании материализованныхпредставлений мы просто делаем основную часть работы заранее — собираем

    23

  • 24данные, необходимые для ответа на запрос в материализованном представле-нии, и дальнейшие запросы выполняются к этим заранее собранным данным.Более того, СУБД может распознавать аналогичные запросы, использующие этиподготовленные данные, и автоматически переписывать запрос так, чтобы ониспользовал материализованное представление. В этой главе описано, как всеэто работает и как поддерживать материализованные представления, включаяиспользование ограничений, измерений и пакета DBMS_OLAP,

    • Глава 14. Фрагментация. Фрагментация создавалась как средство для упроще-ния управления очень �