只获取几个结果集

本文关键字:几个 结果 获取 | 更新日期: 2023-09-27 18:04:49

这个问题很简单。我有以下SQL:

SELECT *
FROM T1
SELECT *
FROM T2
SELECT *
FROM T3
SELECT *
FROM T4

在一种情况下,我需要所有四个数据集,在另一种情况下,我只需要T1T2。我应该写另一个存储过程,只返回T1T2,或者我可以跳过最后两个数据集(不执行SQL引擎上的批处理)。

我的意思是,如果我只获取T1T2与以下代码

var reader = command.ExecuteReader();
ReadSet1();
reader.NextResult();
ReadSet2();
reader.Close()

SQL server是否执行T3T4的批处理?

只获取几个结果集

Reader只读取前面的数据

可能会启动NextResult();但是它不会全部执行,除非它能放进缓冲区


试试这个读取T1后,更改T4
中的值您将看到新值(除非行数较低)
如果SQL在开始处运行所有4,则不会看到新值

您还可以返回一个getdate,用于衡量何时获取行

ExecuteReader将执行整个过程。如果您观察分析器并在步骤之间设置代码延迟,您将看到这一点。您的其他步骤并不反对该过程,它们反对以reader形式出现的该过程的执行结果。

你应该做什么是一个意见和权衡的问题。一方面,如果您使用相同的过程,您将获得代码重用的优势,并且如果需要为数据集1或2修改某些内容,则更改代码的位置将减少一半。另一方面,如果您将它们分开(分成两个或四个),您将获得效率上的优势。因此,这真的归结为查询的成本有多高……至少这对我来说是决定性的。一般来说,我会说最好的方法是有4个独立的进程,但如果它们真的是低影响的查询,我不知道我是否会花时间。

Shnugo提出的另一个选项是有一个或多个参数…比如@returnAll4 BIT。应用程序将通过它,如果它是0/false,你可以通过在它们上放置一个WHERE @returnAll4 = 1过滤器来避免执行第三和第四个数据集。你仍然会在执行计划中看到它们,但它们实际上除了过滤器求值之外不会做任何事情。我曾经使用过这种方法,但我倾向于远离它,因为我担心将来其他开发人员可能会对它有点不清楚。

由于SQL Server不知道您在应用程序中使用结果集做什么,因此无论您是否需要它们,它都会准备所有结果集。至少我是这样认为的。

您可以打开Profiler来监视SELECT发生的时刻,一次或一个接一个…但我很确定,这个过程对所有…

你会:

  • 为每个SELECT创建一个过程(实际上最好是内联表值函数)。这是——当然!-更好和更干净的方法,但可能对调用应用程序的代码有很大的影响。或者

  • 传入@LoadT1 BIT, @LoadT2 BIT...等参数,在IF之后加载。在c#代码中,可能存在一个现有的函数或方法来执行调用。只需给这个函数提供4个默认值的布尔参数(可选参数)。任何现有的代码都不需要更改。但在有意义的情况下,你可以设置适当的参数。