وبگاه شخصی حسن فتحی

۱۱ مطلب با موضوع «مهندسی نرم‌افزار» ثبت شده است

IEnumerable VS IQueryable in .Net Framework

دو عنصر بالا از شی ها یا به عبارتی نوع داده های (Data Type) دات نت هستند؛ ما از IEnumerable  و IQueryable برای دستکاری داده استفاده می کنیم (LINQ). در دات نت IEnumerable  توسط IQueryable  به ارث برده می شود به عبارتی دیگر IQueryable  همه ویژگی های IEnumerable  دارد و علاوه بر آن ها ویژگی های منحصر به فرد خود را نیز دار؛ هر دوی این دو شی برای بازیابی و دستکاری داده های موجود در پایگاه داده (Database) به کار می روند. اجازه دهید ویژگی های هر کدام و برتری آنها نسبت به هم را نام ببرم؛ که نقش مهمی در بالا بردن سرعت و کارایی پرس و جوهای (LINQ) دارند.
دو عنصر بالا شباهت زیادی به هم دارند و همه برنامه نویسان از هر دو آنها استفاده می کنند ولی از لحاض کارایی در سناریوهای مختلف متفاوت عمل می کنند.

IEnumerable  :
  • فضای نام (System.Collections)
  • بهترین مورد استفاده آن در بازیابی داده از شی های موجود در حافظه (in-Memory Objects) مانند لیست، آرایه و ... است 
  • موقعی که بازیابی داده از پایگاه داده انجام می شود IEnumerable  پرس و جو را سمت سرور اجرا کرده و داده ها را در شی های in-Memory در سمت کلاینت بارگذاری کرده و بعد عمل فیلترینگ را انجام می دهد
  • بهترین و مناسب ترین برای پرس و جوهای LINQ to Object و LINQ to XML
  • پشتیبانی از (deferred execution)
  • عدم پشتیبانی از پرس و جوهای سفارشی (custom query)
  • عدم پشتیبانی از (lazy loading) و نامناسب برای صفحه بندی (paging)
IQueryable :
  • فضای نام (System.Linq)
  • بهترین مورد استفاده آن در بازیابی داده از شی های موجود در خارج حافظه (out-Memory Objects) مانند پایگاه داده ها، سرویس ها و ... است 
  • موقعی که بازیابی داده از پایگاه داده انجام می شود IQueryable پرس و جو را سمت سرور با انجام  عمل فیلترینگ اجرا می کند
  • بهترین و مناسب ترین برای پرس و جوهای LINQ to SQL
  • پشتیبانی از (deferred execution)
  • پشتیبانی از پرس و جوهای سفارشی (custom query) با استفاده از CreateQuery و Execute methods.
  • پشتیبانی از (lazy loading) و مناسب برای صفحه بندی (paging)
مثال :
IEnumerable  :
  1. MyDataContext db = new MyDataContext ();
  2. IEnumerable<Employee> list = db.Employees.Where(p => p.Name.StartsWith("S"));
  3. list = list.Take<Employee>(10);
پرس و جوی تولید شده :
  1. SELECT [t0].[EmpID], [t0].[EmpName], [t0].[Salary] FROM [Employee] AS [t0]
  2. WHERE [t0].[EmpName] LIKE @p0
توجه : اجرای پرس و جو سمت سرور (SQL SERVER) و فیلتر کردن آن سمت کلاینت توسط شی موجود در حافظه کلاینت

IQueryable :
  1. MyDataContext db = new MyDataContext ();
  2. IQueryable<Employee> list = db.Employees.Where(p => p.Name.StartsWith("S"));
  3. list = list.Take<Employee>(10);
پرس و جوی تولید شده :
  1. SELECT TOP 10 [t0].[EmpID], [t0].[EmpName], [t0].[Salary] FROM [Employee] AS [t0]
  2. WHERE [t0].[EmpName] LIKE @p0
