最近从两张桌子进入

时间:2010-11-17 11:28:14

标签: sql sql-server

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

OldTable: 客户端ID, 的AppID, ModTime, 事件

newtable的: 客户端ID, 的AppID, ModTime, 事件

我需要从每个客户端,appid和事件中检索最近的记录,无论哪个表都有最新的条目。有人对这方面的最佳方法有任何想法吗?我尝试过使用union,但查询需要两个多小时才能完成。我正在考虑使用连接,但我不确定最好的方法。

谢谢!

5 个答案:

答案 0 :(得分:2)

您必须使用UNION,但如果表格为DISTINCT,请考虑使用更快的UNION ALL

还要确保在这些查询的表上有正确的索引。

答案 1 :(得分:1)

为什么不对每个表执行查询,合并结果,并在union上重复查询?

答案 2 :(得分:0)

如果这只是一次性工作并且您只有两个表,则只需分别对两个表运行“最近条目”查询。然后执行两个结果集中的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)上来提高此类查询的速度。

答案 3 :(得分:0)

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

另一方面,

UNION ALL只返回两边的所有行。

答案 4 :(得分:0)

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