我们正在使用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。
答案 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格式发送到服务器,而与该属性的设置无关。
谢谢。