Categories
Technical

Improving SQL Server Performance

التطوير من مزود Microsoft SQL Server 2000 إلى Microsoft SQL 2008 | الأمين سوفت

في التدوينة دي تكلم عن تعديلات بسيطة لتحسين أداء ال SQL Server، لو كان عندك مشكلة و الاداء برضه متحسنش ساعتها لازم تشوف ال bottleneck جاية منين و ده هتكلم عنه ف الاخر. بس دي مجرد نصائح عامة ممكن تتطبق في حالات كتير

  1. امسح ال indexes اللي مش بتستعملها، في كل عملية insert لازم ال Sql Server بيضطر انه يعمل update لل indexes دي، ممكن من خلال مثلًا Sys.dm_db_index_usage_stats تشوف ايه ال indexes اللي استخدامها قليل او معدوم و تشيلها.
  2. ممكن المشكلة تكون في ال Index Maintenance من الاساس، ممكن يكون عندك indexes و fragmented بصورة كبيرة و محتاج تعملها reorg او rebuild ساعتها انصحك تعمل Job يشتغل مثلًا مرة في الاسبوع يعمل rebuild او reorg حسب ال fragmented value ممكن تبص على scripts بتوع Ola من هناhttps://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html
  3. ال tempdb لازم تكون محطوطة على هارد سريع، و لو مثلًا شغال على Azure خليها ف ال Temp storage drive
  4. شوف ال SQL Server مسموحله يستعمل كام core من ال CPU
  5. تحط value معقولة للـ Max/Min Server Memory
  6. تفعل ال Lock Pages In Memory ممكن تشوف اللينك ده

  7. تشوف ال waits اللي بتحصل على ال SQL Server threads و تشوف انواعها جايز بتحصل waits بسبب ال IO او مشكلة ف ال Paging او network latency عالية مثلا ممكن تشوف ال script ده
  8. تشوف ال queries اللي بتاخد وقت كبير عشان تشتغل ممكن من الscript ده

SELECT TOP 20

total_worker_time/execution_count AS Avg_CPU_Time

,Execution_count

,total_elapsed_time/execution_count as AVG_Run_Time

,total_elapsed_time

,(SELECT

SUBSTRING(text,statement_start_offset/2+1,statement_end_offset

) FROM sys.dm_exec_sql_text(sql_handle)

) AS Query_Text

FROM sys.dm_exec_query_stats

ORDER BY Avg_CPU_Time DESC

Categories
Technical

Writing Multithreaded test to reproduce SQL Deadlocks.

في الفيديو ده بشرح ازاي تكتب Multi threaded Test نقدر من خلاله نـ reproduce ال SQL Deadlocks

 

Categories
Technical

Backup and Restore MSSQL DB Using C#

ازاي تاخد Database Backup من البرنامج بتاعك و ازاي تعمل Restore

مدبأيا ازاي نعمل Backup لـ Database MSSQL اصلا ؟

لو عندنا مثلا Database اسمها TestDB و عايز اعملها Backup على ال C:\TestDB.bak

هنكتب الامر ده ف ال SQL

BACKUP DATABASE TestDB TO DISK ='C:\TestDB.bak'

طيب نعملها ازاي ف ال App بتاعنا

ممكن ببساطة نضيف folderBrowserDialog عشان بس نحدد مكان ال Folder اللي الـ User عايز يحفظ فيه ال BackUp

و ناخد بعد كده ال path اللي اختاره و نشتغل عليه احنا

مثال بسيط

انا عامل كلاس اسمه Database فيه كل ال Functions الخاصة بالتعامل مع ال Database بتاعتي

و واخد من الكلاس ده object اسمه db و فيه Function اسمها BackUpDB و بتاخد parameter هو string path

دلوقتي لما ال user يدوس على button بتاع ال Browse اللي هيفتحله ال folderBrowserDialog

ده هيكون code ال button click

private void button6_Click(object sender, EventArgs e)
{
folderBrowserDialog1.ShowDialog();
string path = folderBrowserDialog1.SelectedPath;
if(path!="")
{
 
db.BackUpDB(path);
MessageBox.Show("تم الحفظ بنجاح");
}
else { MessageBox.Show("خطأ في الحفظ"); }
}

ببساطة باخد منه ال path و بديه لل BackUpDB Function

ايه اللي بيحصل ف ال BackUpDB Function بقى

public void BackUpDB(string path)
{
con.Open();
SqlCommand cm = new SqlCommand("USE master", con);
cm.ExecuteNonQuery();
SqlCommand cmd = new SqlCommand("BACKUP DATABASE TestDB TO DISK = '" + path + "\\TestDB" +DateTime.Now.ToShortDateString().Replace('/','-') + ".bak'", con);
 
cmd.ExecuteNonQuery();
con.Close();
}

طيب دلوقتي انا عايز اعمل restore

ال restore هيجيلك exception غبي كده هيقولك ان فيه connection لل database مفتوحة و انها بتستعمل دلوقتي .. طب عشان نخلص من الحوارات دي نعمل ايه ؟

هنعمل 4 حاجات

1- هنشتغل على Master بدل ال Database بتاعتنا بمعنى اني هعمل Use master

2- هخلي ال database بتاعتي Single_User

3-هعمل Restore With Replace بأمر زي ده كده

RESTORE DATABASE TestDB FROM DISK=’C:\TestDB.bak’ With Replace

4- هرجع ال database بتاعتي تاني Multi_User

طيب نعملها ازاي ف ال App بتاعنا

هنعمل المرادي SaveFileDialog عشان نحدد ال path اللي عايز يحفظ فيه ال Backup و ناخد ال path ده و نعمل restore منه

مثال بسيط

الكلاس بتاع ال Database في Function اسمها RestoreDB بتاخد string path برضه

دلوقتي لما ال user يدوس على button عشان يفتح ال SaveFileDialog هاخد ال FileName من ال SaveFileDialog ده و هبعته للـFunction

private void button7_Click(object sender, EventArgs e)
{
openFileDialog2.Filter = "Backup File (*.bak)|*.bak";
openFileDialog2.FileName = null;
openFileDialog2.ShowDialog();
string path = openFileDialog2.FileName;
if (path != "")
{
try
{
db.RestoreDB(path);
MessageBox.Show("تم ");
Application.Restart();
}
catch { MessageBox.Show("خطأ"); }
}
else
{
MessageBox.Show("خطأ في الاسترجاع");
}
}

و ده اللي بيحصل جوة ال Function بتاعت RestoreDB

public void RestoreDB(string path)
{
 
con.Open();
SqlCommand cm = new SqlCommand("USE master", con);
cm.ExecuteNonQuery();
string Alter1 = @"ALTER DATABASE [TestDB] SET Single_User WITH Rollback Immediate";
SqlCommand Alter1Cmd = new SqlCommand(Alter1, con);
Alter1Cmd.ExecuteNonQuery();
try
{
SqlCommand cmd = new SqlCommand("RESTORE DATABASE TestDB FROM DISK='" + path + "' With Replace", con);
cmd.ExecuteNonQuery();
}
catch { }
string Alter2 = @"ALTER DATABASE [TestDB] SET Multi_User";
SqlCommand Alter2Cmd = new SqlCommand(Alter2, con);
Alter2Cmd.ExecuteNonQuery();
con.Close();
}