MS SQL Server 2005で開いている/アクティブな接続の総数を確認する方法


90

PHP / MS SQL Server 2005 / win 2003アプリケーションが非常に応答しなくなることがあり、メモリ/ CPUの使用量が急上昇しません。SQL Management Studioから新しい接続を開こうとすると、接続を開くダイアログボックスでハングします。アクティブな接続の合計数ms sql server 2005を決定する方法

回答:


268

これは、各DBごとの接続数を示しています。

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

詳細が必要な場合は、次を実行します。

sp_who2 'Active'

注:使用されるSQL Serverアカウントには 'sysadmin'ロールが必要です(そうでない場合、結果として単一の行とカウント1が表示されます)


1
素晴らしいありがとうございました。私のような初心者は、SQL Server Management Studioを起動し、データベースを右クリックして[新しいクエリ]を選択し、これを貼り付けて[!移動]ボタンをクリックします。

8
これは、単に間違っているため、受け入れられず、最高投票数の回答でもありません。としてログインしている場合にのみ、返された番号を信頼できますsa。sa以外のユーザーとしてログインしている場合、1が表示されますが、これは実際の接続を表すものではありません。
ajeh 2014年

3
@ajeh:タスクを実行するための十分な権限があることは暗黙的です。あなたのコメントは冗長です。
ミッチウィート

2
@ IEBasara:暗黙的です。管理者以外の人がそのような情報を表示できると思われるのはなぜですか?
ミッチウィート

1
パーティーに遅れましたが.. .. sysadmin必要な役割(コメントの編集)で私の尻を保存しました。私は正しいパーマを持っていると仮定して1を取得し続けました。ふew!修正され、解決されました。win:money_with_wings:
Pure.Krome

7

@jwalkerjrが述べたように、コードで接続を破棄する必要があります(接続プールが有効になっている場合、接続は接続プールに返されるだけです)。これを行うための所定の方法は、 ' using'ステートメントを使用することです。

// Execute stored proc to read data from repository
using (SqlConnection conn = new SqlConnection(this.connectionString))
{
    using (SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = "LoadFromRepository";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@ID", fileID);

        conn.Open();
        using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
        {
            if (rdr.Read())
            {
                filename = SaveToFileSystem(rdr, folderfilepath);
            }
        }
    }
}

質問者は、彼らがPHPを使用していたと述べたので、コードサンプルは彼らに適切ではないかもしれません。ガベージコレクターは、非永続的なSQL Server接続への参照がなくなると自動的にクリーンアップする必要があります(すべての参照はページサイクルの最後にドロップされます)。再利用。
Paul d'Aoust 14

5

これを使用して、各接続プールの正確な数を取得します(各ユーザー/ホストプロセスが同じ接続文字列を使用すると想定)

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

4

これは古いことはわかっていますが、更新することをお勧めします。正確なカウントが必要な場合は、おそらくカラムECIDもフィルタリングする必要があります。並列スレッドを持つSPIDはsysprocessesで複数回表示される可能性があり、ECID = 0をフィルタリングすると、各SPIDのプライマリスレッドが返されます。

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

1

PHPアプリが多くのSQL Server接続を開いたままにしている場合、ご存知かもしれませんが、アプリのデータベースコードに問題があります。使用後に接続プーリングを使用して、これらの接続を解放または破棄する必要があります。トピックに関するまともな記事については、こちらをご覧ください...

http://www.c-sharpcorner.com/UploadFile/dsdaf/ConnPooling07262006093645AM/ConnPooling.aspx


0

sp_whoを参照して、接続数を確認するだけでなく、詳細を確認してください。

あなたの場合、私はこのようなことをします

 DECLARE @temp TABLE(spid int , ecid int, status varchar(50),
                     loginname varchar(50),   
                     hostname varchar(50),
blk varchar(50), dbname varchar(50), cmd varchar(50), request_id int) 
INSERT INTO @temp  

EXEC sp_who

SELECT COUNT(*) FROM @temp WHERE dbname = 'DB NAME'

0

MS SQLナレッジベース-開いているSQLデータベース接続を認識し、どのホストで使用されているかを知る方法。

以下のクエリを使用すると、リストデータベース、ホスト名、開いている接続の総数がわかります。これに基づいて、どのホストがSQL接続を占有しているかがわかります。

SELECT DB_NAME(dbid) as DBName, hostname ,COUNT(dbid) as NumberOfConnections
FROM sys.sysprocesses with (nolock) 
WHERE dbid > 0 
and len(hostname) > 0 
--and DB_NAME(dbid)='master' /* Open this line to filter Database by Name */
Group by DB_NAME(dbid),hostname
order by DBName

0
SELECT
[DATABASE] = DB_NAME(DBID), 
OPNEDCONNECTIONS =COUNT(DBID),
[USER] =LOGINAME
FROM SYS.SYSPROCESSES
GROUP BY DBID, LOGINAME
ORDER BY DB_NAME(DBID), LOGINAME
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.