来自存储过程的多个结果集的 s-s-rS 最佳实践
Posted
技术标签:
【中文标题】来自存储过程的多个结果集的 s-s-rS 最佳实践【英文标题】:s-s-rS Best practice for multiple result sets from Stored Procedure 【发布时间】:2014-07-08 14:17:20 【问题描述】:我正在使用 s-s-rS 2008,想获得一些关于处理多个结果集的最佳实践的建议。
我有一个存储过程,它返回 4 个相关数据的结果集,但是每个结果集返回的记录数不同。当然,在 s-s-rS 中只处理第一个结果集,所以据我所知,我有 2 个选项:
-
创建 4 个不同的存储过程,它们返回 4 个不同的数据集
将所有 4 个结果集插入一个临时表并返回该表中的结果。
第一个选项的问题是 4 个结果都来自相同的基本数据(进入临时表),然后与其他表/数据连接/分组。因此,将它们拆分为单独的存储过程似乎会给 DB 带来比单个存储过程更大的压力。
第二种方法的问题是我必须将相同的数据集包含到 s-s-rS 中 4 次,每次都提取不同的结果集并过滤掉正确列上的空值。
例如,假设我有 4 个结果集,每个结果集返回 4 列和 4 条记录。前 4 列和前 4 条记录与第一个结果集相关(其余列为空)。第二个结果集仅填充第 5-8 列和第 5-8 列等。
问题是,哪种方式更有效?在 s-s-rS 中多次使用多个存储过程或 1 个存储过程?谢谢!
【问题讨论】:
如果列匹配,您可以将结果与每个列上的附加列合并以标记它来自哪个结果集 Multiple Datasets from Stored Procedure in s-s-rS的可能重复 【参考方案1】:听起来数据检索是更昂贵的操作,所以您可能只想这样做一次。 (虽然我不确定你是否会“强调”SQL Server,但如果那是数据源:基本数据和连接/分组数据可能会在内存中,因此如果不同的存储过程可能不会发生额外的物理读取重新读取数据。)
考虑一个包含多个实体的实体框架 LINQ-to-SQL 查询:结果集的形状非常宽,每个实体的每个字段都有一个列。但这避免了为每个包含的实体访问数据库。
除非您的报告有数百页或以其他方式呈现或处理密集型,否则我认为选项 #2 可能更有效。
您能否查看 s-s-rS 执行日志中的执行统计信息?我总是使用 ExecutionLog3 视图,并检查 TimeDataRetrieval 与 TimeProcessing 和 TimeRendering 的时间。
编辑
我知道在这里只包含链接是不受欢迎的,但我不想包含可能不是我创建的受版权保护的东西。
请参阅此处http://www.asp.net/web-forms/tutorials/continuing-with-ef/maximizing-performance-with-the-entity-framework-in-an-asp-net-web-application 的检查发送到数据库的查询 部分,以获取沿 ...Departments.Include(" 行的 LINQ-to-SQL 查询示例Person").Include("Courses").特别注意 Text Visualizer 的图片,它显示了构造的查询:它与您的选项 #2 相似,因为多个实体包含在同一结果集中。
【讨论】:
以上是关于来自存储过程的多个结果集的 s-s-rS 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
使用 vba 在 MS-Access 前端中来自 MySQL 存储过程的多个结果集?