توجه : اجرای پرس و جو سمت سرور (SQL SERVER) و فیلتر کردن آن در همان سمت
۱۵ اسفند ۹۴ ، ۱۰:۳۶ ۱ نظر موافقین ۱ مخالفین ۰
حسن فتحی

نظارت بر عملکرد و کارایی پایگاه داده با استفاده از Query Store در SQL SERVER 2016

قابلیت  Query Store امکانی را برای مدیران پایگاه‌ داده‌ها فراهم می‌کند تا با بینشی عمیق برای کوئری های خود Execution Plan (طرح پرس و جو)ی مناسبی را در جهت بهبود کارایی و عملکرد پایگاه داده خود انتخاب کنند. این امکان شما را قادر می‌سازد تا با یک عیب‌یابی ساده عملکرد تاثیرات ناشی از تغییرات کوئری‌ها در طرح پرس و جو را ردیابی کرده و با مشاهده تفاوت عملکردها بهترین کوئری را (از لحاظ کارایی) انتخاب کنید؛ این امکان به طور خودکار تاریخچه کوئری ها، طرح کوئری ها و آمار های زمان اجرا را ذخیره و برای استفاده و بازبینی شما نمایش می دهد، داده ها را بر اساس ساعت سیستم (زمان ویندوز) جدا و دسته بندی می‌کند و به شما اجازه می‌دهد الگوهای استفاده از پایگاه داده را مشاهده و تغییرات Execution Plan ها را روی سرور مشاهده کنید.

فعال سازی Query Store:
توسط صفحه Query Store در Management Studio :
1- روی پایگاه داده راست کلیک کرده و گزینه Properties را انتخاب کنید
2- در Database Properties روی گزینه Query Store کلیک کنید
3- در جعبه Enable  گزینه True را انتخاب کنید
توسط دستور ALTER DATABASE :
ALTER DATABASE dataBase_Name SET QUERY_STORE = ON;
بعد از فعال سازی این امکان Object Explorer را Refresh کنید تا بخش Query Store در پایگاه داده شما اضافه شود. بعد از اضافه شدن یکسری توابع، وییو و روال و کوئری ها هستند که با استفاده از آن ها میتوانید Query Store را مدیریت کنید.
هفت وییو برای ارائه اطلاعات درباره Query Store وجود دارد:

شش Stored Procedure برای پیکربندی Query Store وجود دارد:



برای اطلاعات بیشتر و تکمیلی به MSDN مراجعه کنید.
۱۰ دی ۹۴ ، ۱۶:۱۸ ۱ نظر موافقین ۰ مخالفین ۰
حسن فتحی

امکان جدید بسط جداول در اس کیو ال سرور ۲۰۱۶

در بسیاری از جداول بانکهای اطلاعاتی، اغلب داده هایی که مورد جستجو و بازیابی قرار می گیرند، داده هایی هستند که اخیراً ذخیره شده اند و به ندرت به داده هایی مثلا با قدمت یکسال پیش نیاز داریم.

بنابراین بسیار عقلانی به نظر میرسد که داده های قدیمی را جدا از داده های جدید نگه داریم تا سرعت بازیابی و جستجو و درج اطلاعاتمان بالا رود. از طرفی با ایجاد یک مکانیزم بهینه، کاری کنیم که در صورت جستجوی داده های قدیمی تر، آنها نیز در نتایج ظاهر شوند و کاربر متوجه تفکیک این دو بخش (داده های قدیمی، داده های جدید) نشود.

مایکروسافت در نسخه جدید اس کیو ال سرور یعنی SQL Server 2016‌ این امکان را به مجموعه امکانات خود اضافه کرده است و از سرویس ابری و آنلاین آژور Azure  برای ذخیره داده های قدیمی و از سیستم محلی کاربر برای داده های جدید استفاده می کند. نکته جالب ماجرا اینجاست که با فعال کردن این قابلیت که StretchDB نام دارد و ساخت یک حساب کاربری در سرویس ابری آژور، عملیات انتقال داده ها به سرور آژور به صورت خودکار توسط خود اسکیو ال سرور انجام میگیرد و بازیابی اطلاعات هم به صورت خودکار صورت می پذیرد.


