PDA

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



reza_ali202000
چهارشنبه 06 خرداد 1394, 00:44 صبح
سلام دوستان یه کوئری دارم که میاد تمام فاکتورها رو میخونه و بعد میاد تمام پرداخت دریافت ها رو میخونه مال هر مشتری مشخص میکنه که بدهکار هس یا بستانکار با مبلغش جلوش مینویسه.
خوب این کوئری برای واکشی 1میلیون رکورد حدود 11 ثانیه طول میکشه. دوستان نظری ندارن که بتونم این مقدار زمان رو کاهش بدم؟

SELECT COALESCE (SUM(CONVERT(decimal, Price)) - COALESCE
((SELECT SUM(CONVERT(decimal, Price)) AS Expr1
FROM FinancialTransaction
WHERE (PersonCode = @cod) AND (Pay = 'True') OR
(Pay = 'True') AND (Entrust = @cod)), 0), 0) +
(SELECT COALESCE (SUM(CONVERT(decimal, InvoiceDetails_1.Price) * InvoiceDetails_1.Count) -
(SELECT COALESCE (SUM(CONVERT(decimal, COALESCE (Discount, 0))), 0) AS Expr1
FROM Invoice
WHERE (PersonCode = @cod) AND (Type = 'K')), 0) -
(SELECT COALESCE (SUM(CONVERT(decimal, InvoiceDetails_1.Price) * InvoiceDetails_1.Count) -
(SELECT COALESCE (SUM(CONVERT(decimal, COALESCE (Discount, 0))), 0) AS Expr1
FROM Invoice AS Invoice_2
WHERE (PersonCode = @cod) AND (Type = 'F')), 0) AS Expr1
FROM Invoice AS Invoice_1 INNER JOIN
InvoiceDetails AS InvoiceDetails_1 ON Invoice_1.Code = InvoiceDetails_1.InvoiceCode
WHERE (Invoice_1.PersonCode = @cod) AND (Invoice_1.Type = 'F')) AS Expr1
FROM Invoice AS Invoice_1 INNER JOIN
InvoiceDetails AS InvoiceDetails_1 ON Invoice_1.Code = InvoiceDetails_1.InvoiceCode
WHERE (Invoice_1.PersonCode = @cod) AND (Invoice_1.Type = 'K')) AS Expr1
FROM FinancialTransaction AS FinancialTransaction_1
WHERE (PersonCode = @cod) AND (Pay = 'False') OR
(Pay = 'False') AND (Entrust = @cod)

soheileee
چهارشنبه 06 خرداد 1394, 05:21 صبح
پیشنهاد من اینه:


در جدول Invoice روی Code یک Nonclustered Index درست کنی و در اون Type و PersonCode و Discount رو Include کنی.
در جدول InvoiceDetails یک Nonclustered Index روی InvoiceCode درست کنی و توش Price و Count رو Include کنی.
در جدول FinancialTransaction یک Nonclustered Index بساز روی PersonCode و Entrust و توش Pay و Price رو Include کن.


اینها پیشنهاداتی هست که در اولین نگاه به ذهنم رسید.
اما اگه خودم مستقیماً با این مشکل مواجه بودم، حتماً کوئری رو توی SQL Server Tuning Adviser اجرا می کردم ببینم چه پیشنهاداتی داره.
در مرحله بعدی یه نگاهی مینداختم به Execution Plan تا ببینم کدوم Process بیشترین هزینه رو داره. و اینکه ممکنه ایندکسهایی که من پیشنهاد دادم موجود باشه. در این صورت Fragmentation روی ایندکس ها ممکنه به وجود آمده باشه.

در ضمن، اگه تعداد بالایی رکورد داری، ممکنه Create کردن هر Index زمان زیادی ببره و همچنین حجم قابل توجهی از فضا رو اشغال کنه، پس اگه داری روی Production این کار رو انجام می دی باید مطمئن باشی که در زمان اجرا کابران در حال کار نباشد چون Table lock خواهی داشت.و همچنین فضای خالی کافی برای ایجاد ایندکسها روی سرور داشته باشی.

reza_ali202000
چهارشنبه 06 خرداد 1394, 13:37 عصر
دوست عزیز تشکر.
با این کارا حدود 2 ثانیه تمام اطلاعات رو پردازش میکنه!!!!!
حقیقتا فکر نمیکردم اینجا کسی بتونه کمکم کنه!!!!!!!!
بازم ممنون

مهدی نان شکری
چهارشنبه 06 خرداد 1394, 13:53 عصر
با سلام
بدون Plan نمی توان هیچ نظری داد.