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]

現時点では、私は、クエリの出力を取得し、私は限り出力が行くようにしたい唯一のものです下の私の継続、で。私はこれを行うことができず、他の誰かが同様の問題に遭遇したかどうか疑問に思っていますか?これは、Management Studioやそのようなものではなく、T-SQLでやりたいことです。

selectステートメントを実行してサーバーに報告するのにかかる時間を監視しようとしています。私はそれを毎分実行し、時間を取り戻し(所要時間)、時間とともにトレンド/ベースラインに使用する外部モニターサーバーを持っています。現在のクエリは選択結果と私の継続時間を吐き出すので、それはそれを歪め、私の監視サーバーは混乱します。期間の列が必要でした。また、挿入に対してもこれを行います。これは、選択を実行する必要がないため簡単です。

私はこれを純粋にT-SQLでやろうとしています。クエリを実行するときにかかる時間(スナップショット)を取得し、サーバーがさまざまなレベルの負荷を通過するときにこれが変化するかどうかを確認したいので、DMVを使用したくないクエリの実行時間が変わるかどうか。

回答:


28

これを行うには、さまざまな方法があります。

#temptempdbのロードや自動拡張は結果に影響を与える可能性があるため、通常はテーブルに挿入することはお勧めしません@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オプションを参照してください。

このメソッドは、暗黙的な変換に関する計画の警告をトリガーする可能性がありますが、心配する必要のある種類ではないことに注意してください。背景については、このQ&Aを参照してください:この警告の原因:式の型変換がクエリプランの選択の "CardinalityEstimate"に影響を与える可能性があります。

SSMSで

設定を変更して、クエリ結果を破棄できます。

ナッツ

SQLクエリストレス

SQL Query Stressは、負荷をシミュレートするためにSQL Serverに対してクエリを実行できるオープンソースツールです。実行時にクエリ結果はアプリケーションに返されません。

ここでいくつかの指示を読むことができます

ostress(RMLユーティリティ)

ostressは、Microsoftが公開している同様のツールであり、選択しない限り、クライアントに結果を返しません。

ここでそれについて書い

計画エクスプローラー

SentryOneのPlan Explorerは、SQL Serverの実行計画とデッドロックを表示するための無料の代替手段です。

また、クライアントとして使用して、SQLサーバーにある程度照会することもできます。

ナッツ

これも結果を破棄します。

ナッツ

お役に立てれば!


0

SET STATISTICS TIME ON外部モニターサーバーで監視アプリを使用して、クエリを実行し、出力メッセージをキャプチャできます。

.Netで出力メッセージをキャプチャする方法は、AdaTheDevによるこのスタックオーバーフローの回答で説明されています

これを行うには、接続のInfoMessageイベントにイベントハンドラーを追加します。

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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

0

最初の選択を使用して@Endを返すだけではできませんか?

SELECT @blob_eater = [id]、@ blob_eater = [database_id]、@ blob_eater = [proc_name]、@ blob_eater = [exec_t] from [DB]。[dbo]。[STAT]

SELECT @ End = GETDATE()

になる

SELECT @ End = GETDATE()FROM [DB]。[dbo]。[STAT]

最後の値のみが変数に保存されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.