查看或临时表 - 在 MS SQL Server 中使用哪个?

Posted

技术标签:

【中文标题】查看或临时表 - 在 MS SQL Server 中使用哪个?【英文标题】:View or Temporary Table - which to use in MS SQL Server? 【发布时间】:2013-05-29 15:19:15 【问题描述】:

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

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

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

【问题讨论】:

除非你陈述你的目标并根据它们对你的重要性来排名,否则这个问题实在是太笼统了。 这个问题的唯一可能答案是:你必须同时尝试,看看哪一个效果更好。 视图(至少在 mysql 中)在会话中是持久的。执行相同代码的不同用户会遇到问题,执行创建相同视图的代码。会话关闭时会删除临时表,并且不会在不同会话之间共享。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

我还想提一下临时表,

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

这使得临时表在您想在其上使用自联接的情况下不方便。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

取决于

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

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

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

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

【讨论】:

以上是关于查看或临时表 - 在 MS SQL Server 中使用哪个?的主要内容,如果未能解决你的问题,请参考以下文章

在 MS access passthru 中创建 sql server 临时表

调试 MS SQL 函数时查看临时表的数据

SQL Server 表变量和临时表的区别

如何查看sql server中代码创建的临时表?

SQL server 查看什么语句在使用临时表

有没有办法获取 SQL Server 中所有当前临时表的列表?