টি-স্কেল কোয়েরি কার্যকর করতে যে সময় লাগে তা পরিমাপ করুন


156

স্কেল সার্ভার 2005 ব্যবহার করে আমার কাছে দুটি টি-এসকিএল কোয়েরি রয়েছে each প্রত্যেকটি চালাতে কত সময় লাগে তা আমি কীভাবে পরিমাপ করতে পারি?

আমার স্টপওয়াচ ব্যবহার করে এটি কাটবে না।


2
আপনি কি এসকিএল সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করছেন? এটি কেবলমাত্র দ্বিতীয় রেজোলিউশনের সাহায্যে প্রতিটি ক্যোয়ারির জন্য সময় অতিবাহিত করে। : এছাড়াও এই সংশ্লিষ্ট প্রশ্ন দেখতে পাবেন stackoverflow.com/questions/8247587/...
mellamokb

উত্তর:


174

ইভেন্টগুলির মধ্যে "অতিবাহিত সময়" পরিমাপের একটি সরল পদ্ধতি হল কেবলমাত্র বর্তমান তারিখ এবং সময় গ্রহণ করা।

এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে

SELECT GETDATE();
SELECT /* query one */ 1 ;
SELECT GETDATE();
SELECT /* query two */ 2 ; 
SELECT GETDATE(); 

অতিবাহিত সময় গণনা করতে, আপনি সেই তারিখের মানগুলি ভেরিয়েবলগুলিতে গ্রাস করতে এবং DATEDIFF ফাংশনটি ব্যবহার করতে পারেন:

DECLARE @t1 DATETIME;
DECLARE @t2 DATETIME;

SET @t1 = GETDATE();
SELECT /* query one */ 1 ;
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;

SET @t1 = GETDATE();
SELECT /* query two */ 2 ;
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;

এটি কেবল একটি পদ্ধতির। আপনি এসকিউএল প্রোফাইলার ব্যবহার করে প্রশ্নের জন্য সময় অতিবাহিত করতে পারেন।


আমি কীভাবে এটি করতে পারি সে সম্পর্কে স্কিএল প্রোফাইলার ডকটির সন্ধান করেছি কিন্তু এমন ডক খুঁজে পেল না যা পড়ার কয়েক ঘন্টা প্রয়োজন হয় না। আপনি কি "ডামিদের জন্য প্রোফাইলার" লিঙ্কটির প্রস্তাব দিতে পারেন?
TheMoot

@ এই মোটা আমি জানি আমি দেরি করেছি তবে এমএসডিএন লিঙ্কগুলি আপনার "[বিষয়] ডামিগুলির জন্য" প্রয়োজনীয়তার জন্য নিখুঁত :)। কীভাবে করবেন তা
জন ওডম

স্কেল ম্যানেজমেন্ট স্টুডিওতে এটি ব্যবহারে অন্য কারও কি সমস্যা ছিল? আমি এটি পরীক্ষার জন্য একটি সঞ্চিত পদ্ধতিতে প্রায় 15 টি প্রশ্নের সেটে যুক্ত করেছি এবং এটি চালাতে বেশ দীর্ঘ সময় নেয়। আমি 7 মিনিটে বাতিল করে দিয়েছি এবং সমস্ত টাইমার যুক্ত হয়েছিল মাত্র 2 মিনিট। সুতরাং আমি মনে করি এখানে কিছু রিটার্ন পাঠ্য ক্যাশে সমস্যা রয়েছে বা সম্ভবত এতগুলিগুলির জন্য সমস্ত তারিখগুলি গণনা করতে খুব বেশি সময় লাগে।
এমএইচ

