วิธีกำหนดจำนวนการเชื่อมต่อที่เปิด / แอ็คทีฟทั้งหมดใน ms sql Server 2005


90

แอปพลิเคชั่น PHP / MS Sql Server 2005 / win 2003 ของฉันบางครั้งไม่ตอบสนองมากการใช้งานหน่วยความจำ / cpu ไม่ขัดขวาง ถ้าฉันพยายามเปิดการเชื่อมต่อใหม่จากสตูดิโอการจัดการ sql มันก็แฮงค์ที่กล่องโต้ตอบการเชื่อมต่อที่เปิดอยู่ วิธียับยั้งจำนวนการเชื่อมต่อที่ใช้งานอยู่ทั้งหมด ms sql server 2005

คำตอบ:


269

นี่แสดงจำนวนการเชื่อมต่อต่อแต่ละ 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 คลิกขวาที่ฐานข้อมูลของคุณเลือก New Query วางสิ่งนี้แล้วคลิกปุ่ม "! Go"

8
สิ่งนี้ไม่ควรได้รับการยอมรับหรือคำตอบที่ได้รับการโหวตสูงสุดเนื่องจากไม่ถูกต้อง คุณสามารถพึ่งพาหมายเลขที่ส่งคืนได้หากคุณเข้าสู่ระบบsaด้วย หากคุณเข้าสู่ระบบในฐานะผู้ใช้ที่ไม่ใช่ sa คุณจะเห็น 1 และนั่นจะไม่ใช่ตัวแทนของการเชื่อมต่อจริง
ajeh

3
@ajeh: เป็นนัยว่าคุณมีสิทธิ์เพียงพอที่จะทำงานนี้ ความคิดเห็นของคุณซ้ำซ้อน
Mitch Wheat

2
@ IEBasara: เป็นนัย เหตุใดคุณจึงคาดหวังให้ผู้ที่ไม่ใช่ผู้ดูแลระบบสามารถดูข้อมูลดังกล่าวได้
Mitch Wheat

1
ไปงานปาร์ตี้สาย .. แต่ .. sysadminบทบาทที่ต้องการ (แก้ไขความคิดเห็น) บันทึกก้นของฉัน ฉันได้รับ 1 ต่อไปโดยสมมติว่าฉันมีสิทธิ์ที่เหมาะสม วุ้ย คงที่และเลื่อน ชนะ : money_with_wings:
Pure.Krome

7

ดังที่ @jwalkerjr กล่าวไว้คุณควรกำจัดการเชื่อมต่อในโค้ด (หากเปิดใช้งานการเชื่อมต่อพูลการเชื่อมต่อจะถูกส่งกลับไปยังพูลการเชื่อมต่อ) วิธีที่กำหนดในการดำเนินการนี้คือการใช้usingคำสั่ง '':


ผู้ถามบอกว่าพวกเขาใช้ PHP ดังนั้นตัวอย่างโค้ดอาจไม่เหมาะสมสำหรับพวกเขา ตัวรวบรวมขยะควรล้างการเชื่อมต่อ SQL Server แบบไม่ต่อเนื่องโดยอัตโนมัติเมื่อไม่มีการอ้างอิงอีกต่อไป (และการอ้างอิงทั้งหมดจะถูกทิ้งเมื่อสิ้นสุดรอบเพจ) แต่ผู้ถามอาจใช้การเชื่อมต่อแบบต่อเนื่องซึ่งต้องการการเชื่อมต่อที่ชาญฉลาด ใช้ซ้ำ
Paul d'Aoust

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 ที่มีเธรดแบบขนานสามารถแสดงได้หลายครั้งในระบบประมวลผลและการกรอง 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.