PDA

View Full Version : افزایش سرعت کوئری



hamid_14
چهارشنبه 26 شهریور 1393, 15:19 عصر
سلام
من از کوئری زیر استفاده کردم و 18193 رکورد در 6 دقیقه و 48 ثانیه لود میکنه فیلد fdate هم ایندکس کردم فقط چند ثانیه کمتر شد کلیه فیلد های اضافی هم حذف کردم نمی دونم این سرعت درسته یا راهی هست که سریع تر بشه.بانکم sqlite هست لطفا اگه راهی داره راهنمائی کنید خیلی گیرم.


SELECT t1.description,t1.fdate, t1.id,t1.dp,t1.cp,(select IFNULL(SUM(Cp),0) - IFNULL(SUM(Dp),0) from [TBL_TRANSACTIONS] t2 where (t2.fdate < t1.fdate AND t1.acc=t2.acc) or (t2.fdate = t1.fdate and t2.ID <= t1.ID AND t1.acc=t2.acc) ) RE, (Select TRIM(PDS) From TBL3 Where ID = t1.PID) as NPDS,
(Case R_TAG
WHEN '1' THEN
(SELECT NAME FROM TBL1 WHERE ID = CID)
WHEN '2' THEN
(SELECT 'To:'||NAME FROM TBL2 WHERE ID = CID)
WHEN '3' THEN
(SELECT 'From:'||NAME FROM TBL2 WHERE ID = CID)
END) as TName
FROM [TBL_TRANSACTIONS] t1
Where (t1.sdate>=:insdate) AND (t1.sdate<=:inedate)
AND (t1.ACC=:inaone) AND (R_TAG <> 0)
ORDER BY t1.fdate

mohammad reza beizavi
چهارشنبه 26 شهریور 1393, 15:36 عصر
درود
دوست گرامی، چیکار داری می کنی در کل؟؟؟!!!!
کوئریت رو 1 ماه دیگه نگاه کنی که سرگیجه میگیری:متفکر:
پیشنهاد می کنم ساختار بانک اطلاعاتی رو دوباره چک کنی، کوئری با این همه subquery اصلا بهینه به نظر نمیاد.
علی الحساب بگم که شما باید روی تمام ستونهایی که در شرطهای کوئری میذارید index بذارید.
در مورد سرعت هم اینکه سرعت sqlite هم خیلی خوبه اگه ساختار دیتابیس و کوئری ها درست باشه.

hamid_14
چهارشنبه 26 شهریور 1393, 16:08 عصر
مرسی از جوابتون, این یک برنامه مالی بوده که در جدول حسابش باید محاسبات running total باشه البته کد های بهتری هم هست ولی همشون تو sql server کار می کردن نه تو sqlite.حالا بنظر شما میشه کاریش کرد که سریع تر بشه.روی همه فیلد هایی که شرطی هستن index هم گذاشتم ولی تائیری نداشت.
البته اینم بگم که همه کندی سرعت دقیقا از همین کد محاسبه running totals هست یعنی کد زیر:


(select IFNULL(SUM(Cp),0) - IFNULL(SUM(Dp),0) from [TBL_TRANSACTIONS] t2 where (t2.fdate < t1.fdate AND t1.acc=t2.acc) or (t2.fdate = t1.fdate and t2.ID <= t1.ID AND t1.acc=t2.acc) ) RE

mohammad reza beizavi
چهارشنبه 26 شهریور 1393, 18:05 عصر
:گیج:
جدولا رو بر اساس چی می تونید JOIN بزنید؟؟؟ یعنی کدومشون مسلما باید برابر باشند؟؟؟

hamid_14
چهارشنبه 26 شهریور 1393, 19:18 عصر
در لینک زیر آقای you-see گفتن که join کنم و انجام دادم ولی تائیری تو سرعت نداشت نمی دونم درست انجام دادم یا نه

http://barnamenevis.org/showthread.php?469502-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%D8%B9%D8%AA-%DA%A9%D9%88%D8%A6%D8%B1%DB%8C

mohammad reza beizavi
چهارشنبه 26 شهریور 1393, 19:55 عصر
خب من مطلب داخل پست سوم اون لینک رو نمیتونم درست ببینم چون style داره.
یه سری پیشنهاد کلی می کنم. امیدورام کمک کنه:
1- از درج اطلاعات NULL در کل جداول بالاخص ستونهایی که محاسباتی هستن یا روی آنها شرط میگذارید جدا خودداری کنید تا مجبور نشید از IFNULL استفاده کنید.
2-کوئریتون رو با JOIN بدون اون مقادیر محاسبه ای و subquery بعد از نتیجه با یه alias دوباره کوئری بگیرید با اون محاسبات و subquery ها.
اما اگه کوئری joinی که گذاشتید اونبر درست ببینم بهتر میشه کمک کرد

hamid_14
چهارشنبه 26 شهریور 1393, 23:38 عصر
خیلی ممنون از وقتی که گذاشتید.فیلد null تو این کوئری نیست از ifnull هم محض احتیاط استفاده کردم چون فکر نمی کردم روی سرعت تاثیر داشته باشه.
شرمنده چون مشکل style داشت مجبور شدم فایل ضمیمه کنم.

mohammad reza beizavi
پنج شنبه 27 شهریور 1393, 00:02 صبح
خواهش میکنم
یه موردی هست. با این شرطی که روی JOIN گذاشتین حداقل تعداد رکوردهای cach شده توی engine به اندازه ضرب دکارتی میشه. که تعدادش مسلما زیاده.
حالا با همین تعداد داری subquery میگیری.
به نظرم شرط JOIN رو یه کاریش بکن اوضاعش بهتر بشه.
اگه امکان داره تا بریم سراغ ادامه کار

hamid_hr
پنج شنبه 27 شهریور 1393, 12:35 عصر
شرط inner join رو به این صورت بنویسید
t2.fdate <= t1.fdate AND ((t1.acc = t2.acc) or (t2.fdate = t1.fdate and t2.ID <= t1.ID AND t1.acc = t2.acc))

شرط where این یعنی چی؟

(t1.sdate >= insdate) AND (t1.sdate <= inedate)

فک کنم با این یکی باشه

t1.sdate = insdate

hamid_14
پنج شنبه 27 شهریور 1393, 15:36 عصر
از شرط شما استفاده کردم ولی بازم تغییری تو سرعت نداشت.در مورد شرط where برای اینه که اطلاعات یک رنج از تاریخ بدست بیاره بهتر بود از between استفاده می کردم.
آیا در sqlite راهی به غیر استفاده از subquery هست؟