Sql server 提高具有大量联接的视图的性能

Sql server 提高具有大量联接的视图的性能,sql-server,join,performance,left-join,Sql Server,Join,Performance,Left Join,我有一个视图,它使用11个外部联接和两个内部联接来创建数据。这将导致超过800万行。当我在桌子上数数*时,大约需要5分钟。我不知道如何改进这张桌子的性能。有人对从哪里开始有什么建议吗?在所有连接的列上似乎都有索引,虽然有些是复合的,但不确定这是否有区别 感谢您的帮助。您可以考虑以下几点: 非规范化。通过对数据结构进行非规范化,减少所需的联接数 分区。你能从大表中划分数据吗?e、 g.一个大表,如果划分为多个较小的表,性能会更好。SQL 2005以后的企业版对分区有很好的支持,请参阅。如果你开始进

我有一个视图,它使用11个外部联接和两个内部联接来创建数据。这将导致超过800万行。当我在桌子上数数*时,大约需要5分钟。我不知道如何改进这张桌子的性能。有人对从哪里开始有什么建议吗?在所有连接的列上似乎都有索引,虽然有些是复合的,但不确定这是否有区别


感谢您的帮助。

您可以考虑以下几点:

非规范化。通过对数据结构进行非规范化,减少所需的联接数 分区。你能从大表中划分数据吗?e、 g.一个大表,如果划分为多个较小的表,性能会更好。SQL 2005以后的企业版对分区有很好的支持,请参阅。如果你开始进入数百万行的10s/100s领域,你会考虑这一点。 索引管理/统计。是否对所有索引进行碎片整理?统计数字是最新的吗?
运行sql探查器/索引优化向导。有时,它提出的索引建议并没有立即产生意义,但结果证明具有出色的性能优势

这是一个困难的建议,对于复杂的视图,您还可能与针对该视图的查询进行交互,因此保证合理的性能将非常困难。视图中的外部联接,尤其是复杂的联接,也容易给查询优化人员带来麻烦

一种选择是在SQL Server上实现名为“索引视图”的视图。但是,您可能需要监视更新性能,以检查它是否不会带来太多开销。此外,物质化视图中的外部联接可能会妨碍实时刷新;如果需要,则可能必须将视图重新实现为非规范化的表,并使用触发器维护数据


另一种可能性是研究是否可以将该观点分为两个或三个更简单的观点,可能将部分但不是全部观点具体化。通过这种方式,可能更容易实现某些视图并从系统中获得性能。

您的基本前提是错误的。 拥有一个返回800万行的视图并不是一个好主意,因为实际上,您不能用这么多的数据做任何事情。 5分钟对800万人来说听起来很不错,因为有这么多人加入


您需要做的是考虑您的业务问题并编写一个较小的查询/视图。

可能您尝试外部联接的某些表是不相交的?如果是这样,考虑创建存储过程而不是视图,并创建这样的东西:

选择 进入set1 从T1左连接T2左连接。。。 在哪里

选择 进入set2 从T3左连接T4左连接。。。 在哪里

选择。。。从集合1左连接集合2左连接

这样可以避免处理大量数据。当您进行外部联接时,优化器通常无法在查询的解析树中向下移动选择项。如果这样做,您将无法获得可能需要的带有空值的行


当然,您不能通过连接存储过程来创建查询。这是您可以使用的唯一基本概念。

您看过估计/实际执行计划了吗?他们会告诉你,如果你缺少一个索引,我已经看过了。没有占用任何重要时间的表扫描。有很多散列匹配会导致性能低下,但只有在正确使用索引时才会执行散列匹配?我发现一个非常有用的技巧是将复杂查询分解为子查询,例如,如果您有一个包含11个连接的查询,那么对于一个通常不能同时考虑4个以上连接的优化人员来说,这是一项艰巨的工作。我会尝试使用4个连接保持外部查询,并将其他连接移动到子查询。我曾考虑过创建索引视图,但据我所知,在使用任何类型的外部联接的视图上都不能这样做。我弄错了吗?没错。您可以具体化视图的一部分,然后在此基础上构建一个视图。。或者,您可以将视图重新实现为一个由一组触发器维护的表。是的,我认为这是我必须采取的方法。您知道这将占用多少空间吗?保持这种观点不是一个好主意。我不知道探查器提出了建议。您是说查询分析器吗?对不起,实际执行建议的工具是Sql Server索引优化向导。此工具将探查器跟踪文件作为输入:-