首页 > 解决方案 > 当数字数据存储在varchar列中时,如何解决查询记录时的性能差异?

问题描述

我正在尝试MSSQL使用 jpa 查询 dsl 库(包com.querydsl.jpa.impl.JPAQuery)查询我的数据库,并在运行查询时发现性能问题。我正在使用 java api 来执行查询 dsl predicate

我的表有一个名为的列point_id,其类型是Varchar(20)并且用于存储数值,即数值为字符串。

当我尝试查询时(也由查询 dsl 完成

从 TestPerformanceObject testperfor0_ where (testperfor0_.point_id in (1, 2) 中选择 testperfor0_.serv_code 作为 hm_serv_8_5_,testperfor0_.version 作为 version9_5_;

与查询相比,性能非常低

从 TestPerformanceObject testperfor0_ where ( testperfor0_.point_id in ('1,'2' ) 中选择 testperfor0_.serv_code 作为 hm_serv_8_5_,testperfor0_.version 作为 version9_5_;

第二个查询和 dsl 完成的查询之间的区别在于数据是用单引号提供的。表示在执行查询时会有一个转换 ( ),这里to_char()也讨论了这个性能问题。

有什么解决方案吗?

编辑:该列是 Varchar(20) 类型,因为它也可以包含非数字值。

标签: sql-serverjpaquerydsl

解决方案


您真正的问题实际上始于您的主题句:

我的表有一个名为 point_id 的列,其类型为 Varchar(20),用于存储数值,即数值为字符串。

如果您尝试存储数值,那么您应该使用某种数字列,而不是一个varchar或其他文本列。

话虽如此,性能差异似乎是由于此版本的查询发生的隐式转换:

where testperfor0_.hm_inv_point_id in (1, 2)

如果您必须坚持使用当前的数据模型,那么您应该point_id与文本值进行比较。因此,从您的 JPA 代码中确保您将 Java 字符串绑定到该IN子句。


推荐阅读