【问题标题】:Sql Server ignores index on varchar column and does tablescan when queried from JavaSql Server 忽略 varchar 列上的索引并在从 Java 查询时执行表扫描
【发布时间】:2015-03-03 00:25:23
【问题描述】:

问题:我有一个带有一个 varchar 列和数百万行的 SQL Server 表,它已被索引。从 SQL Server 查询工具中运行查询很快,因为它使用索引。当我从 Java JDBC PreparedStatement 运行查询时,它需要很长时间,调查显示 SQL Server 执行了表扫描。我该如何解决这个问题?

【问题讨论】:

    标签: java sql-server indexing


    【解决方案1】:

    回答:问题是由于 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
    

    【讨论】:

    • 只知道这样做,您只是加倍该列的存储需求。另一种方法是让 Java 传递一个非 unicode 字符串。我敢肯定你不是第一个需要做这种事情的人......
    • @BenThul 感谢您的评论,已编辑答案以反映您的改进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2019-10-14
    相关资源
    最近更新 更多