【问题标题】:SQL, selecting and updatingSQL,选择和更新
【发布时间】:2009-01-03 21:16:57
【问题描述】:

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

问题是我不想为此目的两次访问数据库,因为更新只会将这些行标记为“已读”。

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

更新:好的,这里有一些说明。

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

读取和更新部分是为了确保每个实例获取不同的数据集。 (按顺序,奇数和偶数之类的技巧不会起作用:/)

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

还有想法吗?

【问题讨论】:

    标签: sql select sql-update


    【解决方案1】:

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

    1. 您正在为 更新它们的唯一目的和 不读它们。
    2. 您正在选择要显示的行 给某人,并将他们标记为 一次阅读一篇或全部阅读。
    3. 您要选择行并标记 它们在您选择时已阅读 他们。

    让我们先选择选项 1,因为这似乎是最简单的。您无需选择行来更新它们,只需使用 WHERE 子句发出更新:

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

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

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

    选项 3,您希望一次性选择和更新所有内容。我个人觉得这没什么用,但这并不意味着其他人没有。我想某种存储过程会减少往返。我不确定您在这里使用的是什么数据库,也无法提供具体细节。

    【讨论】:

      【解决方案2】:

      去数据库还不错。如果您没有“通过网络”返回任何内容,那么更新不应该对您造成太大的损害,而且它只有几十万行。你担心什么?

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          你不能只使用相同的连接而不关闭它吗?

          【讨论】:

            猜你喜欢
            • 2019-08-25
            • 1970-01-01
            • 2022-01-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多