Grails 查询强制对字符串参数进行隐式转换

Grails query forcing implicit conversion on string parameters

我是 运行 一个带有字符串参数的简单 grails 查询。查看在 SQL 服务器分析器中生成的查询时,该查询强制从 nvarchar 隐式转换为 varchar,这会导致性能问题。

简单的 Grails 查询:

Book.findByTitle("To Catch A Mocking Bird")

图书域名:

class Book {
    String title
    Date dateCreated
    Date lastUpdated

    static constraints = {
    }
}

SQL Table 列(由 Grails 生成):

<table>
  <thead>
    <tr>
      <th>table_name</th>
      <th>column_name</th>
      <th>data_type</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>book</td>
      <td>id</td>
      <td>bigint</td>
    </tr>
    <tr>
      <td>book</td>
      <td>version</td>
      <td>bigint</td>
    </tr>
    <tr>
      <td>book</td>
      <td>date_created</td>
      <td>datetime2</td>
    </tr>
    <tr>
      <td>book</td>
      <td>last_updated</td>
      <td>datetime2</td>
    </tr>
    <tr>
      <td>book</td>
      <td>title</td>
      <td>varchar</td>
    </tr>
  </tbody>
</table>

探查器中的查询:

declare @p1 int
set @p1=5
exec sp_prepexec @p1 output,N'@P0 int,@P1 nvarchar(4000)',N'/* criteria query */ select TOP(@P0) this_.id as id1_24_0_, this_.version as version2_24_0_, this_.title as title3_24_0_, this_.date_created as date_cre5_24_0_, this_.last_updated as last_upd7_24_0_, from book this_ where this_.title=@P1                ',1,N'To Catch A Mocking Bird'
select @p1

注意参数是String "To Catch A Mocking Bird" table "title" 列的类型是 "varchar" sp_prepexec 语句将参数字符串作为 nvarchar(4000)。这会导致隐式转换,可能会产生负面性能问题。

由于查询语句是由 Grails 中的 GORM/Hibernate 生成的,我无法控制查询语句的创建。

这是一个错误,还是需要设置一些配置以便语句采用 varchar 而不是 nvarchar?

环境:

  1. Grails: 3.3.8
  2. Gorm:6.1.10
  3. 休眠:5.1.5
  4. SQL 服务器:12.0.2269

您应该配置 JDBC 驱动程序。默认情况下,字符串参数将以 Unicode 格式发送到数据库服务器,因此如果您未在连接中配置它 url,它将发送 VARCHAR 参数值作为 NVARCHAR

在数据源配置中将 sendStringParametersAsUnicode 参数设置为 false。 更多信息 here.