Java 性能:插入或更新索引选择
我有一个9列的表。这些列中的5个组成了每行的唯一标识主键,我们称它们为A、B、C、D、F。让我们把剩下的4g,H,I,J 我试图用包含这5列的WHERE子句插入或更新150.000行。我现在正在做的是Java 性能:插入或更新索引选择,java,performance,sql-server-2008,jdbc,Java,Performance,Sql Server 2008,Jdbc,我有一个9列的表。这些列中的5个组成了每行的唯一标识主键,我们称它们为A、B、C、D、F。让我们把剩下的4g,H,I,J 我试图用包含这5列的WHERE子句插入或更新150.000行。我现在正在做的是 SELECT 1 FROM table_name WITH (NOLOCK) WHERE A = STRING_HERE AND B = STRING_HERE AND C = STRING_HERE AND D = NUMBER_HERE AND F = NUMBER_HERE
SELECT 1 FROM table_name WITH (NOLOCK)
WHERE A = STRING_HERE
AND B = STRING_HERE
AND C = STRING_HERE
AND D = NUMBER_HERE
AND F = NUMBER_HERE
如果结果有一个条目,我会这样更新
UPDATE table_name
SET G=NUMBER_HERE,
H=NUMBER_HERE,
I=NUMBER_HERE,
J=NUMBER_HERE
WHERE A = STRING_HERE
AND B = STRING_HERE
AND C = STRING_HERE
AND D = NUMBER_HERE
AND F = NUMBER_HERE
如果没有,我就执行一个INSERT语句
目前,SELECT语句不在整个事务中。
UPDATE和INSERT语句位于设置为false的事务自动提交中
现在,我在a、B、C、D和F的组合上使用聚集索引。也许非聚集索引会更好
大多数调用都是UPDATE语句,大约70%或更多
整个任务耗时太长,大约一个小时无法完成
为了提高上述任务的执行效率,你有什么想法和注意事项吗
我已经开始尝试批量执行INSERT和UPDATE语句,但即使是SELECT语句也会花费太长时间。此外,为了避免任何运行时灾难,我应该为每个X条目执行批处理吗
我正在使用Java和JDBC以及用于执行命令和SQLServer2008的准备好的语句。没有使用ORM
不考虑比赛条件。这是一项孤立的任务。在此操作期间,不会更改来自其他源/操作的数据 如果适合您,请按照以下步骤操作 使用大容量插入在临时表中插入所有记录 创建一个存储过程 插入: 插入表A、B、,。。。选择A、B、,。。。。来自表1 如果不存在,则从表_name i1中选择A,其中i.A=i1.A和i.B=i1.B,….所有PK 更新内容: 更新表格名称集G=i.G。。。 从存在的表_temp i中从表_name i1中选择A,其中i.A=i1.A和i.B=i1.B,….所有PK 叫这个SP。
如果您还需要帮助,请告诉我您是在一次插入/更新一条记录还是在做什么?这是一个事务,因此在结束时将调用一次提交。但是,是的,每个操作都是单一的。现在我正在将逻辑转换为使用批处理。这样会显著提高整体性能吗?如果是,那么我应该记住任何陷阱吗?是的,当然你会看到性能上的巨大差异,我建议插入和更新还有一件事,就是使用join/where子句,我的意思是你不需要检查每个记录,如果记录存在,那么更新else insert。如果您需要更多帮助,请告诉我。谢谢您的回复。你能提供一个例子说明justuse-join/where子句吗?此外,聚集索引是否合适,或者非聚集索引是否应该为上述场景提供更好的性能?显然,clustured会更好,您能告诉我如何进行批量更新/插入吗?