আমি @ থমাসের মতো, "প্রতি ডেটাবেসস সিপিইউ ব্যবহার" যে কোনওটি সঠিক বা কার্যকর হওয়ায় উদ্বেগ সম্পর্কিত প্রশ্নে মন্তব্যে @ অ্যারনের সাথে সম্পূর্ণরূপে একমত হয়েছি, তবে আমি অন্তত এই প্রশ্নের দুটি কারণ কেন এমন প্রশ্নের উত্তর দিতে পারি? আলাদা। এবং কেন এগুলি পৃথক হওয়ার কারণটি ইঙ্গিত দেবে যে কোনটি আরও সঠিক, যদিও উচ্চতর স্তরের নির্ভুলতা এখনও বিশেষভাবে ভুলের সাথে তুলনামূলক, সুতরাং এখনও সত্যই সঠিক নয় ;-)।
প্রথম ক্যোয়ারী সিপিইউ তথ্য (যেমন ) পেতে sys.dm_exec_query_stats ব্যবহার করে total_worker_time
। যদি আপনি সেই ডিএমভির জন্য এমএসডিএন ডকুমেন্টেশনযুক্ত লিঙ্কযুক্ত পৃষ্ঠায় যান তবে আপনি একটি সংক্ষিপ্ত, 3 টি বাক্য প্রবর্তন এবং সেই বাক্যগুলির মধ্যে 2 টি এই তথ্যের প্রসঙ্গে বুঝতে আমাদের যা প্রয়োজন তা আমাদের বেশিরভাগই দেন ("এটি কতটা নির্ভরযোগ্য" এবং "এটি এর সাথে কীভাবে তুলনা করে sys.sysprocesses
")। এই দুটি বাক্য হ'ল:
এসকিউএল সার্ভারে ক্যাশেড ক্যোয়ারী পরিকল্পনার সামগ্রিক পারফরম্যান্সের পরিসংখ্যানগুলি প্রদান করে। ... যখন পরিকল্পনাটি ক্যাশে থেকে সরানো হয়, তখন এই দর্শন থেকে সংশ্লিষ্ট সারিগুলি সরানো হবে
প্রথম বাক্য, " সমষ্টিগত পারফরম্যান্সের পরিসংখ্যানগুলি দেখায়", আমাদের জানায় যে এই ডিএমভিতে থাকা তথ্যগুলি (অন্য বেশিরভাগের মতো) সংশ্লেষজনক এবং বর্তমানে চলমান অনুসন্ধানগুলির জন্য নির্দিষ্ট নয়। এটি সেই ডিএমভিতে এমন একটি ক্ষেত্র দ্বারাও ইঙ্গিত করা হয়েছে যা প্রশ্নের ক্যোয়ারির অংশ নয় execution_count
, যা আবার দেখায় যে এটি संचयी ডেটা। এবং এই হিসাবে ডেটা ক্রমবর্ধমান হওয়া খুব সহজ যেহেতু আপনি গড় ইত্যাদি অর্জন করতে পারেন কারণ দ্বারা কিছু মেট্রিককে ভাগ করে execution_count
।
দ্বিতীয় বাক্য, "ক্যাশে থেকে অপসারণের পরিকল্পনাগুলিও এই ডিএমভি থেকে সরানো হয়েছে", নির্দেশ করে যে এটি মোটেও সম্পূর্ণ চিত্র নয়, বিশেষত যদি সার্ভারটির ইতিমধ্যে পুরোপুরি পুরো পরিকল্পনা ক্যাশে রয়েছে এবং লোডের মধ্যে রয়েছে এবং তাই পরিকল্পনার মেয়াদ শেষ হচ্ছে কিছুটা ঘন ঘন এছাড়াও, সার্ভারের পুনরায় সেট করার পরে বেশিরভাগ ডিএমভিগুলি পুনরায় সেট করা হয় যাতে পরিকল্পনার মেয়াদ শেষ হওয়ার পরেও এই সারিগুলি সরানো হয়নি এমনকী তারা সত্য ইতিহাস নয়।
এখন উপরের সাথে বিপরীতে করা যাক sys.sysprocesses
। এই সিস্টেমের ভিউতে কেবল বর্তমানে কী চলছে তা দেখানো হচ্ছে ঠিক একইভাবে sys.dm_exec_connitions , sys.dm_exec_sessions এবং sys.dm_exec_requests (যা সংযুক্ত পৃষ্ঠায় বর্ণিত হয়েছে sys.dm_exec_sessions
) এর সংমিশ্রণের মতো । sys.dm_exec_query_stats
প্রক্রিয়া শেষ হওয়ার পরেও এটি ডিএমভির তুলনায় সার্ভারের সম্পূর্ণ ভিন্ন দৃষ্টিভঙ্গি যা ডেটা ধরে রাখে। অর্থ, সম্পর্কিত "দ্বিতীয় ক্যোয়ারী থেকে ফলাফল ভুল আছে?" প্রশ্ন, এগুলি ভুল নয়, তারা কেবল পারফরম্যান্সের পরিসংখ্যানের একটি ভিন্ন দিক (যেমন সময়সীমা) এর সাথে সম্পর্কিত।
সুতরাং, কোয়েরিটি sys.sysprocesses
কেবল "এখনই" দেখছে at এবং ব্যবহার sys.dm_exec_query_stats
করা ক্যোয়ারীটি বেশিরভাগ (সম্ভবত) এসকিউএল সার্ভার পরিষেবাদির শেষ পুনর্সূচনা (বা সম্ভবত সিস্টেম রিবুট) পরে যা ঘটেছে তা দেখছে । সাধারণ পারফরম্যান্স বিশ্লেষণের জন্য মনে হয় এটি sys.dm_exec_query_stats
অনেক ভাল, তবে আবার এটি দরকারী তথ্য সর্বদা ফেলে দেয়। এবং উভয় ক্ষেত্রেই আপনাকে প্রথম স্থানটিতে "ডাটাবেস_আইডি" মানটির যথার্থতা সম্পর্কে প্রশ্ন মন্তব্যে (আরম্ভ করা হয়েছে) @ অ্যারোন দ্বারা তৈরি পয়েন্টগুলিও বিবেচনা করা উচিত (অর্থাত্ এটি কোডটি শুরু করা সক্রিয় ডিবি প্রতিফলিত করে) , "ইস্যু" যে ঘটছে তা অগত্যা নয়)।
কিন্তু, যদি আপনি শুধু প্রয়োজন / এই মুহূর্তে সব ডেটাবেস জুড়ে ঘটছে একটা ধারনা পেতে চান, সম্ভবত কারণ কিছু গতি কমে এখন ডান, আপনি সমন্বয় ব্যবহার করে লাভও নেই sys.dm_exec_connections
, sys.dm_exec_sessions
এবং sys.dm_exec_requests
(এবং অবচিত sys.sysprocesses
)। শুধু মনে রাখবেন যে আপনার জন্য / এ খুঁজছেন প্রশ্নের , না ডাটাবেস এক বা একাধিক ডেটাবেস ইত্যাদি থেকে, কারণ প্রশ্নের একাধিক ডাটাবেস জুড়ে যোগ দিতে পারেন, UDFs অন্তর্ভুক্ত
সম্পাদনা:
সামগ্রিক উদ্বেগ যদি উচ্চ সিপিইউ গ্রাহককে হ্রাস করে, তবে সর্বাধিক সিপিইউ নিচ্ছে এমন অনুসন্ধানগুলি অনুসন্ধান করুন, কারণ ডাটাবেসগুলি আসলে সিপিইউ নেয় না (প্রতিটি ডাটাবেস বিচ্ছিন্ন যেখানে ডাটাবেসগুলি অনুসন্ধান করা কোনও হোস্টিং সংস্থায় কাজ করতে পারে) অন্য কোনও গ্রাহকের মালিকানাধীন)।
নিম্নলিখিত ক্যোয়ারী উচ্চ গড় সিপিইউ ব্যবহারের সাথে অনুসন্ধানগুলি সনাক্ত করতে সহায়তা করবে। এটি ক্যোরি_স্ট্যাটস ডিএমভি-তে ডেটাটি কনডেন্স করে যেহেতু সেই রেকর্ডগুলি একই ক্যোয়ারী (হ্যাঁ, ক্যোয়ারী ব্যাচের একই উপসেট) একাধিকবার প্রদর্শন করতে পারে, প্রতিটি পৃথক প্রয়োগের পরিকল্পনা সহ with
;WITH cte AS
(
SELECT stat.[sql_handle],
stat.statement_start_offset,
stat.statement_end_offset,
COUNT(*) AS [NumExecutionPlans],
SUM(stat.execution_count) AS [TotalExecutions],
((SUM(stat.total_logical_reads) * 1.0) / SUM(stat.execution_count)) AS [AvgLogicalReads],
((SUM(stat.total_worker_time) * 1.0) / SUM(stat.execution_count)) AS [AvgCPU]
FROM sys.dm_exec_query_stats stat
GROUP BY stat.[sql_handle], stat.statement_start_offset, stat.statement_end_offset
)
SELECT CONVERT(DECIMAL(15, 5), cte.AvgCPU) AS [AvgCPU],
CONVERT(DECIMAL(15, 5), cte.AvgLogicalReads) AS [AvgLogicalReads],
cte.NumExecutionPlans,
cte.TotalExecutions,
DB_NAME(txt.[dbid]) AS [DatabaseName],
OBJECT_NAME(txt.objectid, txt.[dbid]) AS [ObjectName],
SUBSTRING(txt.[text], (cte.statement_start_offset / 2) + 1,
(
(CASE cte.statement_end_offset
WHEN -1 THEN DATALENGTH(txt.[text])
ELSE cte.statement_end_offset
END - cte.statement_start_offset) / 2
) + 1
)
FROM cte
CROSS APPLY sys.dm_exec_sql_text(cte.[sql_handle]) txt
ORDER BY cte.AvgCPU DESC;
AvgCPU
মিলিসেকেন্ডে?