在MS SQL Server中,是应该使用视图还是临时表?

54

我有一个问题需要决定是使用视图还是临时表。

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

根据我的研究,视图具有以下优点:安全性、简单性和列名称规范。我的临时表也符合这一点(依据我的观点)。


1
除非您明确陈述您的目标并按照其对您的重要性进行排名,否则这是一个过于笼统的问题。 - Tim
这个问题的唯一可能答案是:你必须尝试两种方法,看哪一个效果更好。 - Nenad Zivkovic
2
一个视图(至少在mysql中)是跨会话持久的。不同的用户执行相同的代码时,将会遇到问题,因为执行创建相同视图的代码。临时表在会话关闭时被删除,并且不在不同会话之间共享。 - Marinos An
6个回答

56
如果查询“长”,而且您正在从多个查询中访问结果,则临时表是更好的选择。
通常情况下,视图只是一个select语句的快捷方式。它并不意味着结果被运行和处理。如果使用视图,每次使用它都需要重新生成结果。虽然后续运行视图可能更有效(例如,因为视图查询所使用的页面在缓存中),但是临时表实际上存储了结果。
在SQL Server中,您还可以使用表变量(declare @t table...)。
在单个存储过程中使用临时表(或表变量)似乎对安全性、简单性和列名没有太多影响。安全性由对存储过程的访问处理。任何解决方案都需要列名。没有什么特别复杂的东西,因此很难判断简单性是否足够。

13

depends

一个视图每次运行时都必须复制您的“长查询”的处理过程,而临时表则存储结果。

那么你想使用更多的处理还是更多的存储空间呢?

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

如果您只是想在单个过程调用中存储数据,则应使用临时表。


5

我想补充一下关于临时表的内容:

在同一个查询中,您不能多次引用临时表。

这使得临时表在需要在其上进行自连接的情况下不太方便。


根据这个答案,您可以自连接一个临时表。https://stackoverflow.com/a/25471163/1766253 - Lee Cichanowicz

3
这是一个与特定情境和操作相关的问题,答案可能因场景需求而异。不过我想强调的是,如果您使用视图来存储复杂查询的结果,并将其用于 GridView 的操作中,则在复杂视图上执行更新操作可能会很麻烦。相反,临时表可以完美地解决这个问题。
当然,在某些情景下(例如多个数据库服务器),使用视图可能更好,但这取决于您想要实现的目标。

3

通常我会在存储过程中多次引用同一张表时使用临时表,而在不同的存储过程中使用表时则会使用视图。

从原理上讲,视图不会保留数据:每次引用视图时,SQL都会使用视图的逻辑来访问原始表。因此,不要在视图上构建视图或多次引用具有复杂逻辑的视图。


0

TEMPORARY表只在当前会话中可见,并且在会话关闭时会自动删除。如果您需要反复获得复杂查询的相同结果,则TEMPORARY表可以通过存储中间结果来提高性能。

VIEW在多个会话中保留。在底层就像一个查询,每次访问视图时,SQL服务器都会从基本表重新生成结果。虽然VIEW在这方面较慢,但VIEW确保所获得的结果是最新的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接