محمد سلیم آبادی
جمعه 24 اردیبهشت 1389, 06:39 صبح
سلام،
این مطلب (http://pratchev.blogspot.com/2007/04/pivoting-data-in-sql-server.html)را راجب Pivoting Data از Plamen Ratchev خواندم ولی مقاله بحث Query Tuning را پوشش نداده بود.
و چندتا Comment هم گذاشتم ولی جواب درست حسابی دریافت نکردم.
اگر ستونی که با آن داده ها را فیلتر می کنیم داخل یک عبارت استفاده شود ایندکس مربوط به آن استفاده نخواهد شد و جدول به جای Index Seek اسکن خواهد شد.
مثلا عبارات:
LEFT(name, 1)='A' --d
CONVERT(integer, i) > 5000 --d
YEAR(date) ='2010' --d
DATEPART(yyyy, date)='2005'--d
حالا سوالم این هست که نباید با کمک ستون های محاسباتی این مقادیر را ذخیره کنیم و روی آنها شاخص بگذاریم تا index استفاده شود؟
از طرفی در بحث Pivoting با روش CASE اگر بخواهیم آمار ماه اول، دوم و سوم را بدست آوریم می تونیم قبل از گروه بندی، سطرها های مورد نظر را فیلتر کنیم تا تمام داده های جدول (که طبعا به آنها احتیاج نداریم) خواندن نشن. به شکل زیر توجه کنید (می تونید کد مربوط به CASE را از مقاله مشاهده کنید)
SELECT ... FROM table
WHERE month >=1 AND month <=3
ولی اگر بخواهیم آمار ماه اول و ماه پنجم را بدست آوریم ناچاریم این دستور را بنویسیم:
WHERE month = 1 OR month = 5
اگر روی ستون month یک Nonclustered ایندس تعریف کرده باشیم بگونه ای که تمام ستون های مورد نیاز جدول (چه ستون هایی که در target لیست شدن و چه در group by استفاده شدن) را پوشش داده باشد، از آن استفاده خواهد شد؟
در کل من روش CASE برای حل مساله ی Cross tabbing را نسبت به روش Multiple outer join جالب نمی بینم. درسته که در روش CASE داده های جدول تنها یک بار read میشن ولی این روش در مقابل روش outer join که از ایندکس به شکل بهینه استفاده می کند سرعت کمتری دارد. (این رو نتیجه ی آزمایش مشخص کرده)
با تشکر،
این مطلب (http://pratchev.blogspot.com/2007/04/pivoting-data-in-sql-server.html)را راجب Pivoting Data از Plamen Ratchev خواندم ولی مقاله بحث Query Tuning را پوشش نداده بود.
و چندتا Comment هم گذاشتم ولی جواب درست حسابی دریافت نکردم.
اگر ستونی که با آن داده ها را فیلتر می کنیم داخل یک عبارت استفاده شود ایندکس مربوط به آن استفاده نخواهد شد و جدول به جای Index Seek اسکن خواهد شد.
مثلا عبارات:
LEFT(name, 1)='A' --d
CONVERT(integer, i) > 5000 --d
YEAR(date) ='2010' --d
DATEPART(yyyy, date)='2005'--d
حالا سوالم این هست که نباید با کمک ستون های محاسباتی این مقادیر را ذخیره کنیم و روی آنها شاخص بگذاریم تا index استفاده شود؟
از طرفی در بحث Pivoting با روش CASE اگر بخواهیم آمار ماه اول، دوم و سوم را بدست آوریم می تونیم قبل از گروه بندی، سطرها های مورد نظر را فیلتر کنیم تا تمام داده های جدول (که طبعا به آنها احتیاج نداریم) خواندن نشن. به شکل زیر توجه کنید (می تونید کد مربوط به CASE را از مقاله مشاهده کنید)
SELECT ... FROM table
WHERE month >=1 AND month <=3
ولی اگر بخواهیم آمار ماه اول و ماه پنجم را بدست آوریم ناچاریم این دستور را بنویسیم:
WHERE month = 1 OR month = 5
اگر روی ستون month یک Nonclustered ایندس تعریف کرده باشیم بگونه ای که تمام ستون های مورد نیاز جدول (چه ستون هایی که در target لیست شدن و چه در group by استفاده شدن) را پوشش داده باشد، از آن استفاده خواهد شد؟
در کل من روش CASE برای حل مساله ی Cross tabbing را نسبت به روش Multiple outer join جالب نمی بینم. درسته که در روش CASE داده های جدول تنها یک بار read میشن ولی این روش در مقابل روش outer join که از ایندکس به شکل بهینه استفاده می کند سرعت کمتری دارد. (این رو نتیجه ی آزمایش مشخص کرده)
با تشکر،