1

我有九个代表公司的不同数据库,都在同一台 SQL Server 2008 机器上。

在每个公司数据库中,都有一个名为 gltrxdet_vw 的视图。这是跨多个表定义的,我可以做一个

SELECT x, y, z, SUM(amt) AS amt_ 
FROM gltrxdet_vw
WHERE trxdate BETWEEN '2012-04-01' AND '2012-04-30'
GROUP BY x, y, z

由于基于 trxdate 的表上的索引,它非常快速地返回结果。

对于我们的合并账户,我们需要对九家公司进行分组,所以我的计划是创建一个有效的视图

CREATE VIEW mcomp_gltrxdet_vw AS
 SELECT x, y, z, trxdate, amt
 FROM companydb1..gltrxdet_vw
  UNION ALL
 SELECT x, y, z, trxdate, amt
 FROM companydb2..gltrxdet_vw
  UNION ALL
...
  UNION ALL
 SELECT x, y, z, trxdate, amt
 FROM companydb9..gltrxdet_vw

所以理论上现在我可以写一个查询

SELECT x, y, z, SUM(amt) AS amt_
FROM mcomp_gltrxdet_vw
WHERE trxdate BETWEEN '2012-04-01' AND '2012-04-30'
GROUP BY x, y, z

x、y 和 z 是具有事务信息的字段(实际上会有更多这些字段和更复杂的 WHERE 条件传递给查询,但出于说明的目的,我希望以上内容就足够了)

我的问题是:在合并结果之前,SQL Server 是否会一次将 WHERE 条件正确应用于基础视图?或者,在应用 trxdate 过滤器之前,它是否会花费很长时间来构建一个巨型表?我的表中的数据很少,我无法确定这个解决方案是否能正确扩展。我在不同的数据库中查询有什么不同吗?

在相关说明中,我确信其中一些响应将是检查查询计划 - 任何人都可以链接到一个体面的教程,说明在哪里可以找到这些工具/如何使用它们?被 SSMS 深陷其中(更习惯于 MySQL 命令行!)

提前致谢

4

1 回答 1

1

基本上,视图中的这种 union-all 模式就是所谓的(分布式)分区视图,SQL Server 对它有很好的支持。查询优化器会很好地处理这个问题。

无论如何,我建议您查看执行计划以确保。我在此答案的评论中添加了 Ed Harper 给出的链接,因为它很有帮助。

于 2012-06-26T10:42:40.303 回答