PDA

View Full Version : کاهش سرعت در تهیه گزارش



Neshasteh
یک شنبه 08 دی 1392, 08:35 صبح
با سلام.

خدمت دوستان من یک نرم افزار حسابداری دارم که در گزارش محاسبه سود فاکتورم که شاید تعداد فاکتورام به 6000 هزار میرسه .گزارشم خیلی کند شده در حد یک روز .
ولی این شرایط در حالتی که با محدودیت تاریخ یا سایر فیلتر ها میگرم به وجود میاد.
در حالتی که بدون محدودیت میگیرم مدت زمان تهیه گزارش منطقیه.

من از دو اسکرسپت که یکیش یک فانکشنه به نام GetCost که در داخل اسکرسپتم با یک سری پارامتر فراخوانی میکنم
حالا من از دوستان خواهش دارم اگه کسی در این زمینه جهت افزایش کارایی وتسریع گزارشم دانشی داره کمک کنه

حمیدرضاصادقیان
یک شنبه 08 دی 1392, 12:45 عصر
سلام.
اول باید کدتون بررسی بشه.
در صورت امکان اگر از Inline Function ها استفاده میکنید به Subquery تبدیلش کنید.
اگر میشه Statistics و Plan رو نیز قرار بدید تا بشه دقیقتر بررسی کرد.

