PDA

View Full Version : استعلام از وضعیت اجرای کوئری



mammadkoma
چهارشنبه 14 مهر 1389, 15:09 عصر
سلام به همه. من یک کوئری آپدیت دارم که 3 ، 4 دقیقه اجراش طول می کشه(به هر دلیلی) چون روی چند میلیون رکورد اعمال میشه. بحث سر اپتیمایز بودن کوئری ندارم. سوالم اینه: وقتی از برنامه ام با کد سی شارپ این کوئری رو اجرا می کنم می خوام هر سی ثانیه کوئری وضعیتش رو به برنامه ام اعلام کنه. مثلا بگه چند در صد اجرا شده یا روی چند رکورد اعمال شده؟
نحوه نمایش این رو هم می دونم که چه طور به کاربر نشون بدم. فقط می خوام توی این مدت اجرای کوئری هر 30 ثانیه از اجراش یه استعلام بگیرم؟

بهزادصادقی
چهارشنبه 14 مهر 1389, 15:29 عصر
من خودم راهی نمی دانم که این کار را بشه کرد.

تا آنجا که می دانم هر query در SQL Server فقط یک بار جواب خود را به فراخواننده خود باز می گرداند.

یک دستور update هیچ result ای بر نمیگرداند تا کارش تمام نشده.

آیا می توانید به جای اجرای یک update، سطرهای خود را از لحاظ منطقی به جند گروه تقسیم کرده و آنها را با اجرای چند update مختلف تغییر دهید، تا بتوانید بین update ها به کاربر پیام درصد پیشرفت کار را بدهید؟

بهنام بهمنی
چهارشنبه 14 مهر 1389, 15:31 عصر
مطمئن نيستم که اين کار شدنی باشه, اما به هر حال فکر می کنم لينکهاي زير مفيد باشن
http://msdn.microsoft.com/en-us/library/ms188754.aspx

http://msdn.microsoft.com/en-us/library/ms188068.aspx

esmit61
چهارشنبه 14 مهر 1389, 21:17 عصر
شما هر 30 ثانیه یکبار کوئری زیر رو اجرا کرده و مقدار فیلد row_count رو بخونید.
از تقسیم اون عدد به تعداد کل رکوردها (که با دستور count بدست میارید) درصد پیشرفت کار بدست میاد
SELECT * FROM sys.dm_exec_requests
البته حتما مقدار فیلدهای status و command رو هم چک کنید تا بفهمید کدوم سطر رو باید انتخاب کنید.

mammadkoma
شنبه 17 مهر 1389, 08:09 صبح
esmit61 (http://barnamenevis.org/forum/member.php?u=127061) ممنون. کاری که گفتید رو انجام دادم. این select وقتی که کوئری هنوز تمام نشده رکورد مربوط بهش رو نشون میده.
و status=Runnable و command=UPDATE. و cpu_time و total_elapsed_time و reads و writes و logical_reads و text_size را نشون میده.
ولی مقدار ستون row_count رو 1 نشون میده در حالی که کوئری در حال اجراست.
اینم کوئری تست من که 200000 رکورد رو حدودا 10-15 ثانیه آپدیت می کنه:
declare @index bigint
set @index=1
while (@index<200000)
begin
update t1 set number=@index+1
where id=@index
set @index=@index+1
end
مشکل row_count چیه که 1 میده؟ کوری ام هم در New Query تایپ کردم و اجرا میشه و رکوردش رو در حال اجرا در جدولی که شما معرفی کردین نشون میده. لطفا اگه مثالی دارید بزارید تا کاملشو ببینیم.
بازم ممنون از لطفتون.

mammadkoma
دوشنبه 19 مهر 1389, 16:16 عصر
راهی وجود نداره. مقاله ای خوندم که توش گفته فقط کارهایی مثل بک آپ و ری استور و اندکسینگ درصدشو نشون میده. به هر حال من یه وب سرویس نوشتم و با کد جاوا اسکریپت رانش کردم تا صفحه پست بک بخوره و برگرده و وب سرویس کار آپدیت طولانی رو انجام میده.