منبع: سایت مهندسی داده

۲۳ آبان ۹۴ ، ۱۶:۳۱ ۰ نظر موافقین ۱ مخالفین ۰
حسن فتحی

یک گفت‌وگوی خواندنی با موسس تلگرام

ایتنا- دوروف: هر دولتی که بخواهد خود را دموکرات بنامد باید پذیرای اسنودن باشد و به او اجازه دهد در آن کشور زندگی کند.

ذهن‌های خلاق، حد و مرز و کشور نمی‌شناسند. تنها ویژگی مشترک افراد خلاق و کارآفرین، متفاوت بودن آنهاست. «پاول دوروف» نیز از این قاعده مستثنی نیست؛ مرد جوانی که در مدت کوتاهی در سراسر جهان مشهور شد و نامش در کنار غول‌های فناوری مانند «زاکربرگ» و «استیو جابز»، دیده می‌شود.

این مرد جوان اهل روسیه حرکات، فعالیت‌ها، عقاید و دلایلش برای انجام هر کاری نوعی معماست؛ معمایی که خبرنگار «فایننشال تایمز» سعی می‌کند از خلال گفت‌وگویی دوستانه هنگام ناهار خوردن در رستورانی شیک در لندن از آن رمزگشایی کند.

به گزارش ایتنا از ایسنا، در ادامه مطلب متن ترجمه‌شده گفت‌وگو با موسس شبکه اجتماعی محبوب «تلگرام» را می‌خوانید:

ادامه مطلب...
۱۲ مهر ۹۴ ، ۱۵:۱۷ ۱ نظر موافقین ۱ مخالفین ۰
حسن فتحی

دسته (Batch) در T-SQL

دسته (Batch):مجموعه ی از یک یا چند دستور T-SQL که همواره همراه با هم به سرور ارسال می شوند که هر دسته از دستورات با هم ترجمه و بدنبال هم اجرا میشوند. چنانچه یک دسته ،شامل چندین دستور باشد.

تمام مراحل بهینه سازی لازم روی مجموعه ی این دستورات انجام می شود و پلن اجرائی (Execution plan) بر مبنای مجموعه دستورات موجود در دسته ،تعیین می گردد.

چند نمونه از دسته ها
۱-  همه دستورات موجود در یک تریگر یک دسته محسوب می شود.
۲-رشته ای که توسط یک فرمان EXECUTE اجرا می شود، یک دسته محسوب می شود.
قواعد کار با دسته ها
دستور CREATE در هرجائی بجزء در اولین دستور یک دسته قرار می گیرد، همه دستوراتی که در یک دسته، پس از این دستور قرار می گیرند بعنوان بخشی از همان دستور در نظر گرفته میشوند.
اگر در یک دسته ، ساختار یک جدول تغییر داده شود ، نمی توان در همان دسته از ستونهای جدید استفاده کرد.
اگر دستور EXECUTE اولین دستور یک دسته باشد می توان از نوشتن کلمه کلیدی EXECUTE خود داری کرد.

 

 

چگونگی اجرای دسته ها 
در هر مرحله ارسال دسته ای از دستورات به سرور ،سروردر پنج مرحله  آنها را مورد بررسی و پردازش قرار می دهد که این مراحل به شرح زیر می باشد :

۱-تفکیک نگارشی: دستورات دریافتیاز نظر املا مورد بررسی قرار می گیرند.
۲- تفکیک ارجاعی: اشیاء مورد ارجاء بررسی می شوند تا از وجود آنها  و وجود مجوز دسترسی به آنها برای کاربر اطمینان حاصل شود.
۳- بهینه سازی : طرح اجرای مناسب برای رسیدن به سریعترین مسیر اجرای دستورات را پیدا می کند.
۴- ترجمه :طرح اجرایی ترجمه می شود.
۵- اجرا: طرح ترجمه شده توسط سرور اجرا می شود.