Neshasteh
یک شنبه 08 دی 1392, 13:31 عصر
ممنون دوست عزیز من Function را براتون میذارم
SELECT
IdCodeOne
,IdCodeTwo
,Ex_date
,Activ
,id
,Nam
,KolCount
,JozCount
,Fe
,AllMon= ROUND(Fe*(CASE WHEN DK='True' THEN KolCount ELSE KolCount END),2)
FROM (SELECT
IdCodeOne
,IdCodeTwo
,Ex_date
,Activ
,id
,DK
,Nam
,KolCount
,JozCount
,Fe=CASE WHEN (KOlCount=0 AND JozCount=0) THEN 0 ELSE dbo.GetCost(id,(CASE WHEN DK='True' THEN KolCount ELSE KolCount END)
,(CASE WHEN DK='True' THEN 'KOL' ELSE 'KOL' END),'','','False') END
FROM (SELECT
Ex_date
,Activ
,id
,DK
,Nam
,KolCount
,JozCount
,IdCodeOne
,IdCodeTwo
FROM (SELECT
Ex_date
,Activ
,id
,DK
,Nam
,ROUND(KolCount,3) AS KolCount
,ROUND(JozCount,3) As JozCount
,IdCodeOne
,IdCodeTwo
FROM (SELECT
AllKala.*
,(SELECT ISNULL(SUM(CASE WHEN KolCount>=0 THEN KolCount END),0) + ISNULL(SUM (CASE WHEN KolCount<0 THEN KolCount END),0)
FROM (SELECT ISNULL(SUM(Count_Kol),0) AS KolCount
FROM Define_PrimaryKala
WHERE IdKala =AllKala.id
UNION ALL
SELECT ISNULL(SUM( KalaFactorBuy.KolCount),0) AS KolCount
FROM KalaFactorBuy INNER JOIN
ListFactorBuy ON KalaFactorBuy.IdFactor = ListFactorBuy.IdFactor
WHERE (KalaFactorBuy.Activ =1 and ListFactorBuy.Activ =1 and ListFactorBuy.Stat =0) And IdKala =AllKala.id
UNION ALL
SELECT ISNULL(SUM( KalaFactorBackSell.KolCount),0) AS KolCount
FROM KalaFactorBackSell INNER JOIN ListFactorBackSell ON KalaFactorBackSell.IdFactor = ListFactorBackSell.IdFactor
WHERE (KalaFactorBackSell.Activ =1 and ListFactorBackSell.Activ =1 ) And IdKala =AllKala.id
UNION ALL
SELECT ISNULL(SUM( KalaFactorSell.KolCount)*(-1),0) AS KolCount
FROM KalaFactorSell INNER JOIN
ListFactorSell ON KalaFactorSell.IdFactor = ListFactorSell.IdFactor
WHERE (KalaFactorSell.Activ =1 and ListFactorSell.Activ =1 and ListFactorSell.Stat =3) And IdKala =AllKala.id
UNION ALL
SELECT ISNULL(SUM( KalaFactorBackBuy.KolCount)*(-1),0) AS KolCount
FROM KalaFactorBackBuy INNER JOIN
listFactorBackBuy ON KalaFactorBackBuy.IdFactor = ListFactorBackBuy.IdFactor
WHERE (KalaFactorBackBuy.Activ =1 and listFactorBackBuy.Activ =1 ) And IdKala =AllKala.id
UNION ALL
SELECT ISNULL(SUM( KalaFactorDamage.KolCount)*(-1),0) AS KolCount
FROM KalaFactorDamage INNER JOIN
listFactorDamage ON KalaFactorDamage.IdFactor = ListFactorDamage.IdFactor
WHERE (KalaFactorDamage.Activ =1 and ListFactorDamage.Activ =1 ) And IdKala =AllKala.id) AS AllKolCount)KolCount
,(SELECT ISNULL(SUM(CASE WHEN AllJozCount.JozCount>=0 THEN AllJozCount.JozCount END),0) + ISNULL(SUM (CASE WHEN AllJozCount.JozCount<0 THEN AllJozCount.JozCount END),0)
FROM (SELECT ISNULL(SUM(Count_joz),0) AS JozCount
FROM Define_PrimaryKala
WHERE IdKala =AllKala.id
UNION ALL
SELECT ISNULL(SUM( KalaFactorBuy.JozCount),0) AS JozCount
FROM KalaFactorBuy INNER JOIN ListFactorBuy ON KalaFactorBuy.IdFactor = ListFactorBuy.IdFactor
WHERE (KalaFactorBuy.Activ =1 and ListFactorBuy.Activ =1 and ListFactorBuy.Stat =0) And IdKala =AllKala.id
UNION ALL
SELECT ISNULL(SUM( KalaFactorBackSell.JozCount),0) AS JozCount
FROM KalaFactorBackSell INNER JOIN
ListFactorBackSell ON KalaFactorBackSell.IdFactor = ListFactorBackSell.IdFactor
WHERE (KalaFactorBackSell.Activ =1 and ListFactorBackSell.Activ =1 ) And IdKala =AllKala.id
UNION ALL
SELECT ISNULL(SUM( KalaFactorSell.JozCount)*(-1),0) AS JozCount
FROM KalaFactorSell INNER JOIN
ListFactorSell ON KalaFactorSell.IdFactor = ListFactorSell.IdFactor
WHERE (KalaFactorSell.Activ =1 and ListFactorSell.Activ =1 and ListFactorSell.Stat =3) And IdKala =AllKala.id
UNION ALL
SELECT ISNULL(SUM( KalaFactorBackBuy.JozCount)*(-1),0) AS JozCount
FROM KalaFactorBackBuy INNER JOIN listFactorBackBuy ON KalaFactorBackBuy.IdFactor = ListFactorBackBuy.IdFactor
WHERE (KalaFactorBackBuy.Activ =1 and listFactorBackBuy.Activ =1 ) And IdKala =AllKala.id
UNION ALL
SELECT ISNULL(SUM( KalaFactorDamage.JozCount)*(-1),0) AS JozCount
FROM KalaFactorDamage INNER JOIN
listFactorDamage ON KalaFactorDamage.IdFactor = ListFactorDamage.IdFactor
WHERE (KalaFactorDamage.Activ =1 and ListFactorDamage.Activ =1 ) And IdKala =AllKala.id) AS AllJozCount)JozCount
FROM (SELECT
Define_Kala.Ex_Date
,Define_Kala.Activ
,Define_Kala.Id
,Define_Kala.DK
,Define_Kala.IdCodeOne
,Define_Kala.IdCodeTwo
,Define_Kala.Nam
FROM Define_Kala ) AS AllKala )As EndData )As AllKalaNfe ) AS AllKalaFe) AS AllKalaFe2
Order by Nam


البته اسکریپتی که من توش این تابعو فراخوانی میکنم رو نذاشتم لازمه ؟

حمیدرضاصادقیان
یک شنبه 08 دی 1392, 15:28 عصر
یکی از دلایل کندی این هست که Inline Function ها به ازای هر رکورد صدا زده میشه.داخل همین تابع شما نیز باز از توابعی استفاده شده و متاسفانه اینها داخل Execution Plan نمایش داده نمی شوند.
اول باید Execution Plan اصلی بررسی بشه و Statistics نیز مطالعه بشه بعد به جزتر بررسی بشه تا بتوان جواب داد.