PDA

View Full Version : سوال: مشکل با سرعت بسیار کند اجرای کوئری



rk1983xx
پنج شنبه 02 اردیبهشت 1389, 01:12 صبح
سلام به همه دوستان
من یه کوئری دارم که باید داخل یک جدول نمایندگی هایی رو که از یه حدی بیشتر رکورد دارند رو از چند تا فیلداشون معدل بگیرم
و بعد چنتا فیلد از مشخصات نمایندگی رو هم بهش میچسبونه و خروجی میده


select
((avg(Rawdata.Q1 )-1)*250) as Q1, ((avg(Rawdata.Q2 )-1)*250) as Q2,
((avg(Rawdata.Q3 )-1)*250) as Q3, ((avg(Rawdata.Q4 )-1)*250) as Q4,
((avg(Rawdata.Q5 )-1)*250) as Q5, ((avg(Rawdata.Q6 )-1)*250) as Q6,
((avg(Rawdata.Q7 )-1)*250) as Q7, ((avg(Rawdata.Q8 )-1)*250) as Q8,
((avg(Rawdata.Q9 )-1)*250) as Q9, ((avg(Rawdata.Q10 )-1)*250) as Q10,
((avg(Rawdata.Q11 )-1)*250) as Q11, ((avg(Rawdata.Q12 )-1)*250) as Q12,
((avg(Rawdata.Q13 )-1)*250) as Q13, ((avg(Rawdata.Q18 )-1)*250) as Q18,
Count(*) as cntr,rawdata.Bcode2,
Companies.BCode, Companies.BranchName, Companies.Ostan, Companies.city, Companies.GTP
from rawdata , Companies
where rawdata.Bcode2 in (select Bcode2 from Rawdata Group by BCode2 Having Count(*)<10)
GROUP BY Rawdata.BCode2, Companies.BCode, Companies.BranchName, Companies.Ostan, Companies.city, Companies.GTP

مشکل اصلی افت سرعت و حتی هنگ در قسمتی هست که کد نمایندگی رو توی جدولی که از شمارش رکورد ها جستجومی کنه اتفاق میافته که نمیدونم چجوری حلش کنم ؟


where rawdata.Bcode2 in (select Bcode2 from Rawdata Group by BCode2 Having Count(*)<10)

آیا با Inner Join میشه چیزی ساخت که جایگزین این بشه ؟

rk1983xx
پنج شنبه 02 اردیبهشت 1389, 01:44 صبح
شاید بگید خیلی پیچیدش کردم
ولی اون خطی که گفتم سرعت رو پایین میاره حذف کردم و کد رو به شکل زیر تغییر دادم ولی بازم همون مشکل سرعت:

/* ALIAS: rasool */
select
((avg(Rawdata.Q1 )-1)*250) as Q1, ((avg(Rawdata.Q2 )-1)*250) as Q2,
((avg(Rawdata.Q3 )-1)*250) as Q3, ((avg(Rawdata.Q4 )-1)*250) as Q4,
((avg(Rawdata.Q5 )-1)*250) as Q5, ((avg(Rawdata.Q6 )-1)*250) as Q6,
((avg(Rawdata.Q7 )-1)*250) as Q7, ((avg(Rawdata.Q8 )-1)*250) as Q8,
((avg(Rawdata.Q9 )-1)*250) as Q9, ((avg(Rawdata.Q10 )-1)*250) as Q10,
((avg(Rawdata.Q11 )-1)*250) as Q11, ((avg(Rawdata.Q12 )-1)*250) as Q12,
((avg(Rawdata.Q13 )-1)*250) as Q13, ((avg(Rawdata.Q18 )-1)*250) as Q18,
Count(*) as cntr,rawdata.Bcode2,
Companies.BCode, Companies.BranchName, Companies.Ostan, Companies.city, Companies.GTP
from rawdata , Companies
GROUP BY Rawdata.BCode2, Companies.BCode, Companies.BranchName, Companies.Ostan, Companies.city, Companies.GTP
Having Count(*)<10

محمد سلیم آبادی
پنج شنبه 02 اردیبهشت 1389, 13:00 عصر
اگر این سوال مربوط میشه به Microsoft SQL Server می تونید آن را در تالار SQL Server مطرح کنید تا دوستان مدیر کمک و راهنمایی کنند.

rk1983xx
جمعه 03 اردیبهشت 1389, 12:29 عصر
متأسفانه برای چندمین بار سؤال من بدون جواب موند
البته در مورد برخی دوستان دیگه هم اتفاق افتاده ولی فکر میکنم بد هم نباشه چون باز هم سبب شد خودم بیشتر روش کار کنم و مشکلم رو حل کنم
در مورد شما که میگید توی بخش خودش مطرح کنم باید بگم من مطرح کردم کوئری و چندان ربطی نداره که دیتابیس من از چه نوعی هست چون کوئری هست سوال کلیت داره و ساختار کوئری من مورد بحث بود نه پایگاه داده
به هر حال خودم حلش کردم
کدش رو میذارم برای کسانی که ممکنه همین مشکل رو داشته باشن


select
((avg(Rawdata.Q1 )-1)*250) as Q1, ((avg(Rawdata.Q2 )-1)*250) as Q2,
((avg(Rawdata.Q3 )-1)*250) as Q3, ((avg(Rawdata.Q4 )-1)*250) as Q4,
((avg(Rawdata.Q5 )-1)*250) as Q5, ((avg(Rawdata.Q6 )-1)*250) as Q6,
((avg(Rawdata.Q7 )-1)*250) as Q7, ((avg(Rawdata.Q8 )-1)*250) as Q8,
((avg(Rawdata.Q9 )-1)*250) as Q9, ((avg(Rawdata.Q10 )-1)*250) as Q10,
((avg(Rawdata.Q11 )-1)*250) as Q11, ((avg(Rawdata.Q12 )-1)*250) as Q12,
((avg(Rawdata.Q13 )-1)*250) as Q13, ((avg(Rawdata.Q18 )-1)*250) as Q18,
Count(*) AS cntr, rawdata.Bcode2,
Companies.BCode, Companies.BranchName,Companies.city, Companies.GTP,Companies.RKOLD,Rawdata.Ostan
FROM rawdata INNER JOIN companies ON Rawdata.Bcode2=Companies.Bcode2
GROUP BY Rawdata.BCode2, Companies.BCode, Companies.BranchName,Companies.city, Companies.GTP,Companies.RKOLD,Rawdata.Ostan
HAVING Count(*)>10;

در حقیقت من بجای استفاده از Inner Join خودم اون رو دستی پیاده سازی کرده بودم که با مشکل افت سرعت مواجه شده بودم
بعنوان تجربه عرض کنم اگر شما با بهترین روش هم دستورات SQL رو پیاده سازی کنید باز هم 1 دهم سرعت اجرای دستور معادلش توی DBM رو نخواهید داشت

afrooz_rahmati63@yahoo.com
جمعه 03 اردیبهشت 1389, 12:34 عصر
bale doste aziz ,shoma dar query aval aslan join nazadid va dar vaghe cross join kardid ke mosalame be shedat ofte sorat khahid dasht