SQL Server临时表的最佳使用方法

3
我有一个仪表盘Web应用程序,用户需要登录以查询大量数据(MS SQL Server 2016)并查看结果的图表。这些数据也经常发生变化(比如每小时一次)。性能尤为重要。
为了提高性能,我发现可以创建一个临时表,处理大量数据,然后多次重新查询该表(例如按不同字段分组),以生成不同的图表。当用户首次登录时,我可以使用此方法在一次操作中快速预先计算用户的大量图表数据。这比每次执行整个查询(即为20个图表单独执行“临时表+分组”操作)要高效得多。
但是,一旦用户登录成功,他可以采取其他操作,其中他可以重复使用临时表数据。理想情况下,我不希望在每个后续请求上都重新创建临时表,因此我希望在客户端登录期间重复使用它。
我认为无法使用全局表,因为我需要为每个用户单独设置一个表。而且,如果用户的会话在客户端超时,SQL Server不知道何时删除表,可能导致大量旧临时表和大量数据积累。
理想情况下,我希望有一个会话临时表,它会在一小时后过期,这样客户端就可以访问多个后续请求的数据,并且不必经常重新创建表。
我有哪些选项可以做到这一点?

鉴于临时表只在连接持续期间存在,你的想法可能实际上行不通。 - Dan Bracuk
@Dan Bracuk 初步,我正在创建临时表并在一个存储过程中运行20个分组查询(即在一个请求中),它会一次性将20个结果集返回到客户端。这部分工作很好。我想重用最初的临时表用于后续请求。 - rwatson89
1
为什么“一次快速预先计算用户的大量图表数据”比查询源数据更快?听起来这一切都是过度工程,为了避免创建正确的索引。如果你将 500,000 行数据倒入 #temp 表中,然后多次对这些 500,000 行进行分组,那么这应该比如果你有适当的索引直接处理这些 500,000 行而不需要来回移动数据到临时表中要 - Aaron Bertrand
可能是正确的,但有很多数据(数百万行),而且已经将时间缩短了很多(当我接手时它比8秒要长得多!)。有许多where子句执行“where fieldID in(800个ID)”。 - rwatson89
我必须在这里同意Aaron的观点。8秒对于查询来说是非常长的时间。你说它相当复杂,有许多函数和其他东西。我敢打赌,性能问题就在主查询和/或这些函数中。 - Sean Lange
显示剩余4条评论
1个回答

0
我建议使用临时表来快速检索数据的唯一场景是,该数据是最终的,即不会更改。比如讣告就是一个很好的例子。如果你这样做,每个人生成图表时可能会得到不同的数据。A查询并获得了一个临时表的数据并创建图表。B查询并获取所有新的和修改过的数据,并创建新的图表。A再次查询并从他们的第一次查询中获得原始数据,从未看到B看到的内容。因此,我不建议使用这种方法。

抱歉,我不太明白。这听起来像是我想要的。A人发出请求,存储过程创建临时表并在其上运行20个组查询,然后一次将20个结果集返回给客户端。B人执行相同操作,并获得自己的20个结果集。这是期望的行为。我的问题是,如果A人稍后再次请求,我希望他们能够重复使用他们的临时表数据以进行其他目的。使用临时表或其他方法是否可能实现? - rwatson89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接