Об авторе | 11 |
|
Вступление | 12 |
|
Предисловие | 14 |
Цели этой книги | 15 |
Аудитория этой книги | 15 |
Структура книги | 16 |
Условные обозначения | 17 |
Комментарии и вопросы | 18 |
Благодарности | 19 |
От издательства | 20 |
|
1. Введение | 21 |
Зачем настраивать SQL? | 21 |
Кто должен настраивать SQL? | 23 |
Чем может помочь эта книга | 25 |
Бонус | 26 |
«Внешние» решения | 27 |
|
2. Основы доступа к данным | 29 |
Кэширование в базе данных | 30 |
Таблицы | 33 |
Последовательный рост | 34 |
Удаление самых старых данных | 35 |
Удаление данных вне зависимости от возраста | 35 |
Полное удаление и рост с нуля | 36 |
Индексы | 36 |
Индексы в В-деревьях | 36 |
Стоимость индекса | 39 |
Редкие объекты базы данных | 40 |
Таблицы с индексной организацией | 40 |
Однотабличные кластеры | 41 |
Многотабличные кластеры | 42 |
Таблицы с разбиениями | 42 |
Растровые индексы | 43 |
Пути доступа для одной таблицы | 43 |
Полное сканирование таблицы | 44 |
Индексный доступ к таблицам | 45 |
Выбор между полным сканированием таблицы и индексным доступом | 47 |
Вычисление селективности | 50 |
Селективность фильтра | 50 |
Селективность условия на диапазоне индекса | 52 |
Селективность для строк таблицы, полученных при помощи индекса | 56 |
Комбинирование индексов | 58 |
Соединения | 59 |
Типы соединений | 59 |
Способы обработки соединений | 61 |
|
3. Просмотр и интерпретация планов выполнения | 66 |
Чтение планов выполнения в Oracle | 67 |
Подготовка | 67 |
Процесс, лежащий в основе отображения планов выполнения | 67 |
Практический процесс отображения планов выполнения | 69 |
Надежные планы выполнения | 70 |
Ненадежные планы выполнения | 75 |
Сложные планы выполнения | 76 |
Чтение планов выполнения в DB2 | 77 |
Подготовка | 78 |
Процесс, лежащий в основе отображения планов выполнения | 78 |
Практический процесс отображения планов выполнения | 81 |
Надёжные планы выполнения | 82 |
Ненадёжные планы выполнения | 86 |
Сложные планы выполнения | 87 |
Чтение планов выполнения в SQL Server | 88 |
Отображение планов выполнения | 88 |
Как интерпретировать план | 90 |
Интерпретация плана выполнения | 91 |
Интерпретация ненадёжных планов выполнения | 93 |
Сложные планы выполнения | 93 |
|
4. Управление планами выполнения | 96 |
Универсальные техники управления планами | 96 |
Использование правильного индекса | 97 |
Запрещение использования неправильных индексов | 100 |
Использование желаемого порядка соединения | 101 |
Запрещение соединения в неправильном порядке | 102 |
Выбор порядка выполнения для внешних запросов и подзапросов | 103 |
Предоставление стоимостному оптимизатору хороших данных | 105 |
Обман стоимостного оптимизатора плохими данными | 106 |
Управление планами в Oracle | 107 |
Управление выбором оптимизатора в Oracle | 109 |
Управление синтаксическими планами выполнения в Oracle | 112 |
Управление стоимостными планами выполнения в Oracle | 113 |
Управление планами в DB2 | 120 |
Подготовка к оптимизации в DB2 | 121 |
Выбор уровня оптимизации | 122 |
Изменение запроса | 123 |
Управление планами в SQL Server | 125 |
Подготовка к оптимизации в SQL Server | 125 |
Изменение запроса | 126 |
Примеры подсказок | 127 |
Использование FORCEPLAN | 130 |
|
5. Диаграммное изображение простых запросов SQL | 131 |
Зачем нужен новый метод? | 131 |
Полные диаграммы запросов | 133 |
Информация, отображаемая в диаграммах запросов | 133 |
Что не входит в диаграммы запросов | 135 |
Когда диаграммы запросов помогают лучше всего | 137 |
Абстрактная демонстрация использования диаграмм запросов | 138 |
Создание диаграмм запросов | 139 |
Более сложный пример | 142 |
Сокращения | 147 |
Интерпретация диаграмм запросов | 149 |
Упрощенные диаграммы запросов | 151 |
Упражнения | 153 |
|
6. Выбор наилучшего плана выполнения | 157 |
Надёжные планы выполнения | 157 |
Обычный эвристический порядок соединения | 159 |
Простые примеры | 160 |
Порядок 8-стороннего соединения | 161 |
Окончательное решение для 8-стороннего соединения | 163 |
Сложное 17-стороннее соединение | 164 |
Особый случай | 168 |
Решение для Oracle | 168 |
Решение специфичной проблемы для других серверов | 170 |
Сложный пример | 171 |
Специальные правила для особых случаев | 175 |
Безопасные декартовы произведения | 176 |
Детальные коэффициенты фильтрации, близкие к 1,0 | 181 |
Коэффициенты соединения, меньшие 1,0 | 182 |
Близкие коэффициенты фильтрации | 191 |
Случаи, когда нужно выбрать соединения хэшированием | 195 |
Упражнение | 199 |
|
7. Диаграммное изображение и настройка сложных SQL-запросов | 201 |
Необычные диаграммы соединений | 202 |
Графы циклических соединений | 202 |
Несвязные диаграммы запросов | 210 |
Диаграммы запросов с несколькими корневыми узлами | 212 |
Соединения без первичных ключей | 217 |
Соединения вида «один к одному» | 218 |
Внешние соединения | 222 |
Запросы с подзапросами | 228 |
Изображение запросов с подзапросами на диаграммах | 229 |
Настройка запросов с подзапросами | 238 |
Запросы с представлениями | 240 |
Диаграммное изображение запросов, использующих представления | 241 |
Настройка запросов с представлениями | 244 |
Запросы с операциями над множествами | 250 |
Упражнение | 251 |
|
8. Почему метод диаграмм работает | 253 |
Аргументы в пользу вложенных циклов | 253 |
Выбор ведущей таблицы | 255 |
Выбор следующей таблицы для соединения | 258 |
Объяснение различной стоимости считывания строки | 260 |
Объяснение преимуществ от поздних соединений | 260 |
Когда следует выбирать ранние соединения с узлами наверху | 260 |
Резюме | 262 |
|
9. Особые случаи | 263 |
Внешние соединения | 263 |
Шаги порядка оптимизации нормального внешнего соединения | 265 |
Пример | 266 |
Совмещённые соединения и фильтрующие индексы | 268 |
Отсутствующие индексы | 271 |
Соединения, не прошедшие фильтрацию | 273 |
Неразрешимые проблемы | 273 |
|
10. Решения сложных проблем | 276 |
Когда очень быстро — это ещё недостаточно быстро | 276 |
Как избежать повторяющихся запросов при помощи кэширования | 277 |
Объединённые запросы | 279 |
Слияние повторяющихся запросов с предыдущим запросом | 279 |
Запросы, которые возвращают слишком много данных | 281 |
Объёмные оперативные запросы | 281 |
Объёмные пакетные отчёты | 284 |
Агрегационные данные многих детальных записей | 290 |
Промежуточные процессы обрабатывают слишком много строк | 291 |
Настроенные запросы, которые медленно возвращают несколько строк | 293 |
Почему иногда запросы считывают много строк, а возвращают лишь несколько | 293 |
Оптимизация запросов с распределёнными фильтрами | 294 |
|
Приложение А. Решения задач | 297 |
Решения для задач из главы 5 | 297 |
Упражнение 1 | 297 |
Упражнение 2 | 298 |
Упражнение 3 | 298 |
Упражнение 4 | 299 |
Упражнение 5 | 300 |
Упражнение 6 | 300 |
Решение для задачи из главы 6 | 301 |
Решение для задачи из главы 7 | 307 |
|
Приложение Б. Полный и непрерывный процесс | 310 |
Сокращение запроса до диаграммы запроса | 310 |
Создание скелета запроса | 310 |
Создание упрощённой диаграммы запроса | 312 |
Создание полной диаграммы запроса | 312 |
Решение диаграммы запроса | 314 |
Проверка планов выполнения | 315 |
Получение плана выполнения в Oracle | 315 |
Получение плана выполнения в DB2 | 316 |
Получение плана выполнения в SQL Server | 318 |
Изменение базы данных для получения лучшего плана | 319 |
Изменение SQL-кода для получения хорошего плана | 319 |
Изменение приложения | 320 |
Взгляд в будущее | 320 |
|
Глоссарий | 322 |
|
Алфавитный указатель | 331 |