2009-10-20 37 views
1

我有一个执行连接到数据库的报告,用户名为my_report_user。报告中可能有许多最终用户。并在每次执行一个新的连接到数据库将与my_report_user(没有连接池)本地vs全球临时表 - 什么时候使用?

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

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

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

编辑:我使用的SQL Server 2005中

+0

什么版本的SQL Server?如果2005+,CTE(也可能是递归CTE)是另一种选择。如果不了解更多有关您需要如何处理它们的信息,我推荐使用本地全局临时表...... – 2009-10-20 17:44:58

+0

做出最坏情况的假设:全局临时表不会因为连接仍然存在而丢失,该表中的数据失效?即定义何时必须刷新数据以避免报告中的错误数据? – 2009-10-20 17:48:04

+0

其sql-server 2005.你确定本地临时表允许我重新使用。我在考虑本地临时表将不允许跨多个报告执行的可重用性。现在知道这个版本,你说什么? – peakit 2009-10-20 17:48:35

回答

4

无论

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

临时表,bot #local和##共享的寿命由连接控制。如果您的应用程序断开连接,临时表将被删除,这与您描述的不一致。

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

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

+0

“真正困难的问题是将这些缓存的结果集合填充到concurent下,而不会混淆”我也担心这件事。感谢您的帮助,顺便说一句。 – peakit 2009-10-20 18:01:54

+2

您可以使用应用程序锁。使用标识您正在查看的报告的资源,例如。 “2009财年北西部销售报告”,或“报告编号42”。 1. sp_getapplock'shared','session'。 2.检查数据集(如果存在),将其用于报告,然后释放应用程序锁定并退出。 3.如果不存在,则释放应用程序loc,将其还回X sp_getapplock'独占','会话'。 4.再次检查报告是否存在,如果没有创建并使用它,则释放锁定并退出。 5.如果在获得X锁定后报告存在,则释放x锁定,返回步骤1. – 2009-10-20 18:11:24

+0

我很感谢您的知识。但仍然有可能引擎清除结果集(当没有到## temp表的活动连接时)。这打破了我缓存的目的。说啥?虽然你给的任何锁定机制都可以解决并发问题...... – peakit 2009-10-20 18:26:12

0

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

3

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

相关问题