استخدام وحدة المعالجة المركزية عن طريق قاعدة البيانات ؟

StackOverflow https://stackoverflow.com/questions/28952

  •  09-06-2019
  •  | 
  •  

سؤال

هل من الممكن الحصول على تفاصيل استخدام وحدة المعالجة المركزية من خلال قاعدة البيانات?

انا المثالية التي تبحث إدارة المهام من نوع واجهة ل SQL server, ولكن بدلا من النظر في استخدام وحدة المعالجة المركزية من كل PID (مثل taskmgr) أو كل SPID (مثل spwho2k5) ، أريد أن عرض إجمالي استخدام وحدة المعالجة المركزية لكل قاعدة بيانات.نفترض واحد مثيل SQL.

وأنا أدرك أن الأدوات يمكن أن تكون مكتوبة في جمع هذه البيانات وتقديم تقرير عن ذلك, ولكن أنا أتساءل عما إذا كان هناك أي أداة تسمح لي أن نرى عرض لايف من قواعد البيانات التي تساهم أكثر من غيرها في sqlservr.exe تحميل وحدة المعالجة المركزية.

هل كانت مفيدة؟

المحلول

نوعا ما.تحقق من هذا الاستعلام من:

SELECT total_worker_time/execution_count AS AvgCPU  
, total_worker_time AS TotalCPU
, total_elapsed_time/execution_count AS AvgDuration  
, total_elapsed_time AS TotalDuration  
, (total_logical_reads+total_physical_reads)/execution_count AS AvgReads 
, (total_logical_reads+total_physical_reads) AS TotalReads
, execution_count   
, SUBSTRING(st.TEXT, (qs.statement_start_offset/2)+1  
, ((CASE qs.statement_end_offset  WHEN -1 THEN datalength(st.TEXT)  
ELSE qs.statement_end_offset  
END - qs.statement_start_offset)/2) + 1) AS txt  
, query_plan
FROM sys.dm_exec_query_stats AS qs  
cross apply sys.dm_exec_sql_text(qs.sql_handle) AS st  
cross apply sys.dm_exec_query_plan (qs.plan_handle) AS qp 
ORDER BY 1 DESC

هذا سوف تحصل على الاستفسارات في خطة ذاكرة التخزين المؤقت في كم وحدة المعالجة المركزية لقد استخدمت.يمكنك تشغيل هذه بشكل دوري مثل SQL Agent وظيفة إدراج النتائج في الجدول للتأكد من البيانات التي استمرت إلى ما بعد إعادة تمهيد.

عند قراءة النتائج ، سوف ربما ندرك لماذا لا يمكننا ربط تلك البيانات مباشرة إلى قاعدة بيانات فردية.أولا استعلام واحد يمكن أيضا إخفاء الحقيقية بيانات الأم عن طريق القيام الحيل مثل هذا:

USE msdb
DECLARE @StringToExecute VARCHAR(1000)
SET @StringToExecute = 'SELECT * FROM AdventureWorks.dbo.ErrorLog'
EXEC @StringToExecute

الاستعلام سيتم إعدامه في MSDB ، ولكن سيكون نتائج الاستطلاع من AdventureWorks.حيث يجب علينا تعيين وحدة المعالجة المركزية الاستهلاك ؟

فإنه يحصل أسوأ من ذلك عندما:

  • الانضمام بين قواعد بيانات متعددة
  • تشغيل المعاملات في قواعد بيانات متعددة و قفل جهد يمتد قواعد بيانات متعددة
  • تشغيل عميل SQL وظائف في MSDB أن "العمل" في MSDB ، ولكن احتياطية من قواعد البيانات الفردية

فإنه يذهب على وعلى.هذا هو السبب في أنه من المنطقي أن ضبط الأداء على مستوى الاستعلام بدلا من مستوى قاعدة البيانات.

في SQL Server 2008R2, مايكروسوفت قدمت إدارة الأداء و إدارة التطبيق الميزات التي من شأنها أن تسمح لنا حزمة قاعدة بيانات واحدة في للتوزيع و الانتشار DAC حزمة وهم واعدة الميزات لجعله أسهل لإدارة الأداء الفردي قواعد البيانات وتطبيقاتها.فإنه لا يزال لا تفعل ما كنت تبحث عن ، على الرغم من.

أكثر من أولئك الذين, تحقق من T-SQL مستودع في الضفدع العالم SQL Server ويكي (سابقا في SQLServerPedia).

تحديث يوم 1/29 لتشمل مجموع أرقام بدلا من مجرد المتوسطات.

نصائح أخرى

SQL Server (بدءا من عام 2000) سيتم تثبيت عدادات الأداء (للعرض من مراقبة الأداء أو الأداء).

واحدة من فئات العداد (من SQL Server 2005 تثبيت:) - SQLServer:قواعد البيانات

مع حالة واحدة لكل قاعدة بيانات.العدادات متوفرة ومع ذلك لا توفر وحدة المعالجة المركزية % استخدام العداد أو شيئا من هذا القبيل ، على الرغم من أن هناك بعض أسعار العدادات التي يمكن استخدامها للحصول على تقدير جيد من وحدة المعالجة المركزية.على سبيل المثال, إذا كان لديك 2 قواعد البيانات ، و معدل قياس 20 المعاملات/ثانية على قاعدة البيانات و 80 trans/sec على قاعدة البيانات ب --- ثم أنت تعرف أن يساهم تقريبا إلى 20% من إجمالي وحدة المعالجة المركزية ، و ب يساهم في 80% الأخرى.

هناك بعض العيوب هنا ، هذا على افتراض كل العمل الذي تقوم به هو وحدة المعالجة المركزية ملزمة ، والتي بالطبع مع قواعد البيانات ليس.ولكن ذلك سيكون بداية أعتقد.

