web-dev-qa-db-ja.com

T-SQLからの選択した出力を非表示

クエリの実行時間を取得しようとしていますが、クエリの出力も非表示にしたいです。経過時間が欲しいだけです-出力はありません。

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]

現時点では、クエリ出力andが期間の最下部に表示されます。これは、出力に関しては、これが唯一必要なことです。私はこれを行うことができず、他の誰かが同様の問題に遭遇したのかどうか疑問に思っていますか?これは、Management Studioなどではなく、T-SQLで実行したいものです。

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

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

13
Gilliam

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

Tempdbのロードまたは自動拡張が結果に影響を与える可能性があるため、通常は#tempテーブルへの挿入はお勧めしません。また、@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内

クエリ結果を破棄するように設定を変更できます。

NUTS

SQLクエリストレス

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

あなたはそれにいくつかの指示を読むことができます ここ

ostress(RMLユーティリティ)

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

私はそれについていくつか書きました ここ

計画エクスプローラー

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

これをクライアントとして使用して、SQL Serveをある程度照会することもできます。

NUTS

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

NUTS

お役に立てれば!

28
Erik Darling

@Selectを使用して@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]

最後の値のみが変数に格納されます。

0
Patrick Hurst

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

.Netで出力メッセージをキャプチャする方法については、 this Stack Overflow answer by AdaTheDev で説明しています。

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

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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