Нет простого ответа «да / нет» - это уравновешивание, как и в случае многих проблем с производительностью.
Есть две основные затраты, связанные с индексами, которые должны быть сбалансированы с выгодами.
- Индексы должны поддерживаться при добавлении, удалении, изменении строк в таблице. Стоимость не огромна, но и ничтожна.
- Индексы занимают место на диске.
Существует также небольшая нагрузка, когда запросы оптимизируются просто потому, что нужно учитывать больше индексов.
Основным преимуществом хороших индексов является значительно улучшенная производительность при отборе данных, когда индекс можно использовать для хорошего эффекта.
Если ваши таблицы не очень изменчивы и часто подвергаются поиску по критериям, по которым могут помочь индексы, то, вероятно, имеет смысл создавать составные индексы, предполагая, что дисковое пространство не является проблемой.
Если ваши таблицы очень изменчивы, или если конкретный индекс будет использоваться редко (но выгодно в тех немногих случаях, когда он используется), то вам, возможно, следует сопоставить почти единовременную стоимость более медленного запроса с стоимость хранения и поддержки индекса в тех немногих случаях, когда его можно использовать.
Существует довольно хорошая книга на тему разработки индексов: Разработка индексов реляционных баз данных и оптимизаторы Лахденмяки и Лича (это также довольно дорого).
В последнем комментарии Фрэнк говорит:
[L] жду пару вещей. Как уже было сказано, самое простое, что нужно сделать - это позволить Informix начать возвращать строки, как только они у них появятся. (Oracle делает это по умолчанию.) Общая картина того, о чем просит Фрэнк, похожа на ту, что есть у Google. Хорошо, это действительно восходит к Alta Vista и к 90-м годам, когда мы говорили о поисковых индексах в сети. Идея состоит в том, что вы можете сделать быстрый поиск, подобрать первые n вещей, сообщив о «количестве» строк, возвращаемых в поиске. (Как будто число, указанное Google, является точным.)
Этот дополнительный комментарий Фрэнка имеет больше смысла в контексте вопроса, для которого это продолжение.
Очевидно, что если оператор SQL не заставляет Informix выполнять сортировку, он делает результаты доступными, как только они их получают; это всегда было. Подсказка по оптимизации FIRST_ROWS
указывает IDS, что если у него есть выбор из двух планов запросов, и один из них позволит ему производить первые строки быстрее, чем другой, то он должен предпочесть тот, который производит первые строки быстро, даже если он в целом дороже, чем альтернатива. Даже в отсутствие подсказки IDS все еще пытается сделать данные доступными как можно быстрее - она также пытается сделать это максимально эффективно.
Когда запрос подготовлен, вы получаете оценку того, сколько строк может быть возвращено - вы можете использовать это в качестве индикатора (несколько, довольно много, очень много). Кроме того, вы можете быстро и независимо определить количество строк в основной таблице, которую вы ищете. Учитывая эти метаданные, вы, безусловно, можете использовать технику с курсором прокрутки, чтобы предоставить вам резервное хранилище в базе данных, которая содержит значения первичных ключей интересующих вас строк. В любой момент вы можете загрузить массив с отображаемыми данными для набора интересных строк для отображения пользователю. По запросу пользователя вы можете организовать отображение другой страницы, полной информации. В какой-то момент процесса вы обнаружите, что достигли конца данных в курсоре прокрутки. Ясно, что если вы делаете FETCH LAST, вы заставляете это случаться. Если вы просто сделаете еще несколько FETCH NEXT, то в итоге вы получите условие NOTFOUND.
Все это стало возможным с Informix (IDS и его предыдущими воплощениями, OnLine, Turbo, SE и I4GL) с конца 80-х годов. Оптимизация FIRST_ROWS более поздняя; это все еще всего лишь подсказка оптимизатору, и, как правило, мало что меняет в том, что делает оптимизатор.