51

我在决定是使用视图还是临时表时遇到问题。

我有一个从程序调用的存储过程。在该 SP 中,我将长查询的结果存储在临时表中,命名列并对该表进行另一个查询,将结果存储在标签或网格视图或其他任何内容中,然后删除临时表。我还可以将查询结果存储在视图中并对该视图进行查询。那么什么更好或者在什么情况下我必须使用视图/临时表。

根据我的研究,视图具有以下优点:安全性、简单性和列名规范。我的临时表也满足了所有这些要求(根据我的意见)。

4

5 回答 5

52

如果查询是“长”的并且您正在访问多个查询的结果,那么临时表是更好的选择。

select一般来说,观点只是陈述的捷径。If 并不意味着结果会被运行和处理。如果您使用视图,则每次使用时都需要重新生成结果。尽管视图的后续运行可能更有效(比如因为视图查询使用的页面在缓存中),但临时表实际上存储了结果。

在 SQL Server 中,您还可以使用表变量 ( declare @t table . . .)。

在单个存储过程中使用临时表(或表变量)似乎在安全性、简单性和列名方面几乎没有影响。安全性将通过访问存储过程来处理。任一解决方案都需要列名。如果没有更多信息,很难判断简单性,但没有什么特别复杂。

于 2013-06-03T13:16:37.773 回答
11

依靠

视图必须在每次运行时复制“长查询”的处理,而临时表存储结果。

所以你想使用更多的处理还是更多的存储?

您可以存储一些有助于处理的视图值(持久索引),但您没有提供足够的信息来真正探索这一点。

如果您谈论的只是存储数据以供在单个过程调用中使用,那么临时表就是要走的路。

于 2013-06-03T13:03:11.150 回答
6

我还想提一下临时表,

您不能在同一查询中多次引用 TEMPORARY 表。

对于要在其上使用自联接的情况,这会使临时表不方便。

于 2018-07-16T18:54:52.007 回答
3

这确实是一个情境和操作特定的问题和答案可能会根据场景的要求而有所不同。但是,我想补充一点,如果您使用视图来存储复杂查询的结果,而这些结果又用于 GridView 的操作,那么对复杂视图执行更新操作可能会很麻烦. 相反,临时表可以完美地满足这一点。

同样,在某些情况下,视图可能是更好的选择[如在多个数据库服务器中,如果处理不当],但这取决于您想要做什么。

于 2013-06-03T13:16:44.190 回答
3

一般来说,当我想在一个存储过程中多次引用同一个表时,我会使用一个临时表,当我想在不同的存储过程中使用该表时,我会使用一个视图。

视图不会持久化数据(原则上):每次引用视图时,SQL 都会使用视图中的逻辑来访问原始表。因此,您不想在视图上的视图上构建视图,或者对具有复杂逻辑的视图使用多个引用。

于 2019-08-14T10:32:02.140 回答