2
@ হ্যানোকস: GETDATE () মূল্যায়ন করার জন্য অল্প পরিমাণ সময় ব্যবহৃত হয় এবং ফলটি একটি ভেরিয়েবলের জন্য নির্ধারণ করে এবং ডেটেডিএফ () মূল্যায়নের জন্য অল্প পরিমাণ সময় দেয় এবং ফলাফলটি ফেরত দেয়। আমি প্রস্তাবিত সরলতর দৃষ্টিভঙ্গি ছিল সিঙ্গলটন অনুসন্ধানগুলির জন্য মোটামুটি পরিমাপ। আমি এই পদ্ধতির কোনও স্টোরড পদ্ধতিতে টাইট লুপের মধ্যে ব্যবহার করার পরামর্শ দেব না। যদি আমার কাছে কোনও সঞ্চিত পদ্ধতিতে ক্যারিয়ারগুলির একটি সিরিজ থাকে তবে আমি এই পদ্ধতিটি কিছু বিচার্য পয়েন্টগুলিতে কিছু ডিবাগিং আউটপুট যুক্ত করতে ব্যবহার করতে পারি, একটি বৈষম্যমূলক কলাম যুক্ত করতে পারি যাতে আমি জানতে পারি যে ফলাফলটি কোন পদ্ধতিতে নির্গত হয়।
spencer7593

1
আমি সাধারণত SET @t1 = GETDATE();আমার ক্যোয়ারির শীর্ষে থাকি এবং তারপরে SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();কোয়েরির মধ্যে বিচার্য পয়েন্টগুলিতে আটকান ("নোট 1" যথাযথভাবে সম্পাদনা করে)। পরিমাপের পরিবর্তে বাছাইকারীদের ব্রেকপয়েন্ট হিসাবে বিবেচনা করা আপনার পদ্ধতির কাছে শব্দার্থগতভাবে অভিন্ন (যদিও @ টি 1 এর চূড়ান্ত সেটটি উদ্দীপক, এবং এটি ধরে নিয়েছে যে সমস্ত প্রশ্নের পরিমাপ করা উচিত)। এটি নিখুঁতভাবে একটি মানসিক / টাইপিং অপটিমাইজেশন (ক্যোরির প্রতি দুটি পেস্টের চেয়ে ব্রেকপয়েন্টে একটি পেস্ট)।
ব্রায়ান

251

আপনি যদি উপরের উত্তরের চেয়ে আরও সঠিক পরিমাপ চান:

set statistics time on 

-- Query 1 goes here

-- Query 2 goes here

set statistics time off

ফলাফল বার্তা উইন্ডোতে হবে।

আপডেট (2015-07-29):

জনপ্রিয় অনুরোধে, আমি একটি কোড স্নিপেট লিখেছি যা আপনি সময়কালের জন্য পুরো স্টোরেজ প্রক্রিয়াটি চালানোর পরিবর্তে এর উপাদানগুলির পরিবর্তে ব্যবহার করতে পারেন। যদিও এটি কেবল সর্বশেষ রান দ্বারা গৃহীত সময়কে ফেরত দেয়, এর দ্বারা অতিরিক্ত পরিসংখ্যানগুলি ফিরে আসে sys.dm_exec_procedure_statsএটিও মূল্যবান হতে পারে:

-- Use the last_elapsed_time from sys.dm_exec_procedure_stats
-- to time an entire stored procedure.

-- Set the following variables to the name of the stored proc
-- for which which you would like run duration info
DECLARE @DbName NVARCHAR(128);
DECLARE @SchemaName SYSNAME;
DECLARE @ProcName SYSNAME=N'TestProc';

SELECT CONVERT(TIME(3),DATEADD(ms,ROUND(last_elapsed_time/1000.0,0),0)) 
       AS LastExecutionTime
FROM sys.dm_exec_procedure_stats
WHERE OBJECT_NAME(object_id,database_id)=@ProcName AND
      (OBJECT_SCHEMA_NAME(object_id,database_id)=@SchemaName OR @SchemaName IS NULL) AND
      (DB_NAME(database_id)=@DbName OR @DbName IS NULL)

2
কেবলমাত্র একটি নোট যে আপনার ডাটাবেসে অ্যাক্সেস কেবল পঠনযোগ্য হলে এই ফাংশনটি উপলব্ধ নেই। To use SET STATISTICS TIME, users must have the appropriate permissions to execute the Transact-SQL statement. The SHOWPLAN permission is not required. থেকে: টেকনিকট.মাইক্রোসফট /en-us/library/ms190287.aspx
রব

5
এমন কোনও উপায় আছে যেখানে আমি পুরো সময়টি দেখতে পারি যে কোনও সঞ্চিত প্রক্রিয়াটি সম্পাদন করা প্রয়োজন? এই মুহুর্তে আমি প্রচুর একক পরিমাপ দেখতে পাচ্ছি।
রুকিয়ান