نکته پایانی
قرار دادن تعداد زیادتری دستور در یک دسته ،سرعت اجرای دستورات توسط سرور را افزایش می دهد . زیرا ضمن کاهش عملیات I/O امکان بهینه سازی یهتر نیز بوجود می آید.


منبع: nikamooz.com

۱۰ مهر ۹۴ ، ۱۵:۲۰ ۰ نظر موافقین ۱ مخالفین ۰
حسن فتحی

امکانات منحصر به فرد SQL Server در نسخه Enterprise

نسخه SQL Server Enterprise چند امکانات داخلی منصر به فرد دارد که توانایی بالا برای بازدهی سریع در سیستم هایی با تراکنشهای بالا و پردازشهای سنگین را دارد. به عنوان مثال سیستمهای «خرید آنلاین» یا «پایانه های فروش» یا سیستمهای گزارشگیری و آنالیزی مانند Credit Reference Information System برای بانکها و بیمه ها که این امکانات و قابلیتهای پنهان در SQL Server Standard Edition موجود نمی باشد.

متاسفانه مسعولان فروش در شرکت مایکروسافت ( به عنوان مثال مایکروسافت مالزی و سنگاپور) تماما در مورد امکانات ظاهری و کلی صحبت می کنند به عنوان مثال در نسخه Enterprise چند پردازنده قابل استفاده است و یا حداکثر حافظه و قابلیتهایی مانند Business Intelligence, High Availability و البته هزینه خرید هر لایسنس برای یک پردازنده فیزیکی ( قیمت هر لایسنس برای Enterprise حدود ۲۶ هزار دلار آمریکا است) اما متاسفانه در یک سوی قضیه مشتری است که هیچ دانشی از امکانات این نرم افزار ندارد و فقط دنبال این است که هزینه لایسنس ها را تا حداکثر پایین بیاورد ولی به چه قیمت ؟ به قیمت اینکه در تراکنشهای بالا سرعت بازدهی پایین آید و امکان از دست دادن مشتریان فراهم شود؟ (البته تمامی این مثالهای در ایران قابل اجرا نیست به هزار و یک دلیل)

