SQL,选择和更新

时间:2009-01-03 21:16:58

标签: sql select sql-update

我正在尝试在包含100000行的数据库中选择100行,并在更新后更新这些行。

问题是我不想为此目的两次去DB,因为update只会将这些行标记为“read”。

有没有办法在java中使用简单的jdbc库来做到这一点? (希望不使用存储过程)

更新:好的,这里有一些澄清。

在不同的服务器上运行相同应用程序的几个实例,它们都需要选择100个根据creation_date列排序的“UNREAD”行,读取其中的blob数据,将其写入文件并将该文件ftp到某个服务器。 (我知道史前但要求是要求)

读取和更新部分用于确保每个实例获得不同的数据集。 (按顺序,像赔率和平均值一样的技巧不会起作用:/)

我们选择要更新的数据。数据通过线路传输(我们等待和等待),然后我们将它们更新为“READ”。然后释放锁定阅读。整个事情需要太长时间。通过同时读取和更新,我想减少锁定时间(从我们使用select更新到实际更新的时间),以便使用多个实例将增加每秒的读取行数。

还有想法吗?

4 个答案:

答案 0 :(得分:2)

在我看来,这里可能有不止一种方法来解释这个问题。

  1. 您正在为此选择行 更新它们的唯一目的和 不读它们。
  2. 您正在选择要显示的行 某人,并将其标记为 一次读一个或全部读一组。
  3. 您想要选择行和标记 它们在您选择时读取 它们。
  4. 让我们首先选择选项1,因为这似乎是最简单的。您不需要选择行来更新它们,只需使用WHERE子句发出更新:

    update table_x
    set read = 'T'
    where date > sysdate-1;
    

    查看选项2,您希望在用户读取它们时(或下游系统已收到它或其他任何内容)将它们标记为已读。为此,您可能需要进行另一次更新。如果查询主键,除了第一个选择中需要的其他列之外,您可能会更容易更新,因为数据库不必执行表或索引扫描来查找行

    在JDBC(Java)中,可以进行批量更新,您可以同时执行一组更新。当我需要执行大量完全相同的更新时,这很有效。

    选项3,您想要一次性选择和更新所有内容。我个人并没有太多用处,但这并不意味着其他人没有。我想某种存储过程会减少往返次数。我不确定你在这里使用什么数据库,并且不能真正提供细节。

答案 1 :(得分:1)

转到数据库并不是那么糟糕。如果你没有通过电线返回任何东西,那么更新不应该对你造成太大的伤害,而且只有几十万行。你有什么担心?

答案 2 :(得分:1)

如果您在JDBC中执行SELECT并在ResultSet上迭代以更新每一行,那么您做错了。这是一个永远不会表现良好的(n + 1)查询问题。

只需使用WHERE子句执行UPDATE,该子句确定需要更新哪些行。这是一次单一的网络往返。

不要过于以代码为中心。让数据库完成它的设计工作。

答案 3 :(得分:0)

不能在不关闭的情况下使用相同的连接吗?