我在确定是使用视图还是临时表时遇到问题。
我有一个程序调用的存储过程。在该SP中,我将长查询的结果存储在临时表中,命名列并在该表上进行另一个查询,将结果存储在标签或网格视图或其他内容中,然后删除临时表。我还可以将查询结果存储在视图中并对该视图进行查询。那么什么是更好或者在什么情况下我必须使用VIEW / Temp表。
根据我的研究,一种观点具有以下优点:安全性,简单性和列名称规范。我的临时表也完成了所有这些(根据我的意见)。
答案 0 :(得分:40)
如果查询是“长”并且您正在访问多个查询的结果,那么临时表是更好的选择。
一般来说,视图只是select
语句的捷径。如果并不意味着结果被运行和处理。如果使用视图,则每次使用时都需要重新生成结果。虽然后续运行视图可能更有效(例如,因为视图查询使用的页面在缓存中),临时表实际上存储结果。
在SQL Server中,您还可以使用表变量(declare @t table . . .
)。
在单个存储过程中使用临时表(或表变量)似乎在安全性,简单性和列名方面几乎没有什么含义。安全性将通过访问存储过程来处理。两种解决方案都需要列名。如果没有更多的信息,很难判断简单性,但没有什么特别复杂的。
答案 1 :(得分:9)
<强>取决于强>
视图必须在每次运行时复制“长查询”的处理,而临时表存储结果。
那么您想要使用更多处理还是更多存储?
您可以存储一些有助于处理的视图值(持久索引),但是您没有提供足够的信息来真正探索它。
如果您只是在单个过程调用中存储要使用的数据,那么就可以使用临时表了。
答案 2 :(得分:3)
这实际上是一种情境和操作特定的问题和答案可能会根据场景的要求而有所不同。 但是,我想补充的一点是,如果您使用视图来存储复杂查询的结果,而这些结果又在GridView的操作中使用,那么在复杂视图上执行更新操作会很麻烦。相反,Temp Tables可以完美地满足这一要求。
同样,有一些场景,其中视图可能是更好的选择[如果处理不当则在多个数据库服务器中],但这取决于你想要做什么。
答案 3 :(得分:1)
对于临时表,我还要提及
在同一查询中,您不能多次引用TEMPORARY表。
在您要在其上使用自我联接的情况下,这会使临时表不方便。
答案 4 :(得分:0)
通常,当我想多次引用存储过程中的同一张表时,我会使用一个临时表,而当我想在不同存储过程中使用该表时,则使用一个视图。
视图不会持久存储数据(原则上):每次引用该视图时,SQL都会使用该视图中的逻辑来访问原始表。因此,您不想在视图上的视图上构建视图,或对逻辑复杂的视图使用多个引用。