Sql 服务器忽略 varchar 列上的索引,并在从 Java 查询时进行表扫描

Sql Server ignores index on varchar column and does tablescan when queried from Java

问题:我有一台 SQL 服务器 table,它有一个 varchar 列和数百万行,它已编入索引。 运行 来自 SQL 服务器查询工具的查询速度很快,因为它使用索引。当我 运行 来自 Java JDBC PreparedStatement 的查询时,它需要很多分钟,调查显示 SQL 服务器执行 table 扫描。我该如何解决这个问题?

答案:问题是由于 Java 将查询参数的 unicode 字符串传递给 SQLServer。 SQLServer 不会在 varchar 索引上使用它。

如果您希望该列保留为 varchar(或无法更改它)并且可以访问 Java 代码,请将 sendStringParametersAsUnicode 连接字符串 属性 设置为 "false"(默认"true")。搜索 "MSDN International Features of the JDBC Driver" 以获得更多详细信息,但也适用于 CHAR、VARCHAR 或 LONGVARCHAR 列。

如果您无权访问 Java 代码但可以更改数据库,将数据库中的 varchar 列更改为 nvarchar 将以双倍数据存储要求为代价解决问题。

示例

jdbc:sqlserver://localhost:1433;databaseName=mydb;sendStringParametersAsUnicode=false