Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 来自两个表的最新条目_Sql_Sql Server - Fatal编程技术网

Sql 来自两个表的最新条目

Sql 来自两个表的最新条目,sql,sql-server,Sql,Sql Server,我有一个SQL 2000 DB和一个旧表,还有一个新表和超过20000000条记录的组合记录。这两个表完全相同,但由于性能问题而被拆分。我不是DB管理员,我只需要从中获取数据,并已获得DBReader的权限 旧表: ClientID, 阿皮德, 莫德泰姆, 事件 新表格: ClientID, 阿皮德, 莫德泰姆, 事件 我需要从具有最新条目的表中检索每个客户机、appid和事件的最新记录。有人知道最好的方法吗?我曾尝试使用union,但查询需要两个多小时才能完成。我想改用连接,但我不确定最好的方

我有一个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中)对行进行排序,并选择最高的排序。