【问题标题】:How view return records如何查看退货记录
【发布时间】:2023-03-12 00:33:01
【问题描述】:

我有 sql 视图,我正在从这样的视图中获取值

select * from MyView where date > 'anydate'。

我的问题: 这个 where 子句什么时候执行?一旦所有记录都按视图返回?

【问题讨论】:

  • 查询的执行计划回答了您的问题。拿来看看。

标签: sql database view


【解决方案1】:

你实际上在做的是,你告诉数据库从它的记录中选择一些日期大于特定日期的数据,所以它只会从最后一个命令中执行它,我只会选择日期所在的数据大于特定日期

【讨论】:

  • 那如果我也有 where 条件呢
  • 对不起,我不明白
【解决方案2】:

视图有点像其他语言中的宏 - 它们实际上是一个“片段”,您可以将其插入到更大的查询中。

更大的查询被优化作为一个整体1。来自任何视图的表引用、谓词等与提交的查询文本中明确写入的表引用、谓词等无关。

因此,如果您在视图中有一个WHERE 子句和一个您在查询视图时应用的WHERE 子句,则两者都被同等考虑。两者都不能保证在其他2之前或之后被评估。


1除非使用视图物化的功能,在这种情况下,视图“结果”数据将与针对视图的任何查询分开存储和更新。 SQL 数据库产品是否支持此类功能、维护方式等的具体细节有所不同。

2根据 SQL 中的一般原则,您告诉系统您想要什么,而不是如何做。由优化器决定操作发生的顺序,只要它在逻辑上是一致的。

【讨论】:

  • 完全同意你的观点,但我刚刚将该视图转换为表值函数并将参数传递给它。现在 where 子句在视图中并且性能要好得多,但我不知道为什么。
  • @Faisal - 如果你在谈论 SQL Server 的表值函数,那么内联 TVF 之间有一个重要的不同(它就像一个视图,如上所述,并作为包含查询的一部分进行了优化)和多语句 TVF(嗯,不是,并且经过优化和单独运行)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多