Sql 过滤20000行的视图需要30分钟

Sql 过滤20000行的视图需要30分钟,sql,sql-server,view,Sql,Sql Server,View,我的问题是我有一个视图,它返回某一天的20000行数据 select * from view where date = X 但当我为周长添加where子句时,我需要 select * from view where date = X and perimeter in ( 'A' , 'B' , 'C', 'D' ) 结果大约是10.000行,但需要30分钟才能得到结果 该视图非常复杂,有几十个连接和一个连接等 我怎样才能解决这个问题 谢谢你的帮助, 如果你有任何问题,请问我:) **更新:

我的问题是我有一个视图,它返回某一天的20000行数据

select * from view
where date = X
但当我为周长添加where子句时,我需要

select * from view 
where date = X and perimeter in ( 'A' , 'B' , 'C', 'D' )
结果大约是10.000行,但需要30分钟才能得到结果

该视图非常复杂,有几十个连接和一个连接等

我怎样才能解决这个问题

谢谢你的帮助, 如果你有任何问题,请问我:)

**更新:谢谢你的回答。 真正的查询相当复杂。这只是一个例子来解释我的问题。执行计划相当长且无用,因为我有完全(100%)相同的执行计划(估计和实际) 是否在“周长”列上使用过滤器。 但这之后的时间从我只过滤日期的30秒到我添加perimter过滤器的30分钟。 因此,这一定意味着执行计划无论如何都是错误的。 统计数据通常在该表上更新。 在我查找它的表的这一列上没有索引。视图是否需要添加一个? 由于视图中有一个左连接,我们对其进行筛选的列被检索 **首先问问自己:

花这样的时间是正常的吗

在某些情况下,当数据庞大且语句复杂时,某些查询花费更多时间是正常的

如果不是您的情况,则:

  • 我需要所有列吗?-为什么
    选择*
    ,仅选择所需的列有时可以优化视图执行
  • 我需要视图中使用的所有逻辑吗?-如果视图如此复杂,请考虑是否可以只获取所需的语句(例如,创建逻辑更少、数据源更少、列更少的独立视图)
  • 查询是否使用了最佳索引?这是,但您正在执行
    筛选
    ,因此可以使用适当的索引或甚至索引优化查询
  • 我可以提前过滤数据吗?-有时,您可以创建以提前执行筛选(该函数基本上是一个带参数的视图-想象一下将参数“X”传递给该函数,该参数将被传递给视图中引用的其他函数,现在只返回先前生成的行的5%——因此,
    中的一些值可以作为参数传递)
  • 我需要物化这个视图吗?-这是最后的手段,但为了像普通表一样物化它并进一步优化性能,您可以这样做(注意,并不是每个视图都可以被索引)

据我所见,许多开发人员正在使用过去为解决特定问题而创建的遗留视图,而不是创建新视图。很多时候,这些视图所做的工作远远超出了实际需要。

您必须向我们展示查询计划、一些模式细节、现有索引、视图SQL等,我们正在进行测试立即解决问题。提供定义(DDL)视图的
和视图引用的表(包括任何索引)中,将大大帮助我们。我建议将视图的完整结果转储到临时表中,然后对该表执行筛选选择。有时,对查询的微小更改将导致对执行计划,尽管SQL Server尽了最大努力,但这有时会导致响应速度慢得多。如果执行select*from View where Day=X速度快,则只需将这些结果转储到临时表中,然后使用in子句查询该表。