Sql 来自两个表的最新条目
我有一个SQL 2000 DB和一个旧表,还有一个新表和超过20000000条记录的组合记录。这两个表完全相同,但由于性能问题而被拆分。我不是DB管理员,我只需要从中获取数据,并已获得DBReader的权限 旧表: ClientID, 阿皮德, 莫德泰姆, 事件 新表格: ClientID, 阿皮德, 莫德泰姆, 事件 我需要从具有最新条目的表中检索每个客户机、appid和事件的最新记录。有人知道最好的方法吗?我曾尝试使用union,但查询需要两个多小时才能完成。我想改用连接,但我不确定最好的方法Sql 来自两个表的最新条目,sql,sql-server,Sql,Sql Server,我有一个SQL 2000 DB和一个旧表,还有一个新表和超过20000000条记录的组合记录。这两个表完全相同,但由于性能问题而被拆分。我不是DB管理员,我只需要从中获取数据,并已获得DBReader的权限 旧表: ClientID, 阿皮德, 莫德泰姆, 事件 新表格: ClientID, 阿皮德, 莫德泰姆, 事件 我需要从具有最新条目的表中检索每个客户机、appid和事件的最新记录。有人知道最好的方法吗?我曾尝试使用union,但查询需要两个多小时才能完成。我想改用连接,但我不确定最好的方
谢谢 < P>为什么不在每个表上执行查询,合并结果,并在UNIX上重复查询? 您必须使用<代码>联合<代码>,但是如果表是不同的,请考虑使用<代码>联合所有这将更快。p>
还要确保表上的索引对于此类查询是正确的。如果这只是一个一次性作业,而您只有两个表,只需分别对这两个表运行“最新条目”查询。然后将所有两个结果集合并,并使用
groupby
和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)上设置聚集索引来提高此类查询的速度。如果您使用的是普通的“UNION”,则可能会导致问题。UNION确保其输出不包含重复项,这通常需要对整个数据集进行排序或散列
另一方面,UNION ALL只返回两边的所有行。为了提高性能,我建议将旧表中的ClientID、AppID和MAX(ModTime)插入临时表,将新表中的ClientID、AppID和MAX(ModTime)追加到同一临时表中,然后查询ClientID、AppID和MAX(ModTime)这不是一次性的工作,而是一项日常任务。最大值(ModTime)不起作用,因为存在多个事件。表1中可能有一个事件是“安装”,表2中同一个客户端和appid的事件是“卸载”,我需要获取最新的事件。那么,很遗憾您使用的是SQL 2000,因为您需要行排序(
行编号()
)。您可以在2000年进行模拟,请参见此处:。您需要按从分组中删除“事件”,按ModTime(在groups ClientID、AppID中)对行进行排序,并选择最高的排序。