Кэширование? Большая производительность запросов для нескольких дополнительных фильтров

Я пытаюсь выяснить мои варианты для большого запроса, который занимает довольно много времени, но разумно, учитывая, что он делает. Он имеет много объединений и должен быть найден с заранее заданным количеством параметров. Некоторые из этих значений параметров предопределены (поле выбора), а некоторые представляют собой текстовое поле произвольной формы (к сожалению, LIKE с префиксами и суффиксами подстановочных знаков). Возвращаемые наборы данных являются большими, и параметры фильтра, вероятно, будут часто меняться. Порядок наборов результатов также контролируется пользователем. Кроме того, доступ пользователя должен быть ограничен только результатами, на которые пользователь имеет право. Это разрешение обрабатывается как часть базовой линии WHERE пункт, который применяется независимо от выбранных фильтров.

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

  1. Сначала мне пришло в голову кэширование, но я не думаю, что оно жизнеспособно в зависимости от вероятности изменения фильтров и возврата больших наборов данных.
  2. По моим исследованиям, такие параметры, как ElasticSearch и Solr, также не подойдут, так как наборы данных могут манипулировать моими несколькими программами, и эти хранилища данных быстро устаревают.

Существуют ли другие варианты улучшения воспринимаемой эффективности функции поиска с учетом этих требований?

1 ответ

Вы не предоставляете достаточно информации о своих таблицах и запросах для конкретного решения.

Как упомянуто в комментарии @jmarkmurphy, DB2 и IBM i делают свое собственное "кэширование". Я согласен, что вряд ли вы сможете улучшить его, работая с большими и разнообразными наборами результатов. Но вам нужно убедиться, что вы используете то, что предоставлено IBM. Например, если вы используете SQL, встроенный в RPGLE, убедитесь, что у вас нет set option CLOSQLCSR=*ENDMOD, Также проверьте настройки в QAQQINI, который вы используете.

Вы упомянули об использовании Visual Explain и создании некоторых запрошенных индексов. Это хорошее начало. Но так как запросы выполняются в производственном процессе, следите за кэшем плана, использованием индекса и рекомендованными индексами.

Наконец, вы упомянули, что вы просматриваете полные таблицы с использованием LIKE '%SOMETHING%', Опять же, без подробной информации о столбцах и данных, это предположение о том, что может быть полезным. Как предлагается в моем комментарии, Omnifind для IBM i может быть улучшением.

Тем не менее, Omnifind не является и улучшается LIKE, Omnifind предназначен для обработки лингвистических поисков. Из статьи я могу… найти иголку в стоге сена с помощью сервера текстового поиска OmniFind для DB2 for i:

SELECT story_id FROM story_library.story_table 
WHERE CONTAINS(story_doc, 'blind mouse') = 1;

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

Другие вопросы по тегам