【问题标题】:Most recent entry from two tables来自两个表的最新条目
【发布时间】:2010-11-17 11:28:13
【问题描述】:

我有一个带有旧表的 SQL 2000 数据库和一个包含超过 20,000,000 条记录的新表。这两个表完全相同,但由于性能问题被拆分。我不是数据库管理员,我只需要从中获取数据并获得 DBReader 权限。

旧表: 客户 ID, 应用程序ID, 国防部时间, 事件

新表: 客户 ID, 应用程序ID, 国防部时间, 事件

我需要从具有最新条目的表中检索每个客户端、appid 和事件的最新记录。任何人对此的最佳方法有任何想法吗?我曾尝试使用联合,但查询需要两个多小时才能完成。我正在考虑改用连接,但我不确定最好的方法。

谢谢!

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您必须使用UNION,但如果表是不同的,请考虑使用UNION ALL,这样会更快。

    还要确保您在表上具有此类查询的正确索引。

    【讨论】:

      【解决方案2】:

      为什么不对每张表执行查询,合并结果,然后在并集上重复查询?

      【讨论】:

        【解决方案3】:

        如果您使用的是普通的“UNION”,则可能会导致问题。 UNION 确保其输出不包含重复项,这通常需要对整个数据集进行排序或散列。

        另一方面,UNION ALL 只返回两边的所有行。

        【讨论】:

          【解决方案4】:

          如果这只是一次性工作并且您只有两个表,则只需对两个表分别运行“最近的条目”查询。然后对两个结果集执行 UNION ALL 并使用 GROUP BYMAX 仅保留最新的。在 SQL 中:

          SELECT ClientID, AppID, Event, MAX(MaxModTime) FROM (
              SELECT ClientID, AppID, Event, MAX(ModTime) MaxModTime FROM table1
              GROUP BY ClientID, AppID, Event
              UNION ALL
              SELECT ClientID, AppID, Event, MAX(ModTime) MaxModTime FROM table2
              GROUP BY ClientID, AppID, Event
          ) Q
          GROUP BY ClientID, AppID, Event
          

          您可以通过在(ClientID、AppID、Event)上为两个表创建复合索引来提高此类查询的速度,或者在可能的情况下在(ClientID、AppId、Event、ModTime)上使用聚集索引。

          【讨论】:

          • 这不是一项临时工作,而是一项日常任务。 MAX(ModTime) 不起作用,因为有多个事件。表 1 中可能有一个事件是“安装”,而表 2 中可能有一个事件是同一客户端和 appid 的“卸载”,我需要获取最新的事件。
          • 那么你在 SQL 2000 上太糟糕了,因为你需要行排名 (ROW_NUMBER())。您可以在 2000 上进行模拟,请参见此处:stackoverflow.com/questions/1723608/…。您需要从GROUP BY 中删除“事件”,按 ModTime 对行进行排名(在 ClientID、AppID 组内)并选择最高排名。
          【解决方案5】:

          为了性能,我建议将旧表中的 ClientID、AppID 和 MAX(ModTime) 插入到临时表中,将新表中的 ClientID、AppID 和 MAX(ModTime) 附加到同一个临时表中,然后查询 ClientID 、AppID 和 MAX(ModTime) 来自临时表。

          【讨论】:

            猜你喜欢
            • 2022-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-17
            • 2017-11-14
            相关资源
            最近更新 更多