Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当从Java查询时,Sql Server忽略varchar列上的索引并执行tablescan_Java_Sql Server_Indexing - Fatal编程技术网

当从Java查询时,Sql Server忽略varchar列上的索引并执行tablescan

当从Java查询时,Sql Server忽略varchar列上的索引并执行tablescan,java,sql-server,indexing,Java,Sql Server,Indexing,问题:我有一个SQL Server表,其中有一个varchar列和数百万行,它是索引的。在SQLServer查询工具中运行查询速度很快,因为它使用索引。当我从JavaJDBCPreparedStatement运行一个查询时,它需要很多分钟,调查显示SQLServer执行一个表扫描。如何解决此问题?回答:此问题是由于Java将查询参数的unicode字符串传递给SQLServer造成的。SQLServer不会在varchar索引上使用此选项 如果希望列保持为varchar(或无法更改),并且可以访

问题:我有一个SQL Server表,其中有一个varchar列和数百万行,它是索引的。在SQLServer查询工具中运行查询速度很快,因为它使用索引。当我从JavaJDBCPreparedStatement运行一个查询时,它需要很多分钟,调查显示SQLServer执行一个表扫描。如何解决此问题?

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

如果希望列保持为varchar(或无法更改),并且可以访问Java代码,请将SendStringParametersUnicode连接字符串属性设置为“false”(默认为“true”)。有关更多详细信息,请搜索“JDBC驱动程序的MSDN国际功能”,但也适用于CHAR、VARCHAR或LONGVARCHAR列

如果您没有访问Java代码的权限,但可以更改数据库,那么将数据库中的varchar列更改为nvarchar将以加倍数据存储需求为代价来解决问题

范例


要知道,这样做只会使该列的存储需求增加一倍。另一种方法是让Java传递非unicode字符串。我相信你不是第一个需要做这种事情的人…@BenThul谢谢你的评论,答案经过编辑以反映你的进步。
jdbc:sqlserver://localhost:1433;databaseName=mydb;sendStringParametersAsUnicode=false