sql-server - 当数字数据存储在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) 类型,因为它也可以包含非数字值。
解决方案
您真正的问题实际上始于您的主题句:
我的表有一个名为 point_id 的列,其类型为 Varchar(20),用于存储数值,即数值为字符串。
如果您尝试存储数值,那么您应该使用某种数字列,而不是一个varchar
或其他文本列。
话虽如此,性能差异似乎是由于此版本的查询发生的隐式转换:
where testperfor0_.hm_inv_point_id in (1, 2)
如果您必须坚持使用当前的数据模型,那么您应该point_id
与文本值进行比较。因此,从您的 JPA 代码中确保您将 Java 字符串绑定到该IN
子句。
推荐阅读
- fortran - (1) 处的“dlantr”不是函数
- mongodb - 我可以使用 axon 框架和 Spring Boot 开发多租户应用程序吗?
- cdn - 使用 Vue 3 的 CDN 支持 Vuelidate
- javascript - CSS 网格不会放置使用 React 和 array.map 创建的项目
- c# - 如何在 ASP.Net Api 中搜索所有字段
- angular - Angular 应用程序在本地使用 IE11,但在 IIS 上托管时不使用
- javascript - 无法接收从客户端 1 发送到服务器并返回到客户端 2 的套接字数据
- javascript - 在 Azure 上提供 React App 时出现 ENOENT 错误
- javascript - 需要从 GAS Web 应用程序上的先前条目中检索特定数量的数据
- excel - 通过在 Excel VBA 中使用 ADO 对 Redshift 使用多行插入来提高性能