查询执行时间是否会因具有巨大表的不同查询参数值而有所不同?

时间:2018-09-22 11:44:22

标签: sql-server spring-boot spring-batch query-optimization mssql-jdbc

我们正在使用Spring Boot,SQL Server和Azure云。

目标是在具有52个表的表中逐批更新2000条记录 百万行而不使用本地查询。

该表有一个外键,每个外键都有大量行,并按外键值进行分区。

样本表

seq |  id | value
-------------------
1   | A1  | v1  
2   | A1  | v2  
3   | B1  | v3
4   | B1  | v4

... 实际的查询是

select * from sample where id=? and value in (?) 
2 parameter will have 2000 strings.

using Spring data JPA repository methods.

A1有10万条记录。 B1有40万条记录。

当我使用A1和2000值执行查询时,花了17秒来获取。 B1和另外2000个值(A1没有),花了70秒从应用程序中获取。

但是当我在SSM中执行相同的查询时,只需要3秒钟。

是因为从400K / 52M中过滤了B1,还是从100K / 52M中过滤了A1?

连接字符串具有sendStringParametersAsUnicode=false;,并且两列也都有索引。

尝试对每一行进行CriteriaUpdate,但结果相同-2K / 100K / 52M为35s,2K / 400K / 52M为2分钟。因此将其删除,然后尝试此操作,一次获取所有内容并立即更新所有内容。无论如何,更新的速度更快,只有获取需要时间。

注意: 我们没有将spring batch用于该特定过程,因为将从Flatfile中读取记录,并且必须在该表中更新文件中的每一行。因此,有一个读取器可以从文件中读取行,处理器对DTO进行按摩,并在写入器中尝试执行此更新。块大小为2000。

1 个答案:

答案 0 :(得分:1)

好吧,它的运行速度比以往任何时候都要快。现在,获取操作只需几毫秒。

我的JDBC连接字符串在属性文件中有sendStringParametersAsUnicode=false;

但是实际上是从没有此文件的Deployment.yaml文件中选择了它。

sendStringParametersAsUnicode=false;

doc

  

如果sendStringParametersAsUnicode属性设置为“ true”,则将字符串参数以Unicode格式发送到服务器。

     

如果sendStringParametersAsUnicode属性设置为“ false”,则将字符串参数以非Unicode格式(例如ASCII / MBCS而不是Unicode)发送到服务器。

     

sendStringParametersAsUnicode属性的默认值为“ true”。

     

注意:仅在发送带有CHAR,VARCHAR或LONGVARCHAR JDBC类型的参数值时,才检查sendStringParametersAsUnicode属性。新的JDBC 4.0国家字符方法(例如SQLServerPreparedStatement和SQLServerCallableStatement类的setNString,setNCharacterStream和setNClob方法)始终将其参数值以Unicode格式发送到服务器,而与该属性的设置无关。

谢谢。

相关问题