优化从拥有超过1000万条记录的不同服务器检索数据

3
SELECT party_code , max(date) AS date    FROM     
server1.table1 WITH (nolock) GROUP  BY party_code    

UNION    
SELECT party_code , max(date) AS date   FROM     
server2.table1 WITH (nolock) GROUP  BY party_code    

UNION    
SELECT party_code , max(date) AS date    FROM     
server3.table1 WITH (nolock) GROUP  BY party_code 

如上所示,我在不同的服务器上有17个类似的表格,因此我将它们合并以获取记录。总数据量超过36 千万(360百万),这会影响数据库执行时间和检索记录的能力。有人能帮我优化吗?或者有其他解决方案。


不同的服务器可以有相同的“party_code”吗?如果是这样,会发生什么?您需要每个“max(date)”单独的行还是所有行都使用一个“max(date)”? - Nenad Zivkovic
是的,Nenad,我们在不同的服务器中有相同的派对代码。是的,我需要每个最大日期分别的单独行。 - user2583182
2个回答

0
首先,您需要在表上创建一个覆盖索引。因此,如果您还没有,请在所有表上创建此索引:
CREATE NONCLUSTERED INDEX IX_Table1_party_code__date 
  ON server1.table1 (party_code) INCLUDE (date)

其次,将UNION替换为UNION ALL运算符。如果您需要分别保留每个服务器的记录,则Union会对数据集进行排序和比较,这是不必要的。

如果这还不够帮助,也许您可以尝试其他一些选项:

  • 也许您可以首先使用UNION ALL将所有记录(在此过程中添加ServerID列),然后在数据集上执行一个GROUP BY(在party_codeServerID上),但我无法确定这是否更好或更差(您需要测试)。

  • 尝试使用索引视图

  • 在晚上计算和填充的暂存表?


0
  1. 不要使用 Union,可以使用 Union all,最后删除重复记录(如果有的话)。
  2. 将所有记录插入临时表中,最后删除重复记录(如果有的话)。
  3. 如果记录数量很大,可以使用 SSIS 进行更快的处理。

我该如何在SSIS中使用它? - user2583182
您可以使用不同的连接管理器将Execute SQL任务与数据加载到阶段表中。SSIS比普通T-SQL代码更快。此外,还有联合运算符来处理这种情况。 - sganesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接