【问题标题】:Do I need to drop or deallocate a temporary table in SQL Server?我是否需要在 SQL Server 中删除或取消分配临时表?
【发布时间】:2016-02-07 01:29:01
【问题描述】:

我已经编写了一些声明 TABLE 和 CURSOR 的脚本。在脚本结束时,我取消分配 CURSOR。我是否也应该解除分配表?

DECLARE @MyTable TABLE (columns);
INSERT @MyTable(columns) VALUES (values)
INSERT @MyTable(columns) VALUES (values)
...

DECLARE workorders SCROLL CURSOR FOR
SELECT (rest of statement);

... work...

CLOSE workorders;
DEALLOCATE workorders;

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

table variable范围 在特定批次中。所以你不必显式地对drop/deallocate表变量占用的空间做任何事情。

table variable 占用的空间将在创建它的批处理结束时自动删除

【讨论】:

    【解决方案2】:

    首先,你能避开光标吗?如果是这样,请以基于集合的方式重写代码(一次对多行进行操作,而不是一次操作)。

    其次,如果不能,可以使用 LOCAL FAST_FORWARD 游标吗?

    第三,你是对的——你肯定需要释放游标。

    第四,您将多行放入@table 变量中,即doesn't have statistics

    • 不要这样做 - 改用 #temp 表,通过使用 Profiler for SQL:BatchCompleted 并查看读取、写入、CPU、和持续时间!

      • 除非您将 @table 变量作为参数传递,在您的帖子中,您不是

    第五,一般来说,最好在完成后删除 #temp 表。您无需为@table 变量而烦恼。

    【讨论】:

    • 感谢您抽出宝贵时间回复。这是一个简单的“自动化”脚本,旨在绕过某些表上的手动数据输入。我不能使用 FAST_FORWARD 游标,因为我必须循环浏览该游标几次。 @table 最多可能只包含 3 条记录,游标最多可能包含 50 条——通常更像是 10 或 20 条。在这么小的表和查询上使用统计信息没有意义。
    • @TLamb - 你确定使用统计数据没有意义吗?查看 Profiler 在 Reads、Writes、CPU 和 Duration 列中对 RPC:Completed 或 SQL:BatchCompleted 的说明。总的来说,我发现表变量提供有意义的甚至可测量的优势的次数比#temp 表非常非常少 - 而且随着您的系统随着时间的推移而增长,甚至更少,所以除非您真的知道的 - 或测量的 - 使用表变量的充分理由,我总是推荐 #temp 表作为起点。
    • 我不记得我在哪里学到的,但我真正需要的是几个多维数组来循环。根据我的阅读,在 SQL 中执行此操作的唯一方法是使用临时表或表变量......对不起,我没有参考资料。表插入是如此之小,以至于我认为创建然后销毁临时表会对服务器造成更多负担。我将进一步调查......询问的头脑想知道!非常感谢您抽出时间回复和教育!
    • @TLamb - 不要循环遍历 SQL 中的内容 - 这对性能来说绝对是糟糕的。相反,弄清楚每组行需要发生什么,并立即对每个匹配的行执行此操作。请注意,您可以在 INSERT 和 UPDATE 语句中使用 CASE 语句,因此如果需要,您可以在单个语句中满足多个条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多