1

我有一份报告,它在执行时使用用户名连接到数据库my_report_user。报告可以有许多最终用户。并且在每次执行中都会建立一个到数据库的新连接my_report_user(没有连接池)

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

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

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

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

4

3 回答 3

4

两者都不

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

临时表、bot #local 和 ##shared 的生命周期由连接控制。如果您的应用程序断开连接,则临时表将被删除,这与您描述的内容不符。

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

作为旁注,SQL Server Reporting Services 已经开箱即用地做到了这一点。您可以缓存和共享数据集,您可以缓存和共享报告,它已经为您工作并经过测试。

于 2009-10-20T17:50:44.837 回答
3

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

于 2009-10-20T18:55:55.820 回答
0

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

于 2009-10-20T17:57:00.067 回答