当我在where子句中添加额外的条件时,视图变慢了



我正在使用类似的查询。我不能在这里发布实际的查询和执行计划。我尝试添加一个执行计划,建议使用非聚集索引,但它进一步减慢了查询速度。我知道这是不完整的信息,但你能建议我该怎么做吗?我别无选择了!!我把下面的条件在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'

执行计划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

看看你的代码,我看不出在T-SQL语句的上下文中有什么可以改进的。

我建议如下:

  • 检查每个表和哪些列你需要在fields部分-这是可能的引擎正在读取整个行,而不是所需的列作为索引缺失;您可以创建非聚集索引,以减少IO
  • 检查这些新索引是否可以被过滤索引,因为您有很多硬编码标准(ei.field4_cd = 123485.00)

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

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

SET STATISTICS IO ON;

,然后传递这里的messages选项卡的结果—它将为您提供有关哪些表消耗了最多IO的详细信息。你可以从他们开始。

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

最新更新