我有一个带有旧表的SQL 2000数据库和一个记录超过20,000,000条记录的新表。这两个表完全相同,但由于性能问题而被拆分。我不是数据库管理员,我只需要数据,并且已获得DBReader权限。
OldTable: 客户端ID, 的AppID, ModTime, 事件
newtable的: 客户端ID, 的AppID, ModTime, 事件
我需要从每个客户端,appid和事件中检索最近的记录,无论哪个表都有最新的条目。有人对这方面的最佳方法有任何想法吗?我尝试过使用union,但查询需要两个多小时才能完成。我正在考虑使用连接,但我不确定最好的方法。
谢谢!
答案 0 :(得分:2)
您必须使用UNION
,但如果表格为DISTINCT,请考虑使用更快的UNION ALL
。
还要确保在这些查询的表上有正确的索引。
答案 1 :(得分:1)
为什么不对每个表执行查询,合并结果,并在union上重复查询?
答案 2 :(得分:0)
如果这只是一次性工作并且您只有两个表,则只需分别对两个表运行“最近条目”查询。然后执行两个结果集中的UNION ALL并使用GROUP BY
和MAX
仅保留最新的结果集。在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)。