تبليغاتX
آموزش SQL و .Net
 

درس اول : آغاز كار با C#

 

در اين درس با ارائه چند برنامه و مثال ساده به طرز كار زبان C# مي‌پردازيم. اهداف اين درس عبارتند از :

  • فهم ساختار پايه‌اي يك برنامه C#
  • آشنايي با Namespace
  • آشنايي با كلاس (Class)
  • آشنايي با عملكرد متد Main()
  • آشنايي با ورودي/خروجي يا I/O

 

ليست 1-1، يك برنامة ساده با عنوان Welcome در زبان C#

// Namespace اعلان

using  System;

 

// كلاس آغازين برنامه

class WelcomeCSS

  {

   // آغاز كار اجراي برنامه

   public static void Main()

    {

     // نوشتن متن در خروجي

     Console.WriteLine("Welcome to the C# Persian Tutorial!");

    }

  }

برنامة ليست 1-1 داراي 4 پارامتر اصلي است، اعلان Namespace، كلاس، متد Main() و يك دستور زبان C#.

در همين جا بايد به يك نكته اشاره كنم، براي زبان C# همانند بيشتر زبانهاي برنامه‌سازي دو نوع كامپايلر وجود دارد. يك نوع كامپايلر كه به كامپايلر Command Line معروف است و نوع ديگر كامپايلر Visual است. كامپايلر‌هاي Command Line محيطي شبيه به محيط DOS دارند و با دادن يك سري دستورات به اجرا در مي‌آيند. كامپايلرهاي Visual محيطي همانند ويندوز دارند كه با دارا بودن محيط گرافيكي و ابزارهاي خاص، برنامه‌نويس را در امر برنامه‌سازي كمك مي‌كنند. از نمونه‌هاي هر يك از كامپايلرها، مي‌توان به Microsoft C# Command Line Compiler كه يك كامپايلر Command Line و Microsoft Visual C# كه يك كامپايلر Visual است، اشاره كرد. البته در حال حاضر بيشتر از كامپايلرهاي ويژوال استفاده مي‌شود.

من سعي مي‌كنم در آينده به توضيح محيط Visual C# و Visual Studio.Net بپردازم. اما فعلاً براي اجراي برنامه‌ها مي‌توانيد از Visual Studio.Net استفاده كنيد. پس از نصب آن، وارد محيط C# شده و در قسمت انتخاب برنامة جديد گزينة Console را جهت اجراي برنامه‌ها انتخاب نماييد.

براي اين درس، فعلاً به توضيحات بيشتر دربارة محيط ويژوال نمي‌پردازم اما در آينده به توضيح كامل محيط Visual Studio.Net خواهم پرداخت.

براي اجراي كد بالا در صورتيكه از محيط ويژوال استفاده مي‌كنيد بايد بر روي دكمة Run كليك كنيد و در صورتيكه كامپايلر Command Line داريد با دستور  زير مي‌توانيد برنامه را اجرا كنيد : csc Welcome.cs

پس از اجراي برنامه، كامپايلر براي شما يك فايل قابل اجرا(Executable) تحت نام Welcome.exe توليد مي‌كند.

نكته : در صورتيكه از Visual Studio.Net(VS.Net) استفاده كنيد، پس از اجراي برنامه، يك صفحه براي نمايش خروجي به سرعت باز شده و بسته مي‌شود و شما قادر به ديدن خروخي نخواهيد بود. براي اينكه بتوانيد خروجي برنامه را ببينيد، در انتهاي برنامه دستور زير را وارد نماييد :

Console.ReadLine();

 استفاده از اين دستور باعث مي‌شود تا برنامه منتظر دريافت يك ورودي از كاربر بماند، كه در اين حالت شما مي‌توانيد خروجي برنامه خود را ديده و سپس با زدن كليد Enter برنامه را خاتمه دهيد.

 

نكتة ديگري كه در مورد زبان برنامه‌نويسي C# بايد مورد توجه قرار دهيد اينست كه اين زبان Case Sensitive است، بدين معنا كه به حروف كوچك و بزرگ حساس است يعني براي مثال ReadLine با readLine متفاوت است به طوريكه اولي جزو دستورات زبان C# و دومي به عنوان يك نام براي متغير يا يك تابع كه از طرف كاربر تعريف شده است در نظر گرفته مي‌شود.

 

اعلان Namespace به سيستم اعلان مي‌نمايد كه شما از توابع كتابخانه‌اي  System  جهت اجراي برنامه‌ها خود استفاده مي‌نماييد. دستوراتي مانند WriteLine و ReadLine جزو توابع كتابخانه‌اي System مي‌باشند. اغلب دستورات و توابع مهم و كليدي استفاده از كنسول ورودي/خروجي در اين كتابخانه مي‌باشد. در صورتيكه در ابتداي برنامه از using System استفاده نكنيد، يابد در ابتداي هر يك از دستورات برنامه كه مربوط اين كتابخانه است، از كلمة System استفاده نماييد. بعنوان مثال در صورت عدم استفاده از using System بايد از دستور System.Console.WriteLine() به جاي Console.WriteLine() استفاده نماييد.

 

تعريف كلاس،Class Welcome CSS، شامل تعريف داده‌ها(متغيرها) و متدها جهت اجراي برنامه است. يك كلاس، جزو معدود عناصر زبان C# است كه بوسيلة آن مي‌توان به ايجاد يك شي (Object) از قبيل واسط‌ ها (Interfaces) و ساختارها(Structures)، پرداخت. توضيحات بيشتر در اين زمينه در درس‌هاي آينده ذكر مي‌شوند. در اين برنامه كلاس هيچ داده‌ و متغيري ندارد و تنها شامل يك متد است. اين متد، رفتار(Behavior) اين كلاس را مشخص مي‌كند.

 

متد درون اين كلاس بيان مي‌كند كه اين كلاس چه كاري را پس از اجرا شدن انجام خواهد داد. كلمة كليدي Main() كه نام متد اين كلاس نيز مي‌باشد جزو كلمات رزرو شده زبان C# است كه مشخص مي‌كند برنامه از كجا بايد آغاز به كار نمايد. وجود متد Main() در تمامي برنامه‌هاي اجرايي ضروري است. در صورتيكه يك برنامه حاوي متد Main() نباشد بعنوان توابع سيستمي همانند dll هاي ويندوز در نظر گرفته مي‌شود.

