首页 > 解决方案 > 优化视图引用 SQL Server 中的视图的策略?

问题描述

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


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

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

我是不是该:

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

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

  3. 或者也许我已经很远了,根本不需要转换为表值函数?

主视图:

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

标签: sqlsql-serverindexingviewquery-optimization

解决方案


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

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

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

READONLY/READUNCOMMITTED 最初用于针对实时数据库进行大型报告。Vinh 正在使用的 Views 用于现在就位的复制服务器。READONLY 通常用于针对前几个月/几天的信息,因此当前日期的更改不是问题。大型报告正在减慢上一段中讨论的传输和发布过程。上面的过帐过程目前大约需要 1 小时才能过帐 500 笔交易,所以我们可以随时保持过程不减慢。

为什么要指定特定索引:5700 万行分为订单类型(SOPTYPE 2(订单)、3(发票)和 5(延期交货))。大多数 Microsoft 索引使用 SOPTYPE 作为索引中的第一个字段。所以大多数查询最终使用索引扫描而不是索引搜索。在某些情况下,只需指定索引即可将查询时间从 2 分钟缩短到 5 秒。在比较索引分数时,两个索引可能都在 80%,但 SQL 倾向于选择 SOPTYPE 作为第一个索引字段的索引。

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

我希望这个信息帮助。


推荐阅读