13

私は自分のデータベースでこのクエリを実行しました:

SELECT  
DB_NAME(dbid) as DBName,  
COUNT(dbid) as NumberOfConnections, 
loginame as LoginName 
FROM 
    sys.sysprocesses 
WHERE  dbid > 0 
GROUP BY  dbid, loginame 

---------------------------------------------------
SELECT  COUNT(dbid) as TotalConnections 
FROM sys.sysprocesses 
WHERE  
dbid > 0 
---------------------------------------------------
exec sp_who2 'Active' 

データベースへの接続の総数を知りたい。最初のクエリの合計と2番目のクエリの量は同じですが、3番目のクエリは異なる行数を返します。

3番目のクエリが何を返すか知りたいですか?3番目のクエリの結果のステータスの一部はsleepingです。これは何を意味するのでしょうか?接続はアイドル状態ですか、それともプールで準備ができていますか?sleeping結果に多くの接続がある場合、それはどういう意味ですか?

ありがとう

4

1 に答える 1

14

のステータスsleepingは、セッションが接続されているがアクティブに何も実行されていないことを意味します(たとえば、最も単純な定義は、おそらく100%正確ではありませんが、にそのための何もないということですsession_idsys.dm_exec_requests

sp_who2 'active'sleepingステータスが、または最後のコマンドがAWAITING COMMANDLAZY WRITERまたはのすべてのspidを除外しますCHECKPOINT SLEEP。いいえ、私は何をするのか覚えていませんでしたsp_who2。私は単にソースコードを見ました:

EXEC master..sp_helptext sp_who2;

これsp_who2は文書化されておらず、サポートされていないことに注意してください。sysprocessesは非推奨であり、現在は下位互換性の理由でのみ存在しています。アダム・マハニックのsp_whoisactiveのような手順を使用すると、より良いサービスが提供されると思います。または、少なくとも、sys.dm_exec_sessionsやのような最新のDMVの使用方法を知っているsys.dm_exec_requests

編集

最近のDMVでは、関連するデータベースがまだ適切に公開されていないという残念な免責事項を追加する必要があります。しかし、とにかくそれは本当にどういう意味ですか?このようなクエリがある場合:

USE database_A;
GO

SELECT [column] FROM database_B.dbo.[table] 
  UNION ALL
SELECT [column] FROM database_C.dbo.[table];

sys.sysprocesses.dbidこのクエリの実行中に、そのセッションでどのデータベースIDが反映されると思いますか?実際に何が起こるかを判断するための演習として、読者に任せます。簡単に言うと、これは、現在「アクセス」されているデータベースを知るために信頼したいビュー/列ではありません。

于 2012-06-24T18:06:04.000 に答える