优化SQL Server中引用视图的视图的策略?

优化SQL Server中引用视图的视图的策略?,sql,sql-server,indexing,view,query-optimization,Sql,Sql Server,Indexing,View,Query Optimization,更新: 出于对您时间的尊重,我正在子视图调用的表中添加索引。我会回来编辑这一次,我已经改善了尽可能多,以尽量减少复杂性,并在我的帮助请求更具体。我也可以删除和重写这篇文章,如果这是首选 瓶颈是子视图。估计的计划显示大部分工作是表和子视图之间的哈希匹配。查询计划 我知道谓词和连接列应该被索引。我不确定的是子视图的理想策略 我应该: 是否将子视图转换为表值函数?我从一位专家那里听说这是一个理想的解决方案,但他们没有说明原因。我不知道子视图中的索引列是否会进入主视图 或者我是否也需要将主视图转换为

更新: 出于对您时间的尊重,我正在子视图调用的表中添加索引。我会回来编辑这一次,我已经改善了尽可能多,以尽量减少复杂性,并在我的帮助请求更具体。我也可以删除和重写这篇文章,如果这是首选


瓶颈是子视图。估计的计划显示大部分工作是表和子视图之间的哈希匹配。查询计划

我知道谓词和连接列应该被索引。我不确定的是子视图的理想策略

我应该:

  • 是否将子视图转换为表值函数?我从一位专家那里听说这是一个理想的解决方案,但他们没有说明原因。我不知道子视图中的索引列是否会进入主视图

  • 或者我是否也需要将主视图转换为表函数以利用索引

  • 或者可能我已经太远了,根本不需要转换成表值函数

  • 主要观点:

    SELECT *
    FROM table1 WITH (INDEX(IX_table1))
    INNER JOIN table2 WITH (INDEX(IX_table2)) ON table1.field1 = table2.field1 
                                              AND table1.field2 = table2.field2
    LEFT JOIN SubView WITH (nolock) ON table1.field1 = SubView1.field1
                                    AND table1.field2 = SubView1.field2
                                    AND table2.field3 = SubView1.field3
                                    AND table2.field4 = SubView1.field4
    WHERE table1.PredicateDate >= dynamicDate
      AND table1.field1 IN (3, 4)
      AND table1.field5 = 0
    

    抱歉。把答案放在回答部分而不是评论部分。但在尝试修复后,这并不重要。没有足够的帖子添加评论

    这适用于Microsoft ERP系统上的表格。Microsoft在不应更改或删除的表上有其默认索引。在任何ERP升级中,索引都会由Microsoft重新创建

    大多数报告的表格是订单历史标题(800万条记录)和行(5700万条记录)。当订单转移到发票或发票过账时,将填充这些表。对于第一种情况,订单转到历史记录表,并在打开的表中创建发票。第二种情况是,发票过账时,anvoice被移动到历史记录表。对于这些流程,ERP系统有一个厚客户端(自2010年或更早以来没有太大变化)。这个过程相当长,有许多表不使用显式SQL事务。如果此过程被中断,则需要对所有未更新的表进行手动修复

    READONLY/READUNCOMMITTED最初用于对数据库的实时数据进行大型报告。Vinh正在使用的视图是针对现在已就位的复制服务器使用的。READONLY通常用于前几个月/前几天的信息,因此当天的更改不是问题。大型报告减缓了前段讨论的转移和过账过程。上述过账流程目前需要大约1小时才能过账500笔交易,因此我们可以随时防止流程放缓

    指定特定索引的原因:5700万行分为订单类型(SOPTYPE 2(订单)、3(发票)和5(延期订单))。大多数Microsoft索引使用SOPTYPE作为索引中的第一个字段。因此,大多数查询最终使用索引扫描而不是索引查找。在某些情况下,仅指定索引即可将查询时间从2分钟减少到5秒。在比较索引得分时,两个索引可能都是80%,但SQL倾向于选择具有SOPTYPE的索引作为第一个索引字段

    我们可能是特定ERP系统的较大数据用户之一。我不相信微软已经针对这种数据大小进行了优化


    我希望这些信息能有所帮助。

    抱歉。把答案放在回答部分而不是评论部分。但在尝试修复后,这并不重要。没有足够的帖子添加评论

    这适用于Microsoft ERP系统上的表格。Microsoft在不应更改或删除的表上有其默认索引。在任何ERP升级中,索引都会由Microsoft重新创建

    大多数报告的表格是订单历史标题(800万条记录)和行(5700万条记录)。当订单转移到发票或发票过账时,将填充这些表。对于第一种情况,订单转到历史记录表,并在打开的表中创建发票。第二种情况是,发票过账时,anvoice被移动到历史记录表。对于这些流程,ERP系统有一个厚客户端(自2010年或更早以来没有太大变化)。这个过程相当长,有许多表不使用显式SQL事务。如果此过程被中断,则需要对所有未更新的表进行手动修复

    READONLY/READUNCOMMITTED最初用于对数据库的实时数据进行大型报告。Vinh正在使用的视图是针对现在已就位的复制服务器使用的。READONLY通常用于前几个月/前几天的信息,因此当天的更改不是问题。大型报告减缓了前段讨论的转移和过账过程。上述过账流程目前需要大约1小时才能过账500笔交易,因此我们可以随时防止流程放缓

    指定特定索引的原因:5700万行分为订单类型(SOPTYPE 2(订单)、3(发票)和5(延期订单))。大多数Microsoft索引使用SOPTYPE作为索引中的第一个字段。因此,大多数查询最终使用索引扫描而不是索引查找。在某些情况下,仅指定索引即可将查询时间从2分钟减少到5秒。在比较索引得分时,两个索引可能都是80%,但SQL倾向于选择具有SOPTYPE的索引作为第一个索引字段

    我们可能是特定ERP系统的较大数据用户之一。我不相信微软已经针对这种数据大小进行了优化


    我希望这些信息能有所帮助。

    由于依赖关系超出我的控制范围,优化子视图需要一些时间。我们无法删除此帖子,因此结束此问题