效果:插入或更新索引选择

时间:2015-08-28 08:52:28

标签: java performance sql-server-2008 jdbc

我有一个包含9列的表格。这些列的5(我们称之为ABCDF)组合成一个唯一标识(主键)每一行。我们打电话给剩下的4 GHIJ

我正在尝试使用包含这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

如果结果有条目,我会像这样进行更新

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语句不在整个事务中。 UPDATEINSERT语句位于事务中(autocommit设置为false)。

现在我对CLUSTEREDABCD的组合使用F索引。也许NON-CLUSTERED会更好?

大多数调用都是UPDATE语句(类似于70%或更多) 总体任务需要很长时间才能完成(大约一个小时)。

为了改善所提到的任务的性能,你有什么想法,注意事项和注意事项吗?

我已经开始尝试将INSERTUPDATE语句作为批处理执行,但即使SELECT语句也需要太长时间。而且,为了避免任何运行时灾难,我应该为每个X条目执行批处理吗?

我正在使用Java和JDBC准备语句来执行命令和SQL Server 2008.没有使用ORM。

不考虑比赛条件。这是isolated任务。在此操作期间,不会从其他源/操作更改任何数据。

1 个答案:

答案 0 :(得分:0)

如果适合您,请按照以下步骤操作。

  1. 使用批量插入
  2. 在临时表中插入所有记录
  3. 创建一个存储过程
  4. 对于插入:    插入table_name(A,B,...)从#table_temp i中选择A,B,....              哪里不存在(选择A从table_name i1,其中i.A = i1.A和i.B = i1.B,....(所有PK))
  5. 更新:    update table_name set G = i.G,...    来自#table_temp i其中存在(选择A From table_name i1,其中i.A = i1.A和i.B = i1.B,....(所有PK))
  6. 致电此SP。
  7. 如果您需要帮助,请告诉我