C# 将“在临时表中计算中间结果”SQL模式调整到LINQ?

C# 将“在临时表中计算中间结果”SQL模式调整到LINQ?,c#,linq-to-sql,sql-server-2008-r2,C#,Linq To Sql,Sql Server 2008 R2,我的团队构建了一个C web应用程序,它可以生成临时报告,以不同的方式重新组合来自同一核心SQL Server 2008 R2表集的数据。例如,一个仪表板页面可以包含每个地区今天的销售额列表、上周最低销售额项目及其趋势列表、表现最佳的销售人员列表以及20多个其他指标和图表。在封面之下,一个典型的仪表板页面需要在20多个不同的表中进行至少30次查询 不幸的是,冻结这些数据并对其进行预计算是不现实的——我们需要动态获取实时数据 为了加快这些页面的速度,我们的技巧是识别提取相同底层数据的不同查询。然后

我的团队构建了一个C web应用程序,它可以生成临时报告,以不同的方式重新组合来自同一核心SQL Server 2008 R2表集的数据。例如,一个仪表板页面可以包含每个地区今天的销售额列表、上周最低销售额项目及其趋势列表、表现最佳的销售人员列表以及20多个其他指标和图表。在封面之下,一个典型的仪表板页面需要在20多个不同的表中进行至少30次查询

不幸的是,冻结这些数据并对其进行预计算是不现实的——我们需要动态获取实时数据

为了加快这些页面的速度,我们的技巧是识别提取相同底层数据的不同查询。然后,我们从这些基础表计算中间结果,将这些结果缓存到临时表中,然后将该临时表连接到其他表以计算最终结果。使用这种方法,我们通常可以将特定仪表板所需的I/O和时间减少10倍

我们的团队希望将相同的模式应用于使用LINQ到SQL进行数据访问的类似页面。我们喜欢LINQ,因为它的编程易用性、单元测试等。但是,对于上面描述的应用程序,我们执行可能部分依赖于同一底层数据的多个查询,其性能令人讨厌

当然,我可以调用AsEnumerable来具体化中间查询结果,但是如果中间结果很大,那么将结果输入和输出SQL将否定性能胜利,并在@p1中创建数百项长度的低效参数化查询。。。条款

在一个完美的世界中,LINQtoSQL将提供一个AsServerEnumerable方法,该方法将创建一个中间结果的临时表,我可以在不离开数据库的情况下在下游重复使用

这样的东西存在吗

如果没有,您对如何使我们的服务器端中间物化模式在LINQ上良好工作有何建议


另外,我说的是临时表,而不是上面提到的表变量,因为临时表更适合于更昂贵的查询、并行查询计划、非聚集索引等。。但除此之外,上述所有内容也将应用于表变量。

不,这在原始LINQ中不存在,并且在我所知道的任何LINQ样式API中都没有预先封装


如果您忽略LINQ to SQL的LINQ部分,只使用db.ExecuteQuerysql,args方法,它可能存在,但是如果您这样做,您必须注意确保您正在向数据上下文传递一个显式的开放连接如果您使用连接字符串方法,连接管理将自动处理,而且不能保证在操作之间获得相同的连接-它可以从池中获取,因此,即使它是相同的基础连接,它也会被重置,删除任何临时表。

,如果有大量的读取,可以考虑创建视图而不是临时表,并将聚集索引添加到该视图中。这将在数据库中具体化视图

SQL Server可以通过两种不同的方式使用索引视图。首先,可以直接从查询调用视图,因为目前使用的是传统视图。但它没有运行视图的基础SELECT语句并动态创建视图的结果集,而是使用唯一的聚集索引几乎立即显示视图的结果。其次,在SQLServer2000/2005上运行的任何查询都会自动求值,以查看是否存在任何现有的索引视图可以实现该查询。如果是这样,查询优化器将使用索引查询,即使查询中没有指定它,也会大大加快查询速度

更多信息: