Направление сортировки индексов в Firebird является важным. Ошибочно было бы предполагать, что один и тот же индекс может быть использован для сортировки или поиска "в обоих направлениях" - от меньшего к большему и от большего к меньшему. В практике индексы ASC (ASCENDING, в возрастающем порядке) помогут в поиске относительно небольшого количества значений, в то время как индексы DESC (DESCENDING, В убывающем порядке) будут полезными при большом количестве значений.
Если автоматический индекс ASC (по умолчанию), то не будет проблем, если вам нужно определить индекс DESC, использующий тот же столбец (столбцы). Обратное также верно: в Firebird 1.5 и выше вы можете выбрать для автоматически создаваемых индексов убывающий порядок. Оптимизатор не "расстроится", если вы также создадите возрастающий индекс для тех же столбцов.
Планы запросов
Перед выполнением запроса комплект программ подготовки - известный как оптимизатор- начинает анализировать столбцы и операции запроса для вычислен? самого быстрого способа выполнения. Подготовка начинается с просмотра индексов таблицы и используемых столбцов. Работая таким образом с последовательностью путей решения (каждый из которых имеет свою "стоимость"), оптимизатор создает план - некий вид "дорожной карты" того пути, по которому сервер будет следовать при выполнении запроса. Конечный план выбирается по критерию "самой дешевой" дороги, оцениваемой в соответствии с индексами, которые могут быть использованы.
План оптимизатора может быть просмотрен в isql двумя способами.
* По умолчанию isql не отображает план. Используйте SET PLAN ON для отображения плана в самом начале вывода запроса SELECT.
* Используйте SET PLANONLY для рассмотрения запроса и просмотра плана без фактического выполнения запроса. Это позволяет вам анализировать план любого запроса, а не только запросов SELECT.
Можно перекрыть план запроса оптимизатора вашим собственным планом, включив предложение PLAN в оператор запроса. Большинство инструментов графического интерфейса сторонних разработчиков обеспечивают возможность просматривать план, выполняя или не выполняя запрос, и перекрывать его.
! ! !
СОВЕТ. Не перекрывайте план оптимизатора, пока вы не протестировали ваш собственный и не убедились, что он выполняется быстрее на реальных данных.
. ! .
Более подробную информацию о планах запроса см. в разд. "Тема оптимизации" главы 20. Подробности использования isql см. в главе 37.
Как могут помочь индексы
Если оптимизатор принимает решение использовать индекс, он отыскивает страницы индекса для поиска требуемых значений ключа и использует указатель для локализации выбранных строк на страницах данных этой таблицы. Поиск данных выполняется быстро, потому что значения индекса упорядочены. Это позволяет системе локализовать нужные значения напрямую по указателю и полностью исключает просмотр ненужных строк. Обычно использование индекса требует чтения меньшего количества страниц, чем "прогулка по" всем строкам в таблице. Индекс по размеру мал по сравнению с размером строки в таблице и, если было выполнено хорошее проектирование индекса, занимает меньшее количество страниц базы данных, чем строки таблицы.
Сортировка и группирование
Когда столбцы, указанные в предложениях ORDER BY или GROUP BY, являются индексированными, оптимизатор может упорядочить выходные данные, просматривая индексы, и собирать упорядочиваемые наборы быстрее, чем без использования индексов.
Убывающий индекс для группы столбцов может увеличить скорость выполнения запросов для агрегатной (обобщающей) функции мах(), потому что получение строки с максимальным значением требует только одного обращения. Информацию об использовании функциональных выражений в запросах см. в главах 21 и 23.
Соединения
Для соединений оптимизатор выполняет процесс слияния потоков данных на основании соответствия значений, явно или неявно указанных в критерии ON. Если какой- нибудь индекс доступен для столбца или столбцов на одной стороне соединения, оптимизатор создает свой начальный поток, используя этот индекс для соответствия ключа соединения с его корреспондентом из таблицы другой стороны соединения. При отсутствии индекса на любой из сторон он должен сначала создать образ одной стороны, а затем просматривать его с целью выборки из таблицы другой стороны соединения.
Сравнения
Когда сравнивается индексированный столбец для определения, является ли его значение больше, равно или меньше значения константы, то значение индекса используется в таком сравнении, и несоответствующие строки не выбираются. При отсутствии индекса все строки-кандидаты будут читаться и сравниваться последовательно.
Что индексировать
Величина времени, затрачиваемая на поиск во всей таблице, прямо пропорциональна количеству строк в таблице. Индекс для столбца может означать разницу между немедленным ответом на запрос и долгим ожиданием. Так почему бы не индексировать каждый столбец?