دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه! دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه!
🎯 ثبت نام
بستن تبلیغات
تسلط کامل بر سی‌شارپ با یک دوره پروژه‌محور

یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شی‌گرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفه‌ای و امکانات کامل!

مشاهده بیشتر
SQL Server رو حرفه‌ای یاد بگیر

تو این دوره SQL Server رو از صفر تا پیشرفته یاد می‌گیری! از تراکنش‌ها و طراحی دیتابیس تا Query نویسی حرفه‌ای و پروژه‌های واقعی مثل مدیریت فروش و سیستم مالی. همه چی رو با مثال و تمرین یاد می‌گیری و یه متخصص دیتابیس می‌شی!

مشاهده بیشتر

اجتناب از استفاده از عملکردها در عبارت WHERE

اجتناب از استفاده از عملکردها در عبارت WHERE

همانطور که در موضوعات قبلی ذکر کردیم، فراخوانی عملکردها کد را خواناتر کرده، اما در برخی موارد باعث تاثیرات ناخواسته ی دیگری می شوند که اجرای queryهای ما را کاهش می دهد. سناریوهای خاص استفاده از یک عملکرد در یک عبارت WHERE یکی از این موارد می باشد.

توضیحات:

دو دلیل برای اجتناب از داشتن یک عملکرد در عبارت WHERE و مشخصا روی ستون هایی که در عبارت WHERE در حال فیلتر کردن هستید، وجود دارد. اولی مشابه موضوع قبل می باشد، عملکرد باید برای هر رکورد در مجموعه ی نتیجه فراخوانده شود که منجر به کاهش سرعت اجرا در query می شود. دلیل دوم که می تواند تاثیر بیشتری روی اجرای query داشته باشد، این حقیقت است که اگر عملکردی وجود دارد که ستونی را که سعی دارید فیلتر کنید، احاطه کرده باشد، هر ایندکسی روی آن ستون نمی تواند استفاده شود. اجازه بدهید مثال ساده ای را در نظر بگیریم. ابتدا نیاز خواهیم اشت که یک ایندکس روی ستون در عبارت WHERE ایجاد کنیم، بنابراین می توانیم نشان دهیم وقتی یک عملکرد (function) به اطراف آن اضافه می کنیم چگونه مورد استفاده قرار نمی گیرد. در اینجا کد آن را مشاهده می کنید:

1
2
3
4
5
6
CREATE NONCLUSTERED INDEX idxParent_DateDataColumn
ON [dbo].[Parent] ([DateDataColumn]) ‎
  
‎-- cleanup statements
DROP INDEX Parent.idxParent_DateDataColumn
<button></button>

اکنون اجازه بدهید نگاهی به یک query ساده داشته باشیم که همه ی رکوردها را در جدول اصلی گزارش می دهد که کمتر از 30 روز هستند. در اینجا یک راه برای نوشتن SQL مشاهده می کنید:

1
2
3
4
                            SELECT ParentID
‎  FROM [dbo].[Parent]‎
‎ WHERE dateadd(d,30,DateDataColumn) > getdate()‎
<button></button>

با نگاه کردن به explain plan برای این query متوجه می شوید که ایندکسی که روی DateDataColumn ایجاد کردیم، نادیده گرفته شده و اسکن ایندکس اجرا می شود.

آموزش SQL Server

اکنون اجازه بدهید این query را بازنویسی کرده و تابع را به سمت دیگر اپراتور > حرکت دهیم. در اینجا وضعیت SQL را مشاهده می کنید:

1
2
3
4
SELECT ParentID
‎  FROM [dbo].[Parent]‎
‎ WHERE DateDataColumn > dateadd(d,-30,getdate())‎
<button></button>

با نگاه کردن به explain plan برای این query متوجه می شویم که optimizer در حال استفاده از ایندکس می باشد و جستجو را به جای اسکن اجرا می کند.

آموزش SQL Server

در واقع تایید آن سریعتر می باشد. اجازه بدهید نگاهی به نتایج SQL Profiler برای این دو query داشته باشیم. در زیر مشاهده می کنیم که در هنگام استفاده از یک ایندکس از منابع کمتری استفاده کرده و وضعیت مورد نظر سریعتر اجرا می شود.

CPU
Reads
Writes
Duration
Function
5
274
0
43
No Function
0
5
0
5
1394/07/27 3704 1587
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...