本地vs全局临时表 - 何时使用什么?

时间:2009-10-20 17:42:06

标签: sql sql-server sql-server-2005 reporting tempdb

我有一个报告,在执行时使用my_report_user用户名连接到数据库。报告中可能有许多最终用户。在每次执行中,将使用my_report_user建立与数据库的新连接(没有连接池)

我有一个结果集,我认为可以只创建一次(可能是在报告的第一次运行),其他报告执行可以重用那些东西。基本上每个报告执行都应检查此结果集(存储为临时表)是否存在。如果它不存在则创建该结果集,否则只重用可用的结果。

我应该使用local临时表(#)还是global临时表(##)?

有没有人试过这样的东西,如果是的话,请让我知道我应该关心的是什么? (几乎同时报告运行等)

编辑:我正在使用Sql-Server 2005

3 个答案:

答案 0 :(得分:4)

<强>既不

如果要在自己的控制下缓存结果结果集,则不能使用任何类型的临时表。您应该使用普通用户表,存储在tempdb中,甚至拥有自己的结果集缓存数据库。

临时表,机器人#local和## shared的生命周期由连接控制。如果您的应用程序断开连接,则会删除临时表,但这与您描述的内容不相符。

真正困难的问题是在concurent运行下填充这些缓存的结果集而不会混淆(最终结果集包含来自concurent报表运行的重复项,两者都认为是'第一次'运行)。

作为旁注,SQL Server Reporting Services已经开箱即用。您可以缓存和共享数据集,可以缓存和共享报告,它已经可以使用并且已经过测试。

答案 1 :(得分:3)

我发现#temp表在某些情况下很有用,但不是最佳实践。我还没有找到全局##临时表的有效用途,无论是在我自己的工作中,还是在写过它们的任何其他人的工作中。我能想到的唯一情况是BCP或其他需要构建临时数据存储然后在后续步骤中检索它的外部进程。在这种情况下,我宁愿使用具有某种键和后台进程的永久表来处理清理。

答案 2 :(得分:0)

听起来你现在正在进入OLTP模式。阅读数据库仓库肯定会对您有所帮助。

相关问题