PDA

View Full Version : کندی بیش از حد query در دلفی



rmb_ali
سه شنبه 27 آذر 1386, 13:41 عصر
دوستان عزیز به دادم برسید که عنقریب مخمو میزنم به دیوار
مشکا اینه که من میخوام یه query رو با استفاده از adoquery اجرا کنم query هم اینه
Qmojodi.SQL.Add('select od_cd,od_nm,stock_cd,unit1_cd,main_no, dbo.S_GetMojodi('+quotedstr('12')+',a.od_cd,'+quot edstr( copy(NowDate,3,8) )+') as inv from s_ods a inner join s_units on unit1_cd=unit_cd where stock_cd=12 ');
حالا این query بعد از اینکه adoqurty1.active:=true; رو میزنم به هیچ عنوان فعال نمیشه یعنی حتی 1 ساعت هم صبر کردم ولی اکتیو نشد لازم به ذکره که اون فانکشن میره و براساس اون داده هایی که میگیره موجودی قطعات رو محاسبه میکنه

JAFO_IRAN
سه شنبه 27 آذر 1386, 15:25 عصر
سلام

1. برای اینکه ببینی چی داره زمان میگیره باید QUERY رو مثلا در Analyser اجرا کنی و plan رو بررسی کنی - این خیلی کمک میکنه.

2. اگر S_GetMojodi به صورت یک تابع خطی (deterministic مثلا با یک return) نوشته نشده باشه استفاده ازش میتونه خیلی خیلی کند کننده باشه. فکر کنم نمیشه این تابع رو با بقیه plan مخلوط کنه. شاید بشه به جای اون تابع از join یا مانند اون استفاده کنی.

3. همیشه وقتی بحث سرعت اجرا پیش میاد، داستان اندیس و استفاده مناسب از اونها نیز مطرح میشه.

ارادت

SYNDROME
سه شنبه 27 آذر 1386, 16:40 عصر
فکر کنم شما در تابعی که در SQL نوشته اید باز خود دارید و این باعث می شود Query اجرا نشود.
حالا به جای توابع که در مقابل Select نوشته اید "*" بزنید تا ببینید مشکل این است یا نه.
موفق باشید

rmb_ali
چهارشنبه 28 آذر 1386, 09:40 صبح
از توجه شما ممنون ولی من این دستور query رو در query analayzer که اجرا میکنه حدود 3 ثانیه جواب رو میاره متن فانکشن هم براتون میزارم


CREATE FUNCTION S_GetMojodi (@StockCd Varchar(10),@OdCd Varchar(15),@CDate Char(8))
RETURNS Float AS
BEGIN

Declare @CYear SmallInt,@Mojodi Float

/*جهت اعلام موجودی کالا هنگام ثبت فاکتورها از این ویو استفاده شده
*/
--Declare @StockCd Varchar(10),@OdCd Varchar(15),@CDate Char(8)
--Set @OdCd='1001'
--Set @CDate='86/02/18'
--Set @StockCd='1'

Set @CYear=Cast('13'+Left(@CDate,2) As SmallInt)

SELECT @Mojodi=SUM(d .QUANTITY*V.Tag1)
FROM dbo.S_DTL_FCT d LEFT OUTER JOIN
dbo.S_HED_FCT h ON d .id = h.id Left Outer Join
(Select Code,Tag1 From U_Constant Where Karbord_Cd=1) V On H.Flag=V.Code
Where (H.acc_Year=@CYear) And (D.Stock_Cd=@StockCd) And (H.Fact_Date<=@CDate) And (D.Od_Cd=@OdCd) And (h.vazeiat=1) And (V.Tag1<>0)
Return IsNull(@Mojodi,0)
END

mehdia86
پنج شنبه 29 آذر 1386, 13:52 عصر
با سلام
خوب با مسائلی که گفتید که در Query Analyzer در زمان 3 ثانیه اجرا می شه بهتره اون Query سمت دلفی رو بیاری سمت سرور به صورت Stored Procerdure بنویسی در اینصورت در همون سه ثانیه اجرا می شه اگر با استفاده از SP تو دلفی هم مشکل داشتی می تونم کمکت کنم
اما دو تا مورد
یکی اینکه گفتی این Query در Analuyzer اجرا می شه اصلا فرمت این دستور برا analyzer خطا داره
یکی دیگه هم هر چند من جداول شما رو نمی دونم چیه ولی بنظر میاد بهتر برا اون query داخل تابعتون یک ویو بنویسید و سپس اون تابع از ویو رکوردها رو بازخوانی کنه سرعت بالاتر می ره چون به هر صورت 3 ثانیه هم تو Analyzer زیاده

موفق باشید