Проблема в том, что Firebird не может оптимизировать LIKE
, когда используется переменная связывания, потому что он не знает, какое значение вы собираетесь использовать, поэтому он должен принять наихудший случай и создать план, который не может использовать индексдля поля.
С другой стороны, когда вы используете литерал, который заканчивается только %
-wildcard (и не содержит подстановочных знаков _
или %
в других местах), Firebird может оптимизироватьиспользовать индекс.Например, когда вы используете allacc0_.code like 'FIMA%'
, тогда Firebird выполнит ваш запрос, как если бы вы использовали allacc0_.code starting with 'FIMA'
, а starting with
может использовать индекс, если он доступен.
Если вы хотитеЭквивалентное поведение с параметрами, затем перепишите ваш запрос, чтобы использовать вместо него starting with
:
Query nativeQuery = mEntityManager.createNativeQuery("select first 100 * from ALL$ACC allacc0_ where allacc0_.code starting with ? order by allacc0_.code asc");
nativeQuery.setParameter(1, "FIMA");
Это также задокументировано в справочнике по языку Firebird для LIKE
:
О LIKE
и оптимизаторе
[..] предикат LIKE
не использует индекс.Однако, если предикат принимает форму LIKE 'string%'
, он будет преобразован в предикат STARTING WITH
, который будет использовать индекс.
Так что, если вам нужно найти начало строки,рекомендуется использовать предикат STARTING WITH
вместо предиката LIKE
.