Intereting Posts
Группирование и обновление таблицы больших баз данных Выполнение SQL-скрипта, хранящегося в качестве ресурса Как заменить пустые (нулевые) значения на 0 для всех записей? Можете ли вы получить доступ к значению автоматического увеличения в MySQL в одном выражении? MySQL – использование функций COUNT и LIMIT вместе Unpivot динамических столбцов для строк – отсутствие данных из последних столбцов SQL-запросы с участием «для всех» Получает ли Oracle все строки перед оценкой rownum? Создать имя месяца, имя дня, номер недели и день между двумя датами Количество уникальных символов в строке Добавление к существующей таблице SQLite при добавлении меньше столбцов, без чтения базы данных в R Как вывести все числовые последовательности из строки с регулярным выражением Oracle? MySQL теперь () +1 день Категории из 2 ComboBox, влияющих на третий Combobox для datagridview с SQL MySQL: «Неизвестный столбец в разделе where» во время операции обновления

Мне нужно выполнить поиск по шаблону, используя% на обоих концах, как я могу повысить производительность?

Я буду реализовывать это в sql-стороне, поэтому у меня будет что-то вроде

where company.name like '%:parameter%' 

Ранее я читал, что это сделает невозможным использование БД для индекса company.name.

Тогда мой вопрос будет, какие еще варианты я должен минимизировать снижение производительности, которое это приведет к поиску? Обратите внимание, что это требования клиентов, поэтому у меня нет возможности не реализовывать (хотя я объяснил им, что это следствие производительности).

Приложение использует Sybase SE 12.5.3 (на основе драйвера, используемого в DBArtisan 8.5.5)

Я не знаю Sybase, но вы могли бы что-то сделать по строкам ниже:

  • Создайте второе поле, которое является обратным имени компании.
  • Добавьте индекс в это новое поле
  • Используйте следующее:

    WHERE имя_компании как ': параметр%' или обратное_имя типа Reverse (параметр) + '%'

Надеюсь, это указывает на то, что вы в хорошем направлении

Возможность выходит, что индекс потенциально может быть использован, но его маловероятно (см. Этот комментарий ). Если возможно, я бы запросил на основе другого проиндексированного поля, а затем подберем эти результаты, чтобы, по крайней мере, избежать полного сканирования таблицы.

Ты мертв, это убийца производительности.

Один из методов, который мы использовали в прошлом, – хранить все возможные названия компаний в отдельной таблице, ссылаясь на основную таблицу. Это ваш классический компромисс между временем и пространством для оптимизации.

Другими словами, допустим, у вас есть две компании в вашей основной таблице, ICBM и Microsloth .

Вы можете создать другую таблицу, содержащую следующее:

 TextSegment varchar(?) indexed ActualCompany varchar(?) 

и заполнить его следующим образом:

 TextSegment ActualCompany ----------- ------------- ICBM ICBM CBM ICBM BM ICBM M ICBM Microsloth Microsloth icrosloth Microsloth crosloth Microsloth rosloth Microsloth osloth Microsloth sloth Microsloth loth Microsloth oth Microsloth th Microsloth h Microsloth 

Затем, когда вы ищете компании, похожие на %slo% , вы можете использовать:

 select ActualCompany from LookupTable where TextSegment like 'slo%' 

Это позволяет вам более эффективно использовать индекс для этой таблицы, поскольку %...% в другой таблице.

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

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