2
@ রুকিয়ান, এর সাথে আপনাকে সহায়তা করার জন্য আমি উত্তরে কিছু কোড যুক্ত করেছি।
মাইকেল গোল্ডস্টেইন 4'15

17
DECLARE @StartTime datetime
DECLARE @EndTime datetime
SELECT @StartTime=GETDATE() 

 -- Write Your Query


SELECT @EndTime=GETDATE()

--This will return execution time of your query
SELECT DATEDIFF(MS,@StartTime,@EndTime) AS [Duration in millisecs]

আপনি এই সমাধানটি দেখতে পারেন


9
এটি ন্যানোসেকেন্ডগুলিতে সময় দেয়। মিলিসেকেন্ডগুলি DATEDIFF (এমএস, @ স্টার্টটাইম, @ এন্ডটাইম) হবে
d512

11

আর একটি উপায় হল একটি এসকিউএল সার্ভার অন্তর্নির্মিত বৈশিষ্ট্যটি ব্যবহার করা Client Statisticsযা মেনু> ক্যোয়ারী> ক্লায়েন্টের পরিসংখ্যান অন্তর্ভুক্তের মাধ্যমে অ্যাক্সেসযোগ্য ।

আপনি পৃথক ক্যোয়ারী উইন্ডোতে প্রতিটি ক্যোয়ারী চালাতে পারেন এবং ফলাফলগুলির সাথে তুলনা করতে পারেন যা Client Statisticsট্যাবটির ঠিক পাশে রয়েছে Messages

উদাহরণস্বরূপ নীচের চিত্রটিতে এটি দেখায় যে আমার প্রশ্নের একটির জন্য সার্ভারের উত্তর পেতে গড় সময় ব্যয় হয়েছে 39 মিলিসেকেন্ড।

ফলাফল

এখানে কার্যকরকরণের সময় অর্জনের জন্য আপনি সমস্ত 3 টি উপায় পড়তে পারেন । এমনকি Estimated Execution Plan ctrlLআপনার কোয়েরি সম্পর্কে আরও তদন্তের জন্য আপনাকে প্রদর্শনের প্রয়োজন হতে পারে ।


7

আরও ভাল, এটি আপনার ক্যোয়ারির n পুনরাবৃত্তির গড় পরিমাপ করবে! আরও নির্ভুল পাঠের জন্য দুর্দান্ত।

declare @tTOTAL int = 0
declare @i integer = 0
declare @itrs integer = 100

while @i < @itrs
begin
declare @t0 datetime = GETDATE()

--your query here

declare @t1 datetime = GETDATE()

set @tTotal = @tTotal + DATEDIFF(MICROSECOND,@t0,@t1)

set @i = @i + 1
end

select @tTotal/@itrs

4
আমি পরিবর্তন MICROSECONDকরতে MILLISECONDএবং ক্যাশে সব আমি মধ্যে লাইন নিম্নলিখিত সন্নিবেশিত পরিষ্কার beginএবং declare @t0 ...: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;। মোহন এর মতো কাজ করে এবং ঠিক আমি যা খুঁজছিলাম was +1
ড্যানিয়েল জেড।

1
আমি একটি সঞ্চিত পদ্ধতিতে বর্ধনশীল পারফরম্যান্সের টুইটগুলি পরীক্ষা করতে yr স্নিপেট ব্যবহার করছি, খুব চটজল!
জয় 14

দুজন কেই ধন্যবাদ. আমি দীর্ঘকাল ধরে স্কয়ার করছি, এটি একটি উদ্বেগপূর্ণ ভাষা। তবে একবার আপনি যখন জানবেন যে কীঙ্কস কী এবং কীভাবে সেগুলি আপনার সুবিধার জন্য স্পিন করতে পারে, ভাল এটি
এক্সডকে

3

সময়গুলি পেতে এবং আপনার ক্যোয়ারীটি কতটা দক্ষ তা জানতে প্রদর্শন করার জন্য পরিসংখ্যান আইকনে ক্লিক করুন এবং তারপরে কোয়েরিটি চালান

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.