隐藏从T-SQL选择输出


13

我正在尝试获取查询执行时间,但我也想隐藏查询输出。我只想要经过的时间-没有输出。

DECLARE @Start datetime
DECLARE @End datetime

SELECT @StartTimeWA=GETDATE() 

SELECT 
       [id] 
      ,[database_id]
      ,[proc_name]
      ,[exec_t] from
  [DB].[dbo].[STAT] 

SELECT @End=GETDATE()

SELECT DATEDIFF(MS,@Start,@End) AS [Duration]

此刻,我得到查询输出,我的持续时间却是最短的,这是我想要的唯一结果。我一直无法做到这一点,想知道是否还有其他人遇到过类似的问题?这是我想在T-SQL中执行的操作,而不是Management Studio或类似的操作。

我正在尝试监视运行select语句并向服务器报告的时间。我有一个外部监视器服务器,它将每分钟运行一次,并获取时间(花费的时间),我将随时间使用它来趋势/基线。由于当前查询吐出了选择的结果,并且我的持续时间使它歪斜了,所以我的监控服务器感到困惑。我只想要工期列。我还将对插入内容执行此操作,这将很简单,因为它不需要执行选择。

我试图纯粹在T-SQL中执行此操作。我不想使用DMV,因为我想获取运行查询时所花费的时间(快照),并检查当服务器经历各种负载级别时,时间是否随时间而变化,因为这会给我一个好主意关于查询执行时间是否改变。

Answers:


28

有很多不同的方法可以做到这一点。

我通常不建议插入#temp表中,因为任何tempdb加载或自动增长都可能影响结果,并且我绝对不建议使用@table变量,因为对这些变量的修改是强制串行的(不能使用并行计划),可能会更改实际查询时间。

变量分配

您可以声明一个变量并为其分配列,如下所示:

DECLARE @Start datetime
DECLARE @End datetime
DECLARE @blob_eater SQL_VARIANT;

SELECT @StartTimeWA=GETDATE() 

SELECT 
       @blob_eater = [id] 
      ,@blob_eater = [database_id]
      ,@blob_eater = [proc_name]
      ,@blob_eater = [exec_t] from
  [DB].[dbo].[STAT] 

SELECT @End=GETDATE()

SELECT DATEDIFF(MS,@Start,@End) AS [Duration]

尽管这样做可能会阻止某些参数嵌入优化。请参阅“嵌入限制”下的参数嗅探,嵌入和RECOMPILE选项

请注意,此方法可能会触发有关隐式转换的计划警告,但是您不必担心这种警告。有关背景,请参见此问答:触发此警告的原因:表达式中的类型转换可能会影响“查询计划选择”中的“ CardinalityEstimate”

在SSMS中

您可以更改设置以放弃查询结果。

坚果

SQL查询压力

SQL Query Stress是一个开源工具,允许您对SQL Server运行查询以模拟负载。运行时,没有查询结果返回到应用程序。

您可以在此处阅读一些说明。

压力(RML实用工具)

ostress是Microsoft发布的类似工具,除非您选择这样做,否则也不会将结果返回给客户端。

我在这里写过一些。

计划浏览器

SentryOne的计划资源管理器是查看SQL Server执行计划和死锁的免费替代方案。

您也可以将其用作客户端以某种程度查询SQL Serve:

坚果

这也会丢弃结果。

坚果

希望这可以帮助!


0

您可以SET STATISTICS TIME ON使用外部监视器服务器上的监视应用程序执行查询并捕获输出消息。

AdaTheDev此Stack Overflow答案中说明了一种使用.Net捕获输出消息的方法

您可以通过在连接上的InfoMessage事件中添加事件处理程序来实现。

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}

0

您是否可以仅使用初始选择返回@End?

从[DB]中选择SELECT @blob_eater = [id],@ blob_eater = [database_id],@ blob_eater = [proc_name],@ blob_eater = [exec_t]。[STAT]

SELECT @ End = GETDATE()

成为

从[DB]。[dbo]中选择SELECT @ End = GETDATE()。[STAT]

仅最后一个值将存储在变量中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.