优化来自具有超过10M记录的不同服务器的数据检索

时间:2013-07-23 10:18:22

标签: sql sql-server sql-server-2008 tsql

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 crores(3.6百万),这会影响数据库执行时间和检索记录的能力。有人可以帮助我如何优化这一点。或任何其他解决方案。

2 个答案:

答案 0 :(得分:0)

  1. 请勿使用Union,而是可以使用Union all并最终删除 重复记录(如果有的话)。
  2. 在stage(temp)表中插入所有记录,最后删除重复记录(如果有)。
  3. 如果记录数量巨大,您可以通过SSIS加快流程

答案 1 :(得分:0)

首先,您需要在桌面上使用covering index。因此,如果您没有,则已在所有表上创建此索引:

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),但我无法确定无论这种情况会更好还是更糟(你必须进行测试)。

  • 尝试使用indexed views.

  • 将在晚上计算和填充的临时表?