2012-06-24 22 views
9

की स्थिति सो का अर्थ मैं अपने डेटाबेस में इस क्वेरी भाग गया:खुले कनेक्शनों की संख्या और एक कनेक्शन

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' 

मैं अपने डेटाबेस के लिए कनेक्शन की कुल संख्या जानना चाहते हैं। पहली क्वेरी और दूसरी क्वेरी की राशि बराबर होती है लेकिन तीसरी क्वेरी पंक्तियों की एक अलग संख्या देता है।

मैं जानना चाहता हूं कि तीसरी क्वेरी क्या लौटाती है? मुझे तीसरी क्वेरी के परिणामस्वरूप sleeping के परिणाम में कुछ स्थिति दिखाई देती है। इसका क्या मतलब है? कनेक्शन निष्क्रिय है, या यह पूल में तैयार है? मेरे परिणाम में यदि मेरे पास sleeping कनेक्शन हैं तो इसका क्या अर्थ है?

धन्यवाद

+0

मुझे नहीं लगता कि 'sleeping' तीसरे क्वेरी से लौटा दिया जाएगा जब तक आप इसे' 'active'' ... –

उत्तर

11

sleeping की स्थिति का मतलब सत्र से जुड़ा हुआ है, लेकिन सक्रिय रूप से कुछ भी नहीं चल रहा है (जैसे सरल परिभाषा है, जबकि शायद नहीं 100% सही, sys.dm_exec_requests में है कि session_id के लिए कुछ भी नहीं है कि वहाँ है)।

sp_who2 'active' किसी भी spid sleeping की एक स्थिति है या AWAITING COMMAND, LAZY WRITER या CHECKPOINT SLEEP के पिछले आदेश है कि बाहर फिल्टर। नहीं, मैंने याद नहीं किया कि sp_who2 क्या करता है; मैं बस स्रोत कोड को देखा:

EXEC master..sp_helptext sp_who2; 

ध्यान दें कि sp_who2 undocumented है और असमर्थित, और sysprocesses हटा दिया गया है और वर्तमान में केवल पिछड़े संगतता कारणों के लिए मौजूद है। Adam Machanic's sp_whoisactive जैसी प्रक्रिया के साथ, आपको बेहतर सेवा मिलेगी। या कम से कम यह जानने के लिए कि sys.dm_exec_sessions और sys.dm_exec_requests जैसे अधिक आधुनिक डीएमवी का उपयोग कैसे करें।

संपादित

मैं दुर्भाग्यपूर्ण त्याग कि और अधिक आधुनिक DMVs अभी भी ठीक से डेटाबेस (रों) शामिल प्रकट नहीं करते जोड़ना चाहिए। लेकिन वैसे भी इसका क्या मतलब है? आप इस तरह से एक प्रश्न पूछना चाहते हैं तो:

USE database_A; 
GO 

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

क्या डेटाबेस आईडी आप उम्मीद करते हैं कि सत्र के लिए sys.sysprocesses.dbid में परिलक्षित हो जाएगी, जबकि इस क्वेरी चल रहा है? वास्तव में क्या होता है यह निर्धारित करने के लिए मैं पाठक को एक अभ्यास के रूप में छोड़ दूंगा। लंबी कहानी छोटी, यह वह दृश्य/कॉलम नहीं है जिसे आप भरोसा करना चाहते हैं कि वर्तमान में कौन से डेटाबेस "स्पर्श किए जा रहे हैं।"

+0

करता है 'निर्दिष्ट करने sleeping' कनेक्शन मतलब पिछले आदेश पर अमल के बाद बंद नहीं होने के पहले चली? – Arian

+0

@ केरेज़ो जरूरी नहीं है; कनेक्शन पूलिंग, जहां कनेक्शन कर रहे हैं फिर से इस्तेमाल किया है, भले ही आवेदन स्पष्ट रूप से कनेक्शन बंद कर देता है पर विचार - यह सिर्फ पूल के लिए कनेक्शन दिखाए, लेकिन एसक्यूएल सर्वर के लिए कनेक्शन विच्छेद और 'sys.dm_exec_sessions' से पंक्ति को हटाने का उद्देश्य विफल हो जाएगा कनेक्शन पूलिंग। –

संबंधित मुद्दे