قبل از كلمة Main() كلمه ديگري با عنوان static آورده شده است. اين كلمه در اصطلاح Modifier مي‌گويند. استفاده از static براي متد Main() بيان مي‌دارد كه اين متد تنها در در همين كلاس قابل اجراست و هيچ نمونه‌اي (Instance) ديگري از روي آن قابل اجرا نمي‌باشد. استفاده از static براي متد Main() الزامي است زيرا در ابتداي آغاز برنامه هيچ نمونه‌اي از هيچ كلاس و شي‌اي موجود نمي‌باشد و تنها متد Main() است كه اجرا مي‌شود. (در صورتيكه با برخي اصطلاحات اين متن از قبيل كلاس، شي، متد و نمونه آشنايي نداريد، اين به دليل آنست كه اين مفاهيم جزو مفاهيم اولية برنامه‌نويسي شي‌گرا (OOP) هستند. سعي مي‌كنم در درس‌هاي آينده به توضيح اين مفاهيم نيز بپردازم، ولي فعلاً در همين حد كافي مي‌باشد.)

 

هر متد بايد داراي يك مقدار بازگشتي باشد، يعني بايد مقداري را به سيستم بازگرداند، در اين مثال نوع بازگشتي void تعزيف شده است كه نشان دهنده آنست كه اين متد هيچ مقداري را باز نمي‌گرداند يا به عبارت بهتر خروجي ندارد. همچنين هر متد مي‌تواند داراي پارامترهايي نيز باشد كه ليست پارامترهاي آن در داخل پرانتزهاي جلوي آن قرار مي‌گيرد. براي سادگي كار در اين برنامه متد ما داراي هيچ پارامتري نيست ولي در ادامة همين درس به معرفي پارامترها نيز مي‌پردازم.

 

متد Main() رفتار و عمل خود را بوسيله Console.WriteLine(…) مشخص مي‌نمايد. Console كلاسي در System است و WriteLine() متدي در كلاس  Console. در زبان C# از اپراتور "." (نقطه dot) جهت جداسازي زيرروتين‌ها و زيرقسمتها استفاده مي‌كنيم. همانطور كه ملاحظه مي‌كنيد چون WriteLine() يك متد درون كلاس Console است به همين جهت از "." جهت جداسازي آن استفاده كرده‌ايم.

 

در زبان ‍C#، براي قرار دادن توضيحات در كد برنامه از // استفاده مي‌كنيم. بدين معنا كه كامپايلر در هنگام اجراي برنامه توجهي به اين توضيحات نمي‌كند و اين توضيحات تنها به منظور بالا بردن خوانايي متن و جهت و كمك به فهم بهتر برنامه قرار مي‌گيرند. استفاده از // تنها در مواردي كاربرد دارد كه توضيحات شما بيش از يك خط نباشد. در صورت تمايل براي استفاده از توضيحات چند خطي بايد در ابتداي شروع توضيحات از /* و در انتها آن از */ استفاده نماييد. در اين حالت تمامي مطالبي كه بين /*  */ قرار مي‌گيرند به عنوان توضيحات (Comments) در نظر گرفته مي‌شوند.

 

