Создание и управление индексами. Создание и управление встроенными процедурами. Оптимизация производительности запросов. Управление транзакциями и блокировками, страница 30

*  Если существует множество индексов и все они полезны, оптимизатор запросов:

o  Просматривает таблицу, используя индексы для каждой колонки;

o  Сортирует пригодные значения для каждой колонки;

o  Комбинирует результат;

o  Возвращает подходящие строки, используя операцию поиска с закладками.

Оптимизатор запросов преобразует оператор IN в OR

14.2 Запросы, которые содержат оператор Join

Порядок, в котором оптимизатор запросов обрабатывает объединённые таблицы, определяется существующими индексами и опцией WHERE, в дополнении используется выборочность и плотность данных.

Выборочность оператора JOIN, это процент строк из одной таблицы, которые объединяются с одной строкой другой таблицы. Выборочность получается из количества строк, которые приблизительно должны быть возвращены. Маленькая выборочность возвращает много строк, а большая – возвращает мало строк. Основа это множественные строки в обеих таблицах после утверждений (WHERE) на объединённые таблицы.

Вы можете подсчитать выборочность оператора JOIN, используя плотность данных. Оптимизатор запросов определяет выборочность оператора JOIN, основываясь на следующих параметрах.

*  Если статистика доступна, выборочность объединения основывается на плотность индексов для всех колонок.

*  Если статистика недоступна, потому что индексы не существуют, то существующие индексы не полезны или не включены в оператор WHERE.

Рассмотрим следующий пример:

*  Таблица Employee содержит 1000 строк;

*  Таблица department содержит 100 строк;

*  Данные распределены равномерно (10 работников на департамент)

*  Не существует индексов и статистики

USE Credits

SELECT *

FROM department AS dept INNER JOIN employee AS empl

ON dept.deptno=empl.deptno

Когда индекс не существует на колонку, с помощью которой происходит объединение, оптимизатор запросов использует стратегию объединения, которая определяет, какая таблица является внешней, а какая внутренней.

Если какое-то условие существует в операторе WHERE, оптимизатор запросов может использовать ограничения для начального определения, как объединить таблицы. Это определение основывается на выборочности.

Управление транзакциями и блокировками

15.1 Введение

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

Блокировки предотвращают конфликты обновления. Пользователи не могут читать или модифицировать данные, которые другие пользователи изменяют. Рассматривайте следующие факты о блокировках:

*  Блокировки делают доступным выпуск по частям транзакции так, чтобы только один человек в определённый момент мог изменять данные.

*  Сервер SQL динамически устанавливает и регулирует необходимый уровень блокировок в течении транзакции. Возможно также ручное регулирование того, как определённые блокировки используются.

*  Блокировки необходимы для конкурентных транзакций, чтобы позволить пользователям обновлять данные в один момент времени.

Контроль конкуренции гарантирует, что изменения, которые делает один человек, не будут неблагоприятно изменены другими пользователями. Существует два типа:

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

2.  Оптимистическая конкуренция не блокирует данные, когда они читаются. Сервер SQL проверяет затронутые данные на изменение и если они были изменены, то пользователь получает ошибку и должен  повторить транзакцию. Используйте этот метод, когда мало соединений к существующим данным и маленькая цена отката транзакции.