gpt4 book ai didi

asp.net - 缓存 SELECT 语句的结果以便在多个查询中重用

转载 作者:行者123 更新时间:2023-12-03 03:26:59 25 4
gpt4 key购买 nike

我有一个相当复杂的查询,用于根据用户输入的参数提取我感兴趣的结果的 Id 字段。

提取相关 Id 后,我在单独的查询中多次使用生成的 Id 集,以提取我想要的实际输出记录集(通过加入其他表、使用聚合函数等)。

我想避免为我想要返回的每组结果单独运行初始查询。我想我的情况是一种常见模式,所以我对最好的方法感兴趣。

数据库位于 MS SQL Server 中,我使用的是 .NET 3.5。

最佳答案

如果问题包含对未优化解决方案的一些测量(数据大小、时间),那肯定会有帮助。这里可以考虑多种技术,其他答案中列出了一些技术。我假设您不想重复运行相同查询的原因是性能。

如果缓存 ID 集的所有使用都包含整个集与其他表的联接,则解决方案绝对不应该涉及在数据库外部缓存 ID 集。如果可以避免的话,数据不应来回传输。

在某些情况下(当不涉及游标或极其复杂的 SQL 时),最好(即使违反直觉)不执行缓存,而只是将重复的 SQL 加入到所有所需的查询中。毕竟,每个查询都需要基于连接的表之一进行遍历,然后性能在很大程度上取决于快速连接和评估所有剩余信息所需的索引的可用性。

在数据库中“缓存”ID 集的最直观方法是使用临时表(如果名为#something,则它对于连接而言是私有(private)的,因此可供并行独立客户端使用;或者它可以被命名为##something并且是全局的)。如果表中有很多记录,则需要索引。为了获得最佳性能,索引应该是聚集索引(每个表只允许一个),或者仅在构建该集合后创建,其中索引创建速度稍快。

索引 View 显然比临时表更可取,除非底层数据在整个过程中只读,或者您可以并且想要忽略此类更新以保持整个报告集的一致性。然而,索引 View 始终准确预测底层数据的能力是以减慢更新速度为代价的。

这个问题的另一个答案提到了存储过程。这很大程度上是组织代码的一种方式。但是,如果采用这种方式,最好避免使用临时表,因为对临时表的此类引用会阻止存储过程的预编译;如果可以的话,请获取 View 或索引 View 。

无论您选择哪种方法,都不要猜测性能特征和查询优化器行为。学习显示查询执行计划(在 SQL Server Management Studio 中)并确保您看到的是索引访问,而不是组合多个大型数据集的嵌套循环;只添加能够明显且极大地改变查询性能的索引。选择良好的索引通常可以将查询的性能改变 1000 倍,因此学习起来有些复杂,但对于成功至关重要。

最后但并非最不重要的一点是,请确保在重新填充数据库时(以及每晚在生产中)使用 UPDATE STATISTICS,否则您的查询优化器将无法将您创建的索引放入其数据库中。最佳用途。

关于asp.net - 缓存 SELECT 语句的结果以便在多个查询中重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8921820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com