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?
环境:
- Grails: 3.3.8
- Gorm:6.1.10
- 休眠:5.1.5
- SQL 服务器:12.0.2269
您应该配置 JDBC 驱动程序。默认情况下,字符串参数将以 Unicode 格式发送到数据库服务器,因此如果您未在连接中配置它 url,它将发送 VARCHAR
参数值作为 NVARCHAR
。
在数据源配置中将 sendStringParametersAsUnicode
参数设置为 false
。
更多信息 here.
我是 运行 一个带有字符串参数的简单 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?
环境:
- Grails: 3.3.8
- Gorm:6.1.10
- 休眠:5.1.5
- SQL 服务器:12.0.2269
您应该配置 JDBC 驱动程序。默认情况下,字符串参数将以 Unicode 格式发送到数据库服务器,因此如果您未在连接中配置它 url,它将发送 VARCHAR
参数值作为 NVARCHAR
。
在数据源配置中将 sendStringParametersAsUnicode
参数设置为 false
。
更多信息 here.