PDA

View Full Version : هرگز از EXPAND استفاده نکنید.



رضا عربلو
دوشنبه 01 بهمن 1386, 22:20 عصر
امروز می خواستم تفاضل دو جدول یک ستونی از نوع NVARCHAR را بدست بیارم.یکی تقریباً 1000 رکورد و دیگری 600 رکورد داشت. یه همچین چیزی نوشتم.


SELECT Name FROM Table1
EXPAND
SELECT Name FROM Table2

می دونید چقدر طول کشید تا نتیجه را بده؟ تقریباً 20 ثانیه

رفتیم سراغ روشهای قدیمی خودمون. یه همچین چیزی نوشتم


SELECT Name FROM
(
SELECT Name, 0 AS FLag FROM Table1
UNION
SELECT Name, 1 AS FLag FROM Table2
)
AS Drvtbl
GROUP BY Name
HAVING (SUM(Flag) = 0)


یه ثانیه ای جواب درست را داد.

قضاوت با خودتون!

AminSobati
سه شنبه 02 بهمن 1386, 15:32 عصر
دوست عزیزم شما این Queryها رو روی خود جداول تست کردین یا روی View؟ ضمنا Exec Plan اون Expand رو اگر میشه پست کنین

رضا عربلو
سه شنبه 02 بهمن 1386, 18:19 عصر
روی دو تا View (دوتا کوئری تقریباً به شکل SELECT Field1 AS Name FROM Table1) تست کردم. ولی انتضار همچین زمانی نداشتم.
فردا execution plan را برایشما خواهم فرستاد.

AminSobati
سه شنبه 02 بهمن 1386, 18:42 عصر
این Viewهای شما Index داشتند؟

رضا عربلو
سه شنبه 02 بهمن 1386, 19:22 عصر
خیر View هام ایندکس نداشتند.
یعنی برای یک ویو با 1000 تا رکورد که کمتر از ثانیه نمایش داده می شود هم بایستی ایندکس داشت؟ وگرنه ممکنه همچین بلایی سر کوئری هام بیاره!
از راهنمایی تان متشکرم.

hmm
چهارشنبه 03 بهمن 1386, 09:44 صبح
شاید منطقی باشه چون Expand روی فیلد name کار میکنه که از نوع nvarchar هست ولی query دوم شما براساس یک فیلد int تشخیص میده وکاری به مقایسه فیلد name نداره و بدیهی است که سرعت query دوم بالا تر باشه

AminSobati
چهارشنبه 03 بهمن 1386, 12:42 عصر
رضا جان دقیقا از Expand در این Query چه انتظاری دارین، یعنی چه Resultی مد نظرتون هست؟ (ضمنا Exec Plan هم در حالت Expand و هم با Union میتونه راهنمایی بزرگی بکنه)

رضا عربلو
چهارشنبه 03 بهمن 1386, 21:30 عصر
با عرض پوزش.
متاسفانه کوئری و ویو هایم را پاک کرده بودم و وقتی که سعی کردم دوباره آنها را بسازم و اجرا کنم موفق نشدم اون زمان 20 ثانیه را بدست بیاورم.
یک کمی به مغزم فشار اوردم یادم اومد که در هر دو ویو هایم به جای تیبل از دو تا function که هرکدام یک جدول را بر می گرداندند استفاده کرده بودم. که هر دو فانکشن هیچ پارامتری نمی گرفتند و هردو را جداگانه تست کرده بودم و در زمان کمتر از ثانیه اجرا میشدند در ضمن در فانکشن هام تنها از inner join , left outer join استفاده کرده بودم.

در ضمن از اون EXPAND نیست EXCEPT است ، یعنی می خواستم نتیجه نتیجه دو را از یک کم کنم.

بازم اصرار می کنم که هر دو کوئری دو طرف EXCEPT را چندین بار جداگانه تست و اجرا کرده بودم و زمان کمتر از ثانیه بدست آورده بودم ولی وقتی که دو کوئری را دو طرف EXCEPT می گذاشتم زمان بیشتر از 20 ثانیه را داشتم.

باز هم پوزش می طلبم که به علت مشغولیت فکری فراوان درست تمام صورت مسئله را مطرح نکرده ام.

از بذل توجه تان هم ممنونم.