وهنا الاستعلام التي سوف تظهر قاعدة البيانات الفعلية مما تسبب في تحميل عالية.وهي تعتمد على ذاكرة التخزين المؤقت الاستعلام التي قد تحصل مسح كثيرا في انخفاض الذاكرة سيناريوهات (صنع الاستعلام أقل فائدة).

select dbs.name, cacheobjtype, total_cpu_time, total_execution_count from
    (select top 10
        sum(qs.total_worker_time) as total_cpu_time,  
        sum(qs.execution_count) as total_execution_count, 
        count(*) as  number_of_statements,  
        qs.plan_handle
    from  
        sys.dm_exec_query_stats qs 
    group by qs.plan_handle
    order by sum(qs.total_worker_time) desc
    ) a
inner join 
(SELECT plan_handle, pvt.dbid, cacheobjtype
FROM (
    SELECT plan_handle, epa.attribute, epa.value, cacheobjtype
    FROM sys.dm_exec_cached_plans 
        OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
     /* WHERE cacheobjtype = 'Compiled Plan' AND objtype = 'adhoc' */) AS ecpa 
PIVOT (MAX(ecpa.value) FOR ecpa.attribute IN ("dbid", "sql_handle")) AS pvt
) b on a.plan_handle = b.plan_handle
inner join sys.databases dbs on dbid = dbs.database_id

أعتقد أن الجواب على سؤالك هو لا.

القضية هي أن نشاط واحد على آلة يمكن أن يسبب الحمل على قواعد بيانات متعددة.إذا كان لدي عملية القراءة من ملف config DB, تسجيل الدخول DB, وتتحرك المعاملات في مختلف DBs على أساس النوع ، كيف يمكنني تقسيم وحدة المعالجة المركزية الاستخدام ؟

يمكن تقسيم وحدة المعالجة المركزية عن طريق المعاملة الحمل, ولكن هذا هو مرة أخرى الخام القياس الذي قد يضلل.كيف يمكنك أن تفرق الصفقة سجل الشحن من DB إلى آخر, على سبيل المثال ؟ يتم تحميل وحدة المعالجة المركزية في القراءة أو الكتابة ؟

كنت أفضل حالا النظر في الصفقة سعر الجهاز و تحميل وحدة المعالجة المركزية التي يتسبب بها.هل يمكن أيضا تعريف الإجراءات المخزنة ومعرفة ما إذا كان أي منهم أخذ قدرا هائلا من الوقت ؛ ومع ذلك ، فإن هذا لن تحصل على الإجابة التي تريدها.

مع كل ما ذكر أعلاه في الاعتبار.
بدءا من SQL Server 2012 (قد يكون عام 2008؟) هناك عمود database_id في sys.dm_exec_sessions.
هذا يعطينا من السهل حساب وحدة المعالجة المركزية لكل قاعدة بيانات المتصلين حاليا الدورات.إذا كانت الدورة قد قطع ، ثم النتائج قد ذهب.

select session_id, cpu_time, program_name, login_name, database_id 
  from sys.dm_exec_sessions 
 where session_id > 50;

select sum(cpu_time)/1000 as cpu_seconds, database_id 
 from sys.dm_exec_sessions 
group by database_id
order by cpu_seconds desc;

نلقي نظرة على SQL خفير.يفعل كل ما تحتاجه وأكثر من ذلك.

التحيات ، يفن

هل نظرت في منشئ ملفات التعريف SQL?

اتخاذ معيار "T-SQL" أو "إجراء مخزن" قالب قرص الحقول إلى مجموعة من معرف قاعدة البيانات (أعتقد أنك يجب أن تستخدم عدد أنك لا تحصل على اسم قاعدة البيانات, ولكن من السهل أن تجد باستخدام exec sp_databases للحصول على القائمة)

تشغيل هذا لفترة من الوقت وسوف تحصل على مجموع وحدة المعالجة المركزية التهم / القرص IO / الانتظار.... الخهذا يمكن أن تعطيك نسبة من وحدة المعالجة المركزية المستخدمة من قبل كل البيانات الخاصة بنا.

إذا كنت مراقبة الأداء مضادة في نفس الوقت (سجل البيانات إلى قاعدة بيانات SQL) و تفعل الشيء نفسه بالنسبة منشئ ملفات التعريف SQL (سجل إلى قاعدة البيانات) ، قد تكون قادرة على ربط الاثنين معا.

ومع ذلك ، ينبغي أن تعطيك ما يكفي من دليل على الذي DB هو يستحق النظر في مزيد من التفاصيل.ثم تفعل الشيء نفسه مرة أخرى مع أنه معرف قاعدة البيانات والبحث عن أغلى SQL / الإجراءات المخزنة.

يرجى التحقق من هذا الاستعلام:

SELECT 
    DB_NAME(st.dbid) AS DatabaseName
    ,OBJECT_SCHEMA_NAME(st.objectid,dbid) AS SchemaName
    ,cp.objtype AS ObjectType
    ,OBJECT_NAME(st.objectid,dbid) AS Objects
    ,MAX(cp.usecounts)AS Total_Execution_count
    ,SUM(qs.total_worker_time) AS Total_CPU_Time
    ,SUM(qs.total_worker_time) / (max(cp.usecounts) * 1.0) AS Avg_CPU_Time 
FROM sys.dm_exec_cached_plans cp 
INNER JOIN sys.dm_exec_query_stats qs 
    ON cp.plan_handle = qs.plan_handle
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
WHERE DB_NAME(st.dbid) IS NOT NULL
GROUP BY DB_NAME(st.dbid),OBJECT_SCHEMA_NAME(objectid,st.dbid),cp.objtype,OBJECT_NAME(objectid,st.dbid) 
ORDER BY sum(qs.total_worker_time) desc
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top