PDA

View Full Version : سوال: Stored Procedures و Index



MaryamMarz
چهارشنبه 28 مرداد 1388, 11:06 صبح
با سلام
من یک Query دارم که از 5 Left join تشکیل شده. روی تمام فیلد های شرکت کننده در join ها Index تعریف کرده ام.
وقتی این Query اجرا می شود مشکلی ندارد ولی در صورتی که با Stored Procedure اجرا شود 22 ثانیه زمان می برد.
کسی می داند مشکل کجاست ؟
با تشکر

AminSobati
چهارشنبه 28 مرداد 1388, 11:09 صبح
سلام دوست عزیز،
SP رو یکبار ALTER و دوباره آزمایش کنید. نتیجه رو پست بفرمایید

MaryamMarz
چهارشنبه 28 مرداد 1388, 11:23 صبح
با تشکر از پاسخ شما
تفاوتی بعد از Alter نیست

AminSobati
پنج شنبه 29 مرداد 1388, 13:11 عصر
اگر در نسخه 2005 یا بالاتر هستید، Graphical Exec Plan رو برای هر دو حالت Save کنین و بفرستین

محمد سلیم آبادی
پنج شنبه 29 مرداد 1388, 15:01 عصر
اگر در نسخه 2005 یا بالاتر هستید، Graphical Exec Plan رو برای هر دو حالت Save کنین و بفرستین

منظورتان Actual Execution Plan است؟

AminSobati
پنج شنبه 29 مرداد 1388, 19:55 عصر
کلید CTRL+M رو بزنید و Query رو اجرا کنید. روی شکل ظاهر شده در Execution Plan راست کلیک و Save انجام بدین. Plan هر دو Query یعنی SP و غیر SP رو ارسال کنید

MaryamMarz
شنبه 31 مرداد 1388, 13:06 عصر
query به شکل زیر است:



SELECT DISTINCT FL.* FROM tb_FirstLayer FL
LEFT JOIN tb_SecondLayer SL on SL.FirstLayerID = FL.ID
LEFT JOIN tb_PatternJob PJ on PJ.SecondLayerID = SL.ID
LEFT JOIN tb_Matrix M on M.PatternJobID = PJ.ID
LEFT JOIN tb_JobCategoryMaster JCM on JCM.JobCategoryPatternID = M.JobCategoryPatternID
LEFT JOIN JobCategoryRecord JCR on JCR.MasterID = JCM.ID
Where JCR.ID = '3f082c39-c69f-472d-9e56-0f23f82e2326'

Order By FL.Title

AminSobati
شنبه 31 مرداد 1388, 22:59 عصر
با توجه به اینکه فقط از tb_FirstLayer فیلد استخراج میکنید، لذا میتونین از Exists استفاده کنین. در نتیجه نیاز نخواهید داشت همه رکوردها رو از tb_FirstLayer بدست بیارین و بعد Distinct کنین. به هر حال، این ایندکس رو بسازید و نتیجه رو پست کنین:




create index ix1 on tb_Matrix(JobCategoryPatternID, PatternJobID)
create index ix1 on tb_PatternJob(ID, SecondLayerId)
create index ix2 on tb_Matrix(PatternJobID, JobCategoryPatternID)
create index ix1 on tb_JobCategory(Deleted, ID)
create index ix1 on tb_JobCategoryMaster(JobCategoryPatternID, ID)

MaryamMarz
یک شنبه 01 شهریور 1388, 10:46 صبح
متاسفانه تفاوتی دز نتیجه نیست

محمد سلیم آبادی
یک شنبه 01 شهریور 1388, 13:44 عصر
این را امتحان کنید.
امید وارم این Query هم صحیح باشد و هم اینکه سرعت مناسبی داشته باشد.




SELECT * FROM tb_FirstLayer AS FL
WHERE EXISTS(SELECT * FROM tb_SecondLayer AS SL
WHERE SL.FirstLayerID = FL.ID AND
EXISTS(SELECT * FROM tb_PatternJob AS PJ
WHERE PJ.SecondLayerID = SL.ID AND
EXISTS (SELECT * FROM tb_Matrix AS M
WHERE M.PatternJobID = PJ.ID AND
EXISTS (SELECT * FROM tb_JobCategoryMaster AS JCM
WHERE JCM.JobCategoryPatternID = M.JobCategoryPatternID AND
EXISTS (SELECT * FROM JobCategoryRecord AS JCR
WHERE JCR.MasterID = JCM.ID AND
JCR.ID='3f082c39-c69f-472d-9e56-0f23f82e2326')
)
)
)
)
Order By FL.Title

AminSobati
یک شنبه 01 شهریور 1388, 17:47 عصر
متاسفانه تفاوتی دز نتیجه نیست

لطفا Planهای بعد از ساخت ایندکس رو پست بفرمایید