JPA данных Spring с SQL Server - функция lower () вызывает полное сканирование таблицы - PullRequest
0 голосов
/ 13 ноября 2018

В простом микросервисе SpringBoot (2.0.5) + JPA + SQL Server с сохранением через реализацию JpaRepository (без дополнительных методов) мы видим, как функция transact-sql lower() внедряется в сгенерированную оболочку SQLзапрошенный столбец (столбцы), который, в свою очередь, вызывает полное сканирование таблицы и, следовательно, влияет на производительность того, что в противном случае было бы простым и быстрым запросом с поддержкой индекса.

Очевидно, что это нужно сделатьзапросы нечувствительны к регистру, однако, поскольку SQL Server по умолчанию нечувствителен к регистру, нет необходимости вводить эту функцию.Из документов JPA Spring Data видно, что суффиксы методов репозитория с IgnoreCase должны делать запросы нечувствительными к регистру для тех БД, которые по умолчанию чувствительны к регистру, однако я не вижу, как настроить его так, чтобы он учитывал входящий регистр.

JPA config:

jpa:
  show-sql: true
  hibernate:
    naming:
      physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    dialect: org.hibernate.dialect.SQLServer2012Dialect
    ddl-auto: validate

Интерфейс репозитория:

@Repository
public interface MyRepo extends JpaRepository<Thing, Long>, QuerydslPredicateExecutor<Thing> {}

Я попытался удалить SQLServer2012Dialect из конфигурации - без разницы.Я не уверен, что дополнительное использование QueryDSL может оказать влияние - я постараюсь временно удалить это (хотя это необходимо).

1 Ответ

0 голосов
/ 13 ноября 2018

При более внимательном рассмотрении предиката QueryDsl это было не сложно (и само по себе) - изменилось использование equalsIgnoreCase() в предикате на eq(), и это решило проблему.Так что нет проблем в конфиге или библиотеках, но нужно знать.

...