تمامي دستورات (Statements) با ";"، سمي كولون، پايان مي‌يابند. كلاس‌ها و متد‌ها با } آغاز شده و با { خاتمه مي‌يابند. تمامي دستورات بين { } يك بلوك را مي‌سازند.

 

بسياري از برنامه‌ها از كاربر ورودي دريافت مي‌كنند. انواع گوناگوني از اين ورودي‌ها مي‌توانند به عنوان پارامتري براي متد Main() در نظر گرفته شوند. ليست 2-1 برنامه‌اي را نشان مي‌دهد نام كاربر را از ورودي دريافت كرده و آن را بر روي صفحه نمايش مي‌دهد. اين ورودي به صورت پارامتري براي متد Main() در نظر گرفته شده است.

 

ليست 2-1 : برنامه‌اي كه ورودي را از كاربر، بعنوان پارامتر Main()، دريافت مي‌كند.

// Namespace اعلان

using System;

// كلاس آغازين برنامه

class NamedWelcome

  {

   // آغاز اجرا برنامه

   public static void Main(string[] args)

     {

      // نمايش بر روي صفحه

      Console.WriteLine("Hello, {0}!", args[0]);

      Console.WriteLine("Welcome to the C# Persian Tutorial!");

     }

  }

توجه داشته باشيد كه اين برنامه، ورودي را به صورت Command-Line دريافت مي‌كند و در هنگام اجراي برنامه بايد ورودي را در Command-Line وارد نماييد. در صورتيكه ورودي را وارد ننماييد برنامه دچار مشكل شده و متوقف خواهد شد.

 

همان طور كه در ليست 2-1 مشاهده مي‌نماييد، پارامتر متد Main() با عنوان args مشخص شده است. با استفاده از اين نام در داخل متد مي‌توان آن استفاده نمود. نوع اين پارامتر از نوع آرايه‌اي از نوع رشته (string[]) در نظر گرفته شده است. انواع(types) و آرايه‌ها را در درس‌هاي بعدي بررسي مي‌كنيم. فعلاً بدانيد كه آرايه رشته‌اي جهت نگهداري چندين كاراكتر مورد استفاده قرار مي‌گيرد. [] مشخص كننده آرايه هستند كه مانند يك ليست عمل مي‌كند.

 

همانطور كه ملاحظه مي‌كنيد در اين برنامه دو دستور Console.WriteLine(…) وجود دارد كه اولين دستور مقداري با دستور دوم متفاوت است. همانطور كه مشاهده مي‌كنيد داخل دستور Console.WriteLine(…) عبارتي به شكل {0} وجود دارد. اين آرگومان، نشان مي‌دهد كه به جاي آن چه مقداري بايد نمايش داده شود كه در اين جا args[0] نشان داده مي‌شود. عبارتي كه داخل " " قرار دارد عيناً در خروجي نمايش داده مي‌شود، به جاي آرگومان {0}، مقداري كه پس از " قرار دارد، قرار مي‌گيرد. حال به آرگومان بعدي يعني args[0] توجه كنيد. مقدار صفر داخل [] نشان مي‌دهد كه كدام عنصر از آرايه مورد استفاده است. در C# انديس آرايه از صفر شروع مي‌شود به همين جهت براي دسترسي به اولين عنصر آرايه بايد از انديس صفر استفاده كنيم.(همانطور كه قبلاً نيز كفتم آرايه‌ها را در درس‌هاي آينده توضيح خواهم داد، هدف از اين درس تنها آشنايي با C# است.!)

 

مجدداً به آرگومان {0} بازگرديم. اين آرگومان نشان مي دهد كه يك مقدار بايد در رشته خروجي قرار گيرد، اين مقدار همان args[0]  است. اگر شما اين برنامه را از طريق Command-Line اجرا نماييد خروجي شبيه به زير خواهيد گرفت :

>Hello!, Meysam!

>Welcome to C# Persian Tutorial!

همان گونه كه مي‌بينيد، پس از اجراي برنامه نام شما كه از طريق Command-Line آنرا وارد نموده‌ايد در خروجي ظاهر مي‌شود. استفاده از آرگومان {n}، كه در آن n يك مقدار عددي است، جهت فرمت دادن به متن خروجي است كه بر روي صفحه به نمايش در مي‌آيد. مقدار n از صفر آغاز شده و به ترتيب افزايش مي‌بايد. به مثال زير توجه كنيد :

Console.WriteLine("Hello! ,{0} ,{1}, {2}",args[0],args[1],args[2]);

اين خط از برنامه سه مقدار args[0],args[1],args[2] را در خروجي به ترتيب نمايش مي‌دهد. ملاحظه مي‌نماييد كه چون 3 مقدار را مي‌خواهيم نمايش دهيم، سه بار از آرگومان {n} استفاده كرده‌ايم و هر بار يك واحد به مقدار قبلي افزوده‌ايم. در آينده بيشتر با اين مفاهيم آشنا مي‌شويم.

 

مطلبي كه بايد در مورد ليست 2-1 به آن توجه شود آنست كه اين برنامه تنها از طريق  Command-Lineقابل اجراست و در صورتيكه كاربر از اين مطلب كه برنامه بايد داراي ورودي به صورت Command-Line باشد، بي اطلاع باشد و ورودي را در Command-Line وارد نكند، برنامه متوقف شده و اجرا نمي‌شود. پس براي رفع چنين مشكلي بايد از روش بهتري جهت دريافت ورودي از كاربر استفاده كرد.

 

ليست 3-1 : يك برنامه كه قابليت محاوره با كاربر را دارد.

// Namespace اعلان

using System;

 

// كلاس آغازين برنامه

class InteractiveWelcome

  {

   //آغاز اجراي برنامه

   public static void Main()

    {

     // متني بر روي صفحه نمايش داده مي‌شود

     Console.Write("What is your name?: ");

     //متني نمايش داده شده و برنامه منتظر دريافت ورودي مي‌ماند

     Console.Write("Hello, {0}! ", Console.ReadLine());

     Console.WriteLine("Welcome to the C# Persian Tutorial!");

    }

  }

همانطوريكه در اين برنامه ديده مي شود، متد Main() داراي پارامتر نيست. در عوض يك خط به متن برنامه ليست 2-1 اضافه شده است. در اولين خط از اين برنامه، متني با عنوان اينكه نام شما چيست؟ بر روي صفحه ظاهر مي‌شود. سپس در خط بعدي پس از نوشتن كلمه Hello, ، برنامه منتظر دريافت ورودي از كاربر مي‌شود. بدين معني كه اين بار تا زمانيكه كاربر متني را به عنوان نام خود وارد نكند اجراي برنامه به پيش نخواهد رفت و خط بعدي اجرا نمي‌شود. اين برنامه روش ايجاد ارتباط از طريق برنامه با كاربر را نمايش مي‌دهد. در اين مثال كاربر دقيقاً متوجه مي‌شود كه چه زماني بايد اطلاعات را وارد نمايد و اين اطلاعات چه بايد باشد در حاليكه در مثال قبل چنين نبود. همانگونه كه مي‌بينيد در اين برنامه آرگومان {0} مستقيماً از طريق دستور Console.ReadLine() دريافت مي‌شود و بلافاصله در خروجي نمايش داده مي‌شود. دستور ReadLine() نيز يكي از متدهاي كلاس Console است كه بوسيله آن رشته ورودي خوانده مي‌شود.

خروجي برنامه فوق به شكل زير است :

What is your name?:

(سپس برنامه منتظر دريافت متني از ورودي توسط كاربر مي‌ماند)

(پس از اينكه كاربر رشته‌اي را وارد كرد و كليدEnter را فشار داد، متن زير نمايش داده مي‌شود.)

Hello, Meysam!

(سپس اجراي برنامه به دستور بعدي منتقل مي‌شود)

Welcome to the C# Persian Tutorial!

 

خروجي كامل برنامه :

What is your name?:

Hello, Meysam! Welcome to the C# Persian Tutorial!

توجه كنيد كه ReadLine() به عنوان يك متد، مقداري را به سيستم بازمي‌گرداند. اين مقدار در اين برنامه به آرگومان {0} برگردانده مي‌شود. اين خط از برنامه را مي‌توان طور ديگري هم نوشت :

string myName=Console.ReadLine();

Console.WriteLine("Hello, {0}!",myName);

 

در اين حالت ما يك متغير از نوع رشته با نام myName تعريف كرده‌ايم كه مقدار ورودي در آن ذخيره مي‌شود و سپس از اين مقدار به عنوان مقداري‌ كه {0} مي‌پذيرد استفاده كرده‌ايم.

 

در اين درس آموختيد كه ساختار كلي يك برنامه C# چگونه است. هر برنامه C# از يك كلاس اصلي تشكيل مي‌شود كه اين كلاس شامل داده‌ها و متغيرها و متدهايي مي‌باشد. متد آغازين برنامه كه برنامه با آن شروع به اجرا مي‌كند، متد Main() است. با استفاده از توابع كتابخانه‌اي مي‌نوان به كلاسها و متدهاي C# دسترسي پيدا كرد. از جمله اين توابع System بود كه يكي از كلاسهاي آن Console و چند متد اين كلاس،  متدهاي WriteLine() و ReadLine() بودند.

نویسنده : میثم قزوینی

+ نوشته شده در دوشنبه دوم مهر 1386ساعت 10:39 توسط کامران رخشانی |

10 عملي که يک DBA نبايد هرگز انجام دهد


منبع : سایت Http://www.SQLIran.com

بر عهده داشتن وظيفه راهبري پايگاه داده، حتي در محیط های برنامه نویسی، همیشه خطیر بوده و از اهمیت بسیار بالایی برخوردار است، به طوری که حتی اشتباهاتی کوچک از جانب یک DBA می تواند موجب بروز اشکالاتی در عملکرد کلی سیستم ها گردد. اگر قصد دارید به عنوان یک DBA مشغول به کار شوید، پس در نظر گرفتن موارد زیر در سمت کاری آینده شما بسیار تاثیر گذار است. در صورتی هم که در حال حاضر در این سمت مشغول به کار می باشید، باز هم این امکان وجود دارد که تا به حال به بعضی از موارد زیر توجه نکرده باشید.

     

با تجربیاتی که در مدت هفت سال کار با SQL Server کسب کرده ام، ده موردی که در این مقاله ذکر می کنم ، کارهایی هستند که احساس می کنم یک راهبر پایگاه داده (DBA ) نباید هرگز انجام دهد.
بر عهده داشتن وظیفه راهبری پایگاه داده، حتی در محیط های برنامه نویسی، همیشه خطیر بوده و از اهمیت بسیار بالایی برخوردار است، به طوری که حتی اشتباهاتی کوچک از جانب یک DBA می تواند موجب بروز اشکالاتی در عملکرد کلی سیستم ها گردد. اگر قصد دارید به عنوان یک DBA مشغول به کار شوید، پس در نظر گرفتن موارد زیر در سمت کاری آینده شما بسیار تاثیر گذار است. در صورتی هم که در حال حاضر در این سمت مشغول به کار می باشید، باز هم این امکان وجود دارد که تا به حال به بعضی از موارد زیر توجه نکرده باشید:

1. Rebuild کردن Index در ساعات کاری

این عمل موجب افزایش چشم گیر I/O دیسک می شود. بهتر است این عمل بعدازظهر یا در طول شب ( زمانی که فعالیت کاربران به حداقل می رسد ) انجام شود.لازم به ذکر است که می توانید از سرویس Agent job جهت برنامه ریزی انجام خودکار این عملیات استفاده کنید.

2. Stop کردن Database بدون اطلاع رسانی قبلی

چرا؟!... تعداد زیادی کاربر که نمی توانند با برنامه خود کار کنند ... تلفن شما هم تا زمان راه اندازی مجدد Database از زنگ زدن دست بر نمی دارد.

3. نصب Service Pack در ساعات کاری

نصب سرویس پک، موجب Stop و Start های متعدد پایگاه داده می شود. توصیه می کنم این کار را نیز در ساعات کاری شرکت یا سازمان خود انجام ندهید. چون با این کار کاربران بسیاری را دلخور می کنید.

4. اجرای Query های تستی بر روی سرور اصلی

اگر این کار را انجام می دهید پس حتما نمی دانید که این Query ها به چه میزان منابع Server را به خود اختصاص می دهند.

5. Defragment کردن درایوهایی که فایل های دیتابیس روی آن قرار دارند

آیا تا به حال این کار را روی کامپیوتر شخصی خود انجام داده اید؟! پس حتما متوجه اید که چرا نباید این کار را روی سرور شرکت یا سازمان خود در ساعات کاری انجام دهید!!

6. بداخلاقی با برنامه نویسان

سعی کنید منطق دستورات خود را به آن ها توضیح دهید. بهتر است همیشه صبور باشید و تلاش کنید در حین ارجاع کار به آن ها دانش خود را نیز به آن ها منتقل کنید. نتیجه کار مستقیما به کار گروهی شما بستگی دارد.

7. پشتیبان گیری در ساعات کاری

این موضوع هم به I/O دیسک سرور مربوط می شود. اگر مجبور هستید این کار را در طول روز و در ساعات کاری انجام دهید، پس به گزینه هایی مانند differential Backups یا Transactional log Backups توجه کنید، این نوع پشتیبان گیری ها بسیار سریعتر صورت می پذیرد.

8. نصب Update های نرم افزاری قبل از تست و پشتیبان گیری

ممکن است نرم افزار های جانبی بر روی سرور پایگاه داده شما نصب شده باشد. نصب نرم افزار و یا نصب Update های نرم افزاری حتما باید با توجه ویژه و تست قبلی صورت پذیرد. تولید کنندگان نرم افزار ممکن است نتوانند صحت عمکرد نرم افزار خود را بر روی سخت افزار و شرایط مختلف بررسی کنند. قبل از اعمال هر تغییری در نرم افزارهای سرور از دیتابیس خود Backup بگیرید.

9. ایمن نکردن SQL Server

غالبا DBA ها فکر می کنند که سرورهایشان از امنیت بالایی برخوردار است!! آیا شما هم این طور فکر می کنید؟!
بهتر است برنامه Microsoft Baseline Security Analyzer را بر روی سرور خود اجرا کنید. شاید از مشاهده نتیجه آن تعجب کنید.

10. اجرای دستور Drop قبل از اطمینان کامل

قبل از اینکه دکمه Enter را فشار دهید خوب فکر کنید، اجرای این دستور با سهل انگاری ممکن است موجب اخراج بلادرنگ شما شود!




بر عهده داشتن وظيفه راهبري پايگاه داده، حتي در محیط های برنامه نویسی، همیشه خطیر بوده و از اهمیت بسیار بالایی برخوردار است، به طوری که حتی اشتباهاتی کوچک از جانب یک DBA می تواند موجب بروز اشکالاتی در عملکرد کلی سیستم ها گردد. اگر قصد دارید به عنوان یک DBA مشغول به کار شوید، پس در نظر گرفتن موارد زیر در سمت کاری آینده شما بسیار تاثیر گذار است. در صورتی هم که در حال حاضر در این سمت مشغول به کار می باشید، باز هم این امکان وجود دارد که تا به حال به بعضی از موارد زیر توجه نکرده باشید.

     

با تجربیاتی که در مدت هفت سال کار با SQL Server کسب کرده ام، ده موردی که در این مقاله ذکر می کنم ، کارهایی هستند که احساس می کنم یک راهبر پایگاه داده (DBA ) نباید هرگز انجام دهد.
بر عهده داشتن وظیفه راهبری پایگاه داده، حتی در محیط های برنامه نویسی، همیشه خطیر بوده و از اهمیت بسیار بالایی برخوردار است، به طوری که حتی اشتباهاتی کوچک از جانب یک DBA می تواند موجب بروز اشکالاتی در عملکرد کلی سیستم ها گردد. اگر قصد دارید به عنوان یک DBA مشغول به کار شوید، پس در نظر گرفتن موارد زیر در سمت کاری آینده شما بسیار تاثیر گذار است. در صورتی هم که در حال حاضر در این سمت مشغول به کار می باشید، باز هم این امکان وجود دارد که تا به حال به بعضی از موارد زیر توجه نکرده باشید:

1. Rebuild کردن Index در ساعات کاری

این عمل موجب افزایش چشم گیر I/O دیسک می شود. بهتر است این عمل بعدازظهر یا در طول شب ( زمانی که فعالیت کاربران به حداقل می رسد ) انجام شود.لازم به ذکر است که می توانید از سرویس Agent job جهت برنامه ریزی انجام خودکار این عملیات استفاده کنید.

2. Stop کردن Database بدون اطلاع رسانی قبلی

چرا؟!... تعداد زیادی کاربر که نمی توانند با برنامه خود کار کنند ... تلفن شما هم تا زمان راه اندازی مجدد Database از زنگ زدن دست بر نمی دارد.

3. نصب Service Pack در ساعات کاری

نصب سرویس پک، موجب Stop و Start های متعدد پایگاه داده می شود. توصیه می کنم این کار را نیز در ساعات کاری شرکت یا سازمان خود انجام ندهید. چون با این کار کاربران بسیاری را دلخور می کنید.

4. اجرای Query های تستی بر روی سرور اصلی

اگر این کار را انجام می دهید پس حتما نمی دانید که این Query ها به چه میزان منابع Server را به خود اختصاص می دهند.

5. Defragment کردن درایوهایی که فایل های دیتابیس روی آن قرار دارند

آیا تا به حال این کار را روی کامپیوتر شخصی خود انجام داده اید؟! پس حتما متوجه اید که چرا نباید این کار را روی سرور شرکت یا سازمان خود در ساعات کاری انجام دهید!!

6. بداخلاقی با برنامه نویسان

سعی کنید منطق دستورات خود را به آن ها توضیح دهید. بهتر است همیشه صبور باشید و تلاش کنید در حین ارجاع کار به آن ها دانش خود را نیز به آن ها منتقل کنید. نتیجه کار مستقیما به کار گروهی شما بستگی دارد.

7. پشتیبان گیری در ساعات کاری

این موضوع هم به I/O دیسک سرور مربوط می شود. اگر مجبور هستید این کار را در طول روز و در ساعات کاری انجام دهید، پس به گزینه هایی مانند differential Backups یا Transactional log Backups توجه کنید، این نوع پشتیبان گیری ها بسیار سریعتر صورت می پذیرد.

8. نصب Update های نرم افزاری قبل از تست و پشتیبان گیری

ممکن است نرم افزار های جانبی بر روی سرور پایگاه داده شما نصب شده باشد. نصب نرم افزار و یا نصب Update های نرم افزاری حتما باید با توجه ویژه و تست قبلی صورت پذیرد. تولید کنندگان نرم افزار ممکن است نتوانند صحت عمکرد نرم افزار خود را بر روی سخت افزار و شرایط مختلف بررسی کنند. قبل از اعمال هر تغییری در نرم افزارهای سرور از دیتابیس خود Backup بگیرید.

9. ایمن نکردن SQL Server

غالبا DBA ها فکر می کنند که سرورهایشان از امنیت بالایی برخوردار است!! آیا شما هم این طور فکر می کنید؟!
بهتر است برنامه Microsoft Baseline Security Analyzer را بر روی سرور خود اجرا کنید. شاید از مشاهده نتیجه آن تعجب کنید.

10. اجرای دستور Drop قبل از اطمینان کامل

قبل از اینکه دکمه Enter را فشار دهید خوب فکر کنید، اجرای این دستور با سهل انگاری ممکن است موجب اخراج بلادرنگ شما شود!


+ نوشته شده در شنبه بیست و چهارم شهریور 1386ساعت 17:52 توسط کامران رخشانی |

SQL Server و تکنيک هايي براي افزایش بازده بانک اطلاعاتی

منبع :سایت تخصصی پایگاه داده ها  Http://www.SQLIran.com
استفاده از راهکارهايي چون افزایش تعداد سرورها یا ارتقای سرورهای موجود در پردازنده قدرتمندتر، حافظه بیشتر، هارددیسک های سریع تر و حتی ارتقای ارتباطات شبکه ای یا امثال آن از جمله ترفند هایی هستند که برای رفع معضل سرعت، مورداستفاده قرار می گیرند. در این مقاله به یکی از روش های توسعه طولی، نگاهی می افکنیم.

     

ممکن است پس از طی چند سال و درج هزاران رکورد در جداول یک بانک اطلاعاتی، سرعت جستجو در میان اطلاعات درج شده،سرعت درج اطلاعات جدید یا تغییر و حذف آن ها کند شود و مدیران یا برنامه نویسان این بانک ها را به ایجاد دگرگونی در برخی قسمت های بانک ناچار نماید.دو روش معمول برای مواجهه با چنین پدیده ای وجود دارد: روش اول یعنی توسعه عرضی ( Scale up ) که ترجیحا باید مقدم بر روش دوم مورد استفاده قرار گیرد، با استفاده از ساز وکار هایی مثل ایجاد انواع ایندکس ها بر روی جداول یا دید ( view )های بانک، کوتاه نمودن و کم حجم تر کردن تریگرها، به حداقل رساندن تعداد دستورات SQL که در هر فرایند وجود دارد، پرهیز از استفاده بی موقع و مکرر از توابع تعریف شده توسط کاربر و غیره می توان تا حدودی مشکل را برطرف نمود. اما در برخی موارد با تمام این تمهیدات باز هم اشکالات و وقفه هایی در سرعت و عملکرد سیستم، مدیران بانک های اطلاعاتی را ناگزیر می کند برای حل مشکل به روش دوم یعنی توسعه طولی ( Scale out ) رو بیاورند.

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

صورت مسئله

فرض کنید شما دارای یک بانک اطلاعاتی در حال کار، روی یک سرور هستید و در طول روز حدود پانصد کاربر به طور متناوب مشغول کار با این بانک هستند. کاملا آشکار است که هر چه سعی کنید با استفاده از سازوکارهای توسعه عرضی ( مثل ایندکس گذاری و امثال آن )، سرعت و کارایی سیستم را افزایش دهید، باز هم برای ارائه گزارش های مطلوب و استاندارد و حتی برای ایجاد یک محیط کارا و کاربرپسند برای استفاده از آن، مجبور می شوید برای اتفاقاتی که ممکن است در اثر ترافیک سنگین عملیات کاربران اتفاق بیفتد، فکر دیگری بکنید. یعنی حتی اگر سرور شما یک کامپیوتر قدرتمند با دو پردازنده Xeon، چهار گیگابایت حافظه و یک هارددیسک سریع باشد، باز هم قطعا در پاره ای از اوقات تصادم انبوه درخواست های موردنیاز کاربران در یک زمان، باعث بروز مسائلی چون قفل شدن برخی رکوردهای بانک (locking ) یا مسدود شدن برخی درخواست ها به دلیل عدم وجود زمان کافی برای پردازش آن ( Timeout Blocking ) می شود.

انتخاب راه حل

راه حل مسئله با استفاده از روش توسعه طولی، افزودن به تعداد سرورهایی است که به شکلی نقش پردازشگر اطلاعات را بازی می کنند. در این روش، سه راه حل مختلف وجود دارد که با اتکا به آن ها می توان تعداد سرورها، سرورهای لایه واسط (Application Server ) و سرورهای بانک اطلاعاتی (Database Server ) را افزایش داد. با این کار ترافیک و سنگینی پردازش فقط روی سرور لایه واسط یا سرور بانک اطلاعاتی کاهش می یابد و به نحوی پدیده توازن بار (Load Balancing ) چند سرور صورت می گیرد. در ادامه به بررسی هر سه راه حل مذکور می پردازیم.

راه حل یکم: کپی برداری (Cloning )

در این راه حل به سادگی می توان به جای استفاده از یک سرور لایه واسط که نقش پردازش اطلاعات را بازی می کند، از چندین سرور برای انجام دادن عمل مذکور استفاده نمود. سرورهای لایه واسط عمدتا محل فعالیت کامپوننت ها ( COM) یا وب سرورها هستند. بنابراین اگر بتوان تعداد آن ها را افزایش داد و هر دسته از کاربران را به سمت یکی از این سرورها هدایت نمود، عملکرد پردازشی سرورهای لایه واسط افزایش می یابد و در نتیجه تا حدود زیادی از بروز سرعت در سیستم جلوگیری می شود. ضمن این که اگر هر کدام از این سرورها نیز با مشکل روبه رو شوند، می توان به صورت موقت کاربران آن را به سمت یک سرور دیگر هدایت کرد و از ایجاد وقفه در کار آن ها جلوگیری نمود. ( شکل 1 )


 

شکل 1

راه حل دوم: تقسیم بندی(Partitioning )

این راه حل به دو روش تقسیم می شود:

روش یکم: افزایش سرورهای لایه واسط

در این روش نیز تعداد سرورهای لایه واسط افزایش می یابد. اما بر خلاف راه حل قبل که چند سرور کاملا مشابه، نقش یکسانی را در پردازش درخواست های کاربران ایفا می کردند، این بار هر کدام از سرورهای لایه میانی صرفا عمل خاصی را انجام می دهند که سایر سرورها از انجام دادن آن معافند. مثلا اگر قبلا تنها یک سرور، هم محل فعالیت COM ها بود و هم نقش یک وب سرور را بازی می کرد، اکنون دو وظیفه مذکور را بین دو سرور مختلف ( و شاید با ویژگی ها و توانایی های مختلف ) تقسیم می کنیم. یا به عنوان مثالی دیگر اگر تا کنون تنها یک سرور لایه میانی هم شامل COM هایی بود که با استفاده از اشیای ADO ، دسترسی به سرور پایگاه را فراهم می آوردند و هم شامل COM های دیگری که اعمال محاسباتی پیچیده را انجام می داد، اکنون می توان این دو وظیفه را بین دو سرور مختلف به ترتیب با نام هایی چون Data Access و Business Logic تقسیم کرد.
نقطه قوت این روش این است که علاوه بر تقسیم ترافیک و پردازش میان دو یا چند سرور جداگانه، امکان جداسازی کاربران بر اساس نوع استفاده آن ها از اطلاعات و فراهم ساختن سرورهایی با کاربرد مختلف جهت انجام دادن وظایف متعدد وجود دارد و در نتیجه ضریب امنیت دسترسی یا پردازش اطلاعات نیز بالاتر می رود. نقطه ضعف آن هم این است که در صورت از کار افتادن یکی از این سرورهای لایه میانی، سایر سرورهای این لایه نمی توانند به سرعت جایگزین آن شوند و وظیفه آن را به طور موقع بر عهده بگیرند. ( شکل 2 )


شکل 2

روش دوم :تقسیم سرور پایگاه داده

در این روش، به جای سرورهای لایه میانی، سرور پایگاه داده به دو یا چند سرور تقسیم می شود تا حجم فرایند ( Transaction) های داخلی و پرس و جو های همزمان روی آن سرور کاهش پیدا کند. برای استفاده از این روش، در نظر گرفتن یک نکته اساسی، بسیار مهم است. این نکته، تشخیص اشتراک یا عدم اشتراکی بودن داده ها میان کاربران مختلف است. بدین معنی که یک مدیر پایگاه داده باید بداند که آیا می توان داده ها را به چند دسته تقسیم کرد و هر دسته را روی یک سرور جداگانه برای کاربرد مختلف قرار داد یا نه. به عنوان مثال، اگر شرکتی دارای یک سیستم جامع، شامل سه زیرسیستم انبار، فروش و حسابداری باشد، می تواند جداول دیدها و ارتباطات مربوط به هر یک از این سه زیر سیستم را در یک پایگاه داده روی یک سرور جداگانه قرار دهد ت هر یکی از آن ها در دسترس مسئولان انبار، فروش و حسابداری شرکت قرار گیرد.
سوالی که در اینجا مطرح می شود این است که اگر این سه زیر سیستم با یکدیگر در ارتباط باشند، باید چه کرد؟ مثلا فرض کنید که مسئول انبار برای خروج یک کالا از انبار باید بتواند به داده هایی از جداول مربوط به سیستم فروش دست یابد. بنابراین باید در این روش، راهی وجود داشته باشد تا در عین جدا بودن اطلاعات مذکور از یکدیگر، امکان استفاده کاربران مختلف از یکی از آن ها یا تلفیقی از آن ها نیز فراهم گردد.
در SQL Server نسخه 2000 برای این کار امکاناتی پیش بینی شده است. به عنوان مثال، شما با استفاده از قابلیت Linked server قادر خواهید بود یک بانک اطلاعاتی مقیم در یک سرور دیگر را طوری به یک بانک اطلاعاتی سرورتان پیوند بزنید که گویی هر دو در یک سرور قرار دارند.پس از این کار حتی می توانید پرس و جوهایی انجام دهید که از لینک کردن چند جدول و یا دید از هر دو بانک اطلاعاتی حاصل شود. به این قابلیت، جستجوی توزیع شده یعنی Distributed Query گفته می شود.
علاوه بر این خاصیت دیگری در این نسخه تعبیه شده است که امکان انجام دادن یک فرایند واحد روی چند بانک اطلاعاتی موجود در چند سرور مختلف را فراهم می کند(Distributed Transaction ). این قابلیت ها به گونه ای است که حتی امکان تعریف روابط وابستگی از طریق کلیدهای اولیه و کلید های خارجی میان بانک های مذکور نیز وجود دارد و یا مثلا ساخت یک دید با استفاده از لینک کردن جداول موجود در چند سرور نیز میسر گشته که به آن Distributed Portioned View گفته می شود.
به هر حال، بسیاری از راه حل های مربوط به "توزیع" در SQL Server برای استفاده همزمان از قدرت و قابلیت چندین سرور در نظر گرفته شده است. درشکل سه مثالی را مشاهده می کنید که در آن به صورت بسیار ساده جدول مشتریان یک شرکت به دلیل زیاد بودن و قابل جدا کردن اطلاعات آن، به سه دسته مشتریان شرق، غرب و مرکز کشور تقسیم بندی شده و هر کدام در عین ارتباط با یکدیگر و با کاربران، بر روی یک سرور مجزا قرار گرفته اند .(شکل 3 )


شکل 3

راه حل سوم: Replication

این راه حل نیز مشابه روش دوم Partitioning است. اما بر خلاف آن روش که سرور بانک اطلاعاتی را به چند سرور حاوی اطلاعات مختلف مورد نیازشان تقسیم می کردیم، در اینجا چند سرور بانک اطلاعاتی با استفاده از سازوکار Replication دقیقا شامل اطلاعات یکسان و همانند می باشند.
به عنوان مثال فرض کنید در یک شرکت بزرگ که دارای سه واحد اصلی فروش، انبار و حسابداری است، سه سرور بانک اطلاعاتی کاملا یکسان در نظر گرفته شده که هر یک از واحد ها داده های موردنیازشان را از جداول مربوط به خودشان از سروری که به آن ها اختصاص یافته دریافت می کنند و هر گاه تغییری را در آن اطلاعات به وجود آوردند، یا در همان لحظه باید در کلیه سرورهای دیگر نیز اعمال شود و یا طبق یک برنامه زمانبندی شده، در زمان دیگری مثلا در ساعات غیر اداری ک میزان ترافیک اطلاعات کاهش می یابد، به دیگر سرورها منتقل شود.اگر بخواهیم تغییر اطلاعات در همان لحظه به دیگر سرورها اعمال شود، می توان از Replication نوع فرایندی (Transactional) استفاده کرد.
در این روش با استفاده از قابلیتی به نام تغییر دو مرحله ای اطلاعات یا اصطلاحا Two Phase Commit هر تغییری بلافاصله در سایر سرورها نیز لزوما اعمال می شود. اما اگر بخواهیم تغییرات در زمان خاصی و به تعداد معمولی ( مثلا دو یا سه بار طی شبانه روز ) به سرورهای دیگر منتقل شود، می توان از Replication نوع ادغام استفاده کرد .(شکل 4)
بنابراین در این حالت هر سرور ضمن داشتن آخرین اطلاعات مربوط به واحد خود، آخرین اطلاعات رسیده از سایر سرورها (یا واحدهای دیگر) را نیز دارد.
لازم به ذکر است که عملیات انتقال اطلاعات با استفاده از Replication نکات و مسائل فنی فراوانی دارد که به تنهائی در قالب چند مقاله قابل بررسی است.


شکل 4


+ نوشته شده در چهارشنبه بیست و یکم شهریور 1386ساعت 16:58 توسط کامران رخشانی |



بر عهده داشتن وظيفه راهبري پايگاه داده، حتي در محیط های برنامه نویسی، همیشه خطیر بوده و از اهمیت بسیار بالایی برخوردار است، به طوری که حتی اشتباهاتی کوچک از جانب یک DBA می تواند موجب بروز اشکالاتی در عملکرد کلی سیستم ها گردد. اگر قصد دارید به عنوان یک DBA مشغول به کار شوید، پس در نظر گرفتن موارد زیر در سمت کاری آینده شما بسیار تاثیر گذار است. در صورتی هم که در حال حاضر در این سمت مشغول به کار می باشید، باز هم این امکان وجود دارد که تا به حال به بعضی از موارد زیر توجه نکرده باشید.

     

با تجربیاتی که در مدت هفت سال کار با SQL Server کسب کرده ام، ده موردی که در این مقاله ذکر می کنم ، کارهایی هستند که احساس می کنم یک راهبر پایگاه داده (DBA ) نباید هرگز انجام دهد.
بر عهده داشتن وظیفه راهبری پایگاه داده، حتی در محیط های برنامه نویسی، همیشه خطیر بوده و از اهمیت بسیار بالایی برخوردار است، به طوری که حتی اشتباهاتی کوچک از جانب یک DBA می تواند موجب بروز اشکالاتی در عملکرد کلی سیستم ها گردد. اگر قصد دارید به عنوان یک DBA مشغول به کار شوید، پس در نظر گرفتن موارد زیر در سمت کاری آینده شما بسیار تاثیر گذار است. در صورتی هم که در حال حاضر در این سمت مشغول به کار می باشید، باز هم این امکان وجود دارد که تا به حال به بعضی از موارد زیر توجه نکرده باشید:

1. Rebuild کردن Index در ساعات کاری

این عمل موجب افزایش چشم گیر I/O دیسک می شود. بهتر است این عمل بعدازظهر یا در طول شب ( زمانی که فعالیت کاربران به حداقل می رسد ) انجام شود.لازم به ذکر است که می توانید از سرویس Agent job جهت برنامه ریزی انجام خودکار این عملیات استفاده کنید.

2. Stop کردن Database بدون اطلاع رسانی قبلی

چرا؟!... تعداد زیادی کاربر که نمی توانند با برنامه خود کار کنند ... تلفن شما هم تا زمان راه اندازی مجدد Database از زنگ زدن دست بر نمی دارد.

3. نصب Service Pack در ساعات کاری

نصب سرویس پک، موجب Stop و Start های متعدد پایگاه داده می شود. توصیه می کنم این کار را نیز در ساعات کاری شرکت یا سازمان خود انجام ندهید. چون با این کار کاربران بسیاری را دلخور می کنید.

4. اجرای Query های تستی بر روی سرور اصلی

اگر این کار را انجام می دهید پس حتما نمی دانید که این Query ها به چه میزان منابع Server را به خود اختصاص می دهند.

5. Defragment کردن درایوهایی که فایل های دیتابیس روی آن قرار دارند

آیا تا به حال این کار را روی کامپیوتر شخصی خود انجام داده اید؟! پس حتما متوجه اید که چرا نباید این کار را روی سرور شرکت یا سازمان خود در ساعات کاری انجام دهید!!

6. بداخلاقی با برنامه نویسان

سعی کنید منطق دستورات خود را به آن ها توضیح دهید. بهتر است همیشه صبور باشید و تلاش کنید در حین ارجاع کار به آن ها دانش خود را نیز به آن ها منتقل کنید. نتیجه کار مستقیما به کار گروهی شما بستگی دارد.

7. پشتیبان گیری در ساعات کاری

این موضوع هم به I/O دیسک سرور مربوط می شود. اگر مجبور هستید این کار را در طول روز و در ساعات کاری انجام دهید، پس به گزینه هایی مانند differential Backups یا Transactional log Backups توجه کنید، این نوع پشتیبان گیری ها بسیار سریعتر صورت می پذیرد.

8. نصب Update های نرم افزاری قبل از تست و پشتیبان گیری

ممکن است نرم افزار های جانبی بر روی سرور پایگاه داده شما نصب شده باشد. نصب نرم افزار و یا نصب Update های نرم افزاری حتما باید با توجه ویژه و تست قبلی صورت پذیرد. تولید کنندگان نرم افزار ممکن است نتوانند صحت عمکرد نرم افزار خود را بر روی سخت افزار و شرایط مختلف بررسی کنند. قبل از اعمال هر تغییری در نرم افزارهای سرور از دیتابیس خود Backup بگیرید.

9. ایمن نکردن SQL Server

غالبا DBA ها فکر می کنند که سرورهایشان از امنیت بالایی برخوردار است!! آیا شما هم این طور فکر می کنید؟!
بهتر است برنامه Microsoft Baseline Security Analyzer را بر روی سرور خود اجرا کنید. شاید از مشاهده نتیجه آن تعجب کنید.

10. اجرای دستور Drop قبل از اطمینان کامل

قبل از اینکه دکمه Enter را فشار دهید خوب فکر کنید، اجرای این دستور با سهل انگاری ممکن است موجب اخراج بلادرنگ شما شود!

+ نوشته شده در سه شنبه بیستم شهریور 1386ساعت 14:55 توسط کامران رخشانی |

دوستان عزیز سلام ُ در بدو شروع نوشتن این وبلاگ برای شما یک هدیه دارم .مطلع شدم که سایت SQLIRan.com دوره های آموزشی خودش و شروع کرده حیفم اومد که یه شما نگم .اینم طرح برنامه نویس اونها

دوره های مربوط به طرح آموزشی برنامه نويس ايده آل 
شماره دوره نام دوره مدت(ساعت) زمان برگزاری معرفی دوره شهريه (ريال) تاريخ شروع
ساعت روز
دوره اول آشنايی با مبانی برنامه نويسی دات نت 40 19-17 زوج 10/06/86
دوره دوم Windows-Based Applications 40 11-8 پنجشنبه
ASP.net - Web Based Applications 50 18-15 پنجشنبه
دوره سوم برنامه نويسی پايگاه داده - SQL Server , ADP.net 40 11-8 جمعه
دوره چهارم اصول طراحی نرم افزار و معماری های چند لايه 30 18-15 جمعه

 ثبت نام در دوره های برنامه نويس ايده آل

آدرس سایت :

Http://www.SQLIran.com

 

+ نوشته شده در دوشنبه نوزدهم شهریور 1386ساعت 18:41 توسط کامران رخشانی |