【发布时间】:2018-01-10 19:06:50
【问题描述】:
我有一个仪表板 Web 应用程序,其中涉及用户登录以查询大量数据 (MS SQL Server 2016) 并查看结果图表。数据也经常变化(比如每小时)。性能尤为重要。
为了提高性能,我发现我可以创建一个临时表来处理大量处理,然后多次重新查询该表(例如,按不同字段分组)以生成不同的图表。当用户第一次登录时,我可以使用这种方法一次性快速为用户预计算大量图表数据。这比每次都执行整个查询要高效得多(即,对 20 个图表中的每一个单独执行“临时表 + 分组”)。
但是,一旦用户登录,他可以采取其他操作来重新使用该临时表数据。理想情况下,我不想在每个后续请求上重新创建临时表,所以我想在客户端登录的整个生命周期内重新使用它。
我认为我不能使用全局表,因为我需要为每个用户单独使用一个。此外,如果用户在客户端的会话超时,SQL Server 也不知道何时删除该表,这可能会导致大量旧临时表和大量数据的堆积。
理想情况下,我希望会话临时表每隔一小时就会过期一次,这样客户端就可以访问多个后续请求的数据,而不必经常重新创建它。
我有哪些选择?
【问题讨论】:
-
鉴于临时表仅在连接期间持续存在,您的想法可能实际上行不通。
-
@Dan Bracuk 最初我正在做的是创建临时表并通过在单个存储过程中重新查询(即在一个请求中)运行 20 个组,返回 20 个结果集一口气给客户。那一点效果很好。我想为后续请求重新使用该初始临时表
-
为什么“一次性快速为用户预计算大量图表数据”比查询源数据更快?听起来所有这些都是过度设计以避免创建正确的索引。如果您将 500,000 行转储到 #temp 表中,然后对这 500,000 行进行多次分组,那么这应该比在没有所有移动数据的情况下直接处理这 500,000 行的适当索引时慢来回到临时表。
-
在某些情况下,将中间数据集转储到 #temp 表可以使 优化器 更容易地制定有效的执行计划,但这并没有听起来像那样。听起来更像是缺少一两个索引来缓解性能问题。您能否提供有关表/索引结构、行数、将相关数据(以及多少行)放入#temp 表的方式以及随后针对该#temp 表运行的查询的更多详细信息?我相当肯定有足够的信息,您可以获得比您明确要求的更好的指导
-
@Aaron 因为生成临时表的初始查询涉及大量连接、计算、函数调用、交叉应用和多个字段的过滤。这需要大约 8 秒才能完成。根据该数据进行的每个分组大约需要 0.5 秒才能完成。
标签: sql sql-server temp-tables global-temp-tables