داستان:
یک شرکت که خدمات خرید اینترنتی و دستگاه های پایانه فروش ارایه می دهد در سرور اصلی خود به دلیل پایین آوردن هزینه ها از SQL Server Standard Edition استفاده می کند. این شرکت برای بالا بردن کیفیت خدمات خود باید دارای سرور پایگاه داده قوی و پر سرعتی باشد که بتواند تمام نیازهای گزارش گیری در یک زمان را فراهم آورد. بعد از یک سال ارایه خدمات این شرکت دچار مشکلات بزرگی از قبیل حجم بالای پایگاه داده – سرعت بازدهی پایین – نداشتن توانایی آرشیو کردن میلیونها رکرورد در چند ثانیه  بدون هزینه یا وقت اضافی. به طور کلی تمامی این مشکلات با داشتن SQL Server Enterprise Edition بر طرف می شود. پس در نتیجه این شرکت نیاز به مشاوره قبل از خرید لایسنس را داشته ولی چه افسوس که برای این موضوع بسیار دیر است.
اگر SQL Server Enterprise گران است پس در مورد SQL Server Standard چه فکر می کنید؟(برای جواب به ادامه مطلب مراجعه کنید
ادامه مطلب...
۱۰ مهر ۹۴ ، ۱۴:۴۳ ۰ نظر موافقین ۱ مخالفین ۰
حسن فتحی

با یکی از باگ های ویندوز 10 آشنا شوید

اخیرا مایکروسافت یک بسته بروزرسانی مهمی برای ویندوز 10  منتشر کرده است که به این وسیله یکی از باگ هایی که کاربران مدام از ان شاکی بودند و شکایت داشتند رفع میشود در ادامه با جزئیات بیشتر در خدمت شما هستیم.

ادامه مطلب...
۳۰ مرداد ۹۴ ، ۱۳:۳۴ ۰ نظر موافقین ۰ مخالفین ۰
حسن فتحی

حقایقی جالب در مورد اینترنت اکسپلورر

مرورگر اینترنتی Internet Explorer مایکروسافت که روزگاری محبوبیت زیادی داشت این هفته ۲۰ ساله شد و این اتفاق در حالی صورت گرفت که مایکروسافت تصمیم خود را برای بازنشسته شدن آن نهایی کرد.

ادامه مطلب...
۳۰ مرداد ۹۴ ، ۱۳:۲۸ ۰ نظر موافقین ۰ مخالفین ۰
حسن فتحی

پایان عمر علم طراحی وب فرا رسیده است

ساختار و ظاهر وبسایت های جدید هیچکدام از یک الگوی نوین که از ذهنی خلاق تراوش کرده باشد پیروی نمیکنند. سراحی وبسایت های زیبا هم اکنون انجام اموری ساده و استفاده از قالب هایی که همگی از پیش طراحی شده اند ممکن شده است. تمامی این حقایق یک مسئله مهم و تا حدودی ناراحت کننده را مطرح میکنند: عمر علم طراحی وب هم اکنون به پایان رسیده است.

طراحی زیبا ترین وبسایت ها حتی از داخل یک دفتر کوچک و یا حتی از درون منزلتان هم ممکن است و این سبب کاهش مشاغل مرتبط این حوزه و اشباع شدن بازار طراحی وب در جهان شده است. حقیقت آنست که حتی اگر یک طراح زبده را به کار بگیرید به احتمال قریب به یقین طراحی که برای شما انجام خواهد داد بسیار شبیه به طراحی های از پیش انجام شده موجود در بازار خواهد بود حتی اگر وی از جایی الگو گیری نکرده باشد. علت اینست: دیگر الگوی جدیدی برای طراحی ظاهری وبسایت ها وجود ندارد.

علاوه بر اشباع بازار قالب ها و الگو های ظاهری برای وبسایت های مختلف، شاهد وجود بازار بزرگی از سیستم های مدیریت محتوا هستیم که انجام انتشار محتوا را بر هر بستری بسیار تسریع میکنند. حتی بزرگترین شرکت های انتشاراتی و روزنامه ها هم از سیستم های مدیریت محتوای (CMS / Content Management System) معروف مانند جوملا و وردپرس استفاده می کنند. هر کسی هم اکنون با داشتن دانش اندکی از علوم طراحی وب همچون php میتواند در یک اتاق کوچک یک فروشگاه برای طراح وبسایت های کوچک و حتی متوسط راه اندازی کند. البته به علت اشباع بازار این حوزه در صورتی که اسم و برندی از خود نداشته باشد حتی اگر دارای مهارت بالایی باشد پروژه های زیادی را پذیرا نخواهد بود.

حال سوال اینست که حوزه طراحی وب هم اکنون در چه زیر شاخه هایی نیاز به فعالیت بیشتر دارد، و یا با داشتن مهارت در چه حوزه ای در این بخش میتوان هنوز هم در آمد کسب کرد؟ پاسخ بسیار ساده است! طراحی وب ممکن است به بن بست رسیده باشد و نیاز به فعالان دیگری در این حوزه احساس نشود اما برنامه نویسی وب هنوز نیاز به کار بسیاری دارد. اگر دانش نسبتا کافی از طراحی وب و زبان های مطرح در این شاخه دارید سعی کنید بیشتر به سمت فعالیت در زمینه برنامه نویسی بروید. مهارت در برنامه نویسی در حوزه وب به معنی داشتن مهارت برای برنامه نویسی به زبان هایی چون php یا ASP است که به شما کمک میکند موتور عملیاتی یک سیستم مدیریت داده را طراحی کنید. سپس با این دانش خواهید توانست موتور هایی را بر پایه وب طراحی کنید که مهمترین امور اتوماسیون اداری شرکت ها را به انجام برساند. ضمن اینکه پیاده سازی هر اتوماسیونی بر بستر اینترنت به علت بر خط بودن و ساختار ابری در عصر کنونی خواهان بیشتری خواهد داشت و بازار عمده تری برای این نوع فعالیت ها وجود دارد.


منبع: بروزرسانی

۱۶ تیر ۹۴ ، ۱۷:۰۰ ۰ نظر موافقین ۰ مخالفین ۰
حسن فتحی

نحوه ایجاد Column Stored Index در SQL Server 2012

برای ایجاد Column Stored Index ابتدا باید فیلدهای شرکت کننده در ایندکس را تعیین و پس از آن ایندکس را ایجاد نمایید. مثال زیر نحوه انجام اینکار را نمایش می‌دهد.

۱- برای شروع کار یک جدول جدید ایجاد می‌کنیم. این جدول دارای یک Primary Key است که با استفاده از Clustered Index ایجاد شده است. بدلیل اینکه جداول شما از قبل وجود دارند ممکن است این مرحله جزء کار شما نباشد.

USE tempdb
GO
IF OBJECT_ID('Employees', 'U') IS NOT NULL
 DROP TABLE Employees
GO
CREATE TABLE Employees_ColumnBased
(
 Code INT IDENTITY CONSTRAINT PK_Code PRIMARY KEY,
 FirstName NVARCHAR(50),
 LastName NVARCHAR(80),
 HireDate SMALLDATETIME,
 City NVARCHAR(20)
)
GO
۲- در این مرحله تعدادی داده تستی در جدول درج می‌کنیم.

INSERT INTO Employees_ColumnBased (FirstName,LastName,HireDate,City) VALUES
 (N'مسعود',N'طاهری','۲۰۰۰-۰۱-۰۱',N'میانه'),
 (N'فرید',N'طاهری','۲۰۰۳-۰۱-۰۱',N'میانه'),
 (N'احمد',N'غفاری','۲۰۰۳-۰۱-۰۱',N'میانه'),
 (N'خدیجه',N'افروزنیا','۲۰۰۰-۰۱-۰۱',N'تهران'),
 (N'مجید',N'طاهری','۲۰۰۵-۰۱-۰۱',N'تهران')
GO
INSERT INTO Employees_ColumnBased (FirstName,LastName,HireDate,City)
 SELECT FirstName,LastName,HireDate,City FROM Employees_ColumnBased
GO 10
۳- در این مرحله یک Column Stored Index به ازای فیلدهای مورد نیاز ایجاد می‌کنیم. لازم به ذکر است در SQL Server 2012 این نوع ایندکس به شکل Non Clustered Column Stored Index می‌باشد.

CREATE NONCLUSTERED COLUMNSTORE INDEX IX_ColumnStore
 ON Employees_ColumnBased(FirstName,LastName,HireDate)
GO

نکته مهمی که باید در ایجاد این نوع از ایندکس‌ها در نظر گرفت این است که به دلیل افزایش Performance معمولاً در بیشتر مواقع این ایندکس‌ها با توجه به کوئری‌های شما ایجاد می‌گردند. بدین صورتکه

۱- لیست تمامی کوئری‌های پر استفاده به ازای جدول مورد نظر را استخراج نمایید.
۲- کلیه فیلدهای مربوط به مرحله اول را استخراج نمایید.
۳- در صورتیکه فیلدهای استخراج شده در مرحله دوم جزء فیلدهای قابل شرکت در Column Stored Index باشند در ایندکس مورد نظر شرکت نمایند.

۴- در صورتیکه بخواهید Column Stored Index را به صورت ویژوالی در Management Studio ایجاد کافی است مراحل زیر را انجام دهید.

ادامه مطلب...
۳۱ ارديبهشت ۹۴ ، ۲۲:۱۱ ۰ نظر موافقین ۰ مخالفین ۰
حسن فتحی