在存储过程中使用表变量而不是仅从表或视图中选择?

Posted

技术标签:

【中文标题】在存储过程中使用表变量而不是仅从表或视图中选择?【英文标题】:Using table variables in stored procedures versus merely selecting from tables or a view? 【发布时间】:2010-08-10 20:53:37 【问题描述】:

我现在正在查看似乎遵循下面演示的行为的存储过程

DECLARE @tablevar TABLE
(
    FIELD1   int,
    FIELD2   int,
    FIELD3   varchar(50),
    -- etc
)

INSERT INTO @tablevar
(
    FIELD1,
    FIELD2,
    FIELD3,
    -- etc
)
SELECT FIELD1, FIELD2, FIELD3, -- etc
FROM
TableA Inner Join TableB on TableA.Foo = TableB.Foo
Inner Join TableC on TableB.Bar = TableC.Bar
-- Where, Order By, etc.

Select FIELD1, FIELD2, FIELD3, -- etc
FROM @tablevar

与使用简单的 select 语句并跳过表变量相比,使用这种方法有什么好处吗?

【问题讨论】:

【参考方案1】:

如果您打算完全按照发布的方式使用它(填充它然后选择结果),那么您将一无所获。你只是在给你的 SQL Server 征税,需要更多的 CPU 和内存使用。

如果您打算对 table 变量做更多事情,答案会发生变化,这取决于您如何使用它。如果它将保存少量数据,则在后续语句中使用它可能会更有效。如果您打算多次使用它并且初始种群很昂贵,那么它可能会更有效。

我一直在说也许,因为每种情况都不同,您需要进行测试才能看到它是否有所作为。

【讨论】:

+0(我没有投票权,否则会是+1) - 比我的更好 我看的时候觉得有点浪费。也许有人认为他/她是通过按键获得报酬的。 @Anthony Pegram - 可能是... KLOC 曾经是衡量标准 :) +1,但如果您想利用一些预编译将带给您的东西,而不是普通的旧动态 sql,也认为 SP 可能具有相关性。但同意,Q 中的例子有点矫枉过正。【参考方案2】:

如果您所做的只是填充表格并从中选择,我认为这样做没有任何好处

【讨论】:

以上是关于在存储过程中使用表变量而不是仅从表或视图中选择?的主要内容,如果未能解决你的问题,请参考以下文章

如果第一个没有可用记录,则从视图中选择并从一个表或另一个表中加入

如何创建临时表或仅从循环中的列中选择不同的值

使用存储过程从视图中检索或过滤数据是不是比使用存储过程从表中获取或过滤数据更快?

仅从表中选择一些列

MYSQL数据太大时怎么优化 视图?存储过程? - 技术问答

仅从表中选择最新记录并使其快速,如何?