【问题标题】:View slows down when I add additional conditions in where clause when querying the view当我在查询视图时在 where 子句中添加其他条件时,视图变慢
【发布时间】:2022-12-14 14:50:32
【问题描述】:

我正在使用类似的查询。我无法在此处发布实际查询和执行计划。我尝试添加一个建议非聚集索引的执行计划,但它进一步减慢了查询速度。 我知道这是不完整的信息,但你能建议我可以尝试什么吗?我别无选择! 我将以下条件放在 where 子句中,日期看起来不错,但只要我添加其他 2 个中的任何一个,查询就需要几个小时。当我尝试查询视图时使用 where 条件。

 where Date_Time between '2021-11-01 00:00:00.000' and '2022-11-02 00:00:00.000'
  and Visit_code not in ('12', '13')
  and mode_code <>'99'

Execution plan XML

CREATE VIEW [dbo].[vw_Test] AS
 select fields
  
  from table1 ed
  left join table2 e on ed.field1_id = e.field1_id
  left join table3 et on et.field1_id = ed.field1_id    
  left join table4 etf on etf.field1_id = e.field1_id
                            and etf.field2_cd= 85429041                                 
                            and etf.dt_tm_field >= '2025-01-01 00:00:00.0000000'
  left join table5 etf_dt on  etf_dt.field1 = e.field1
                            and etf_dt.field3= 85429039                                 
                            and etf_dt.dt_tm_field >=  '2025-01-01 00:00:00.0000000'
  left join table6 ei on ei.field1 = ed.field1
                                        and ei.field4_cd = 123485.00
    left join table7 cvo_ModeOfArrival on cvo_ModeOfArrival.field = ed.field6
                                                 and cvo_ModeOfArrival.field5 = 12345
    left join table7 cvo_ModeOfSep on cvo_ModeOfSep.field = ei.field7
                                                 and cvo_ModeOfSep.field5 = 23456
    left join table7 cvo_FinancialClass on cvo_FinancialClass.field = e.field8
                                                 and cvo_FinancialClass.field5 = 34567
    left join table7 cvo_Specialty on cvo_Specialty.field = e.field9
                                                 and cvo_Specialty.field5 = 45678
  left join table8 ea on ea.field1_id = e.field1_id
    left join table7 cvo_ea on cvo_ea.field = ea.field10
                                                 and cvo_ea.field11 = 345666
GO

【问题讨论】:

  • 那么 WHERE 是否在您的 VIEWs 定义中?我认为所有那些不合格的列(一个非常坏的习惯)都是明确的名称并引用table1
  • 不,它们不引用同一个 table1(如果您正在谈论 field1_id 列)。对困惑感到抱歉。同一个id存在于不同的表中。它是外键,因此名称相同。 Where 不在视图定义中。当我尝试查询视图时。
  • 您的视图是否已编入索引?您已标记索引视图,但从未在任何地方提及。
  • 性能方面的帮助确实需要完整的表和索引定义以及实际的执行计划 - pastetheplan
  • 没有什么可以阻止您在发布之前对 planxml 进行查找/替换。

标签: sql-server tsql sql-view


【解决方案1】:

查看您的代码,我看不到任何可以在 T-SQL 语句上下文中改进的地方。

我会提出以下建议:

  • 检查每个表以及您在fields 部分中需要的列 - 引擎可能正在读取整行,而不是所需的列,因为缺少索引;您可以创建nonclustered 索引以减少 IO
  • 检查这些新索引中的任何一个是否可以是filtered索引,因为你有很多硬编码标准(ei.field4_cd = 123485.00

如果以上还不够,您可能会考虑创建单独的表来存储这些信息并预先填充它。

为了调试,您可以在查询之前添加以下行:

SET STATISTICS IO ON;

然后通过消息选项卡 here 的结果 - 它会为您提供一些有关哪些表消耗了最多 IO 的详细信息。你可以从他们开始。

【讨论】:

  • 在分析了他们的实时统计数据和执行计划之后,我在将近 6-7 个表上构建了非聚集索引,它确实创造了奇迹!!需要 6 个小时的查询需要 20 秒才能完成。太感谢了!!
【解决方案2】:

我将研究使用派生表将此查询分解为多个部分。网上有很多这方面的例子。我总是尝试使用SELECT TOP (2147483647) ...

【讨论】:

    猜你喜欢
    • 2022-10-24
    • 2019-03-14
    • 2021-09-19
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多