SQL Server
3.98K subscribers
26 photos
7 videos
36 files
169 links
حمید رضا صادقیان

🔴طراح‌ومشاوربانک های اطلاعاتیSQLSERVER
⚫️مدرس دوره های آموزشیDatabase

ارتباط با من:
@Hamidreza_Sadeghian

گروه تبادل نظر:
https://t.me/+uIc1qhv58gU0NWQ0
Download Telegram
برجام، یک تراکنش پر از Rollback! 🤦‍♂️
ده سال پیش که برجام (Transaction) استارت خورد 🚀، گفتن همه تحریم‌ها موقتاً برداشته میشه. ما هم با یه خبر غیرقطعی (Dirty Page) کلی ذوق‌زده شدیم و با همین داده‌ای که هنوز Commit نشده بود، رفتیم جلو! 🏃‍♂️

این وسط کل دنیا هم Lock بودن 🔒 و منتظر بودن ببینن تهش چی میشه. ولی ما زرنگ بودیم! با یه Query غیررسمی (یعنی با WITH(NOLOCK) 😉) خبر برداشتن تحریم‌ها رو شنیدیم و باهاش عشق و حال کردیم. 🎉

همین وسط بود که یهو یه ترامپ (DBA) اومد و دکمه خروج از برجام رو زد! 🤯 یعنی اون تراکنش رو Kill کرد و فرستاد تو وضعیت Rollback! 💥

حالا بعد از ده سال، بالاخره این فرآیند Rollback مشخص شده و داره به اتمام می‌رسه. 😭 کلی تصمیم مهم روی شرکت و زندگی‌مون گرفته بودیم که همه‌شون بر اساس همون داده‌های کثیف بودن. 😩 تازه فهمیدیم یه «مکانیزم ماشه» هم داشته که ما ندیده بودیم! 💥 (داده اصلی تازه خودش رو نشون میده!)

حالا برو تو Query‌هات همینطوری جلو هر جدول یه WITH(NOLOCK) بذار و شاد باش که همه Blocking‌ها رو از بین بردی! 🥳 ولی کی مکانیزم ماشه کدنویسی‌ت فعال بشه و کل شرکت رو بفرسته هوا، خدا میدونه! 🤷‍♂️

همینقدر دقیق و خطرناک! 😉
😁17👍118
سلام دوستان

Execution Plan و Statistics در SQL Server: داستانی از فرار از زندان 😂

تصور کنین که "SQL Server" یه زندان بزرگ و پر از زندانیه. هر زندانی همون Query ماست که می‌خواد از زندان فرار کنه. 🏃‍♂️

The Execution Plan (نقشه فرار) 🗺

Execution Plan دقیقاً همون نقشه‌ایه که مایکل اسکافیلد تو بدنش تتو کرده بود! یه نقشه دقیق و مرحله به مرحله برای فرار. این نقشه به زندانی (کوئری) می‌گه که چطور باید از دست نگهبانا (موتور دیتابیس) فرار کنه، از چه تونل‌هایی بگذره (Index Seek) و از کجا دیوارو خراب کنه (Table Scan)! 🤯

اگه مایکل اسکافیلد، نقشه‌اش رو خوب نمی‌کشید یا مثلاً به جای کندن دیوار، سعی می‌کرد با نگهبان‌ها دوست بشه، قطعاً هیچوقت به خارج از زندان نمی‌رسید. تو دنیای ما هم اگه Execution Plan بهینه نباشه، کوئری ما یا خیلی طول می‌کشه یا اصلاً اجرا نمی‌شه. به عبارت دیگه، به جای فرار، میره سلول انفرادی! 💀



The Statistics (آمار و اطلاعات) 📊

Statistics همون اطلاعاتیه که مایکل اسکافیلد از زندان داشت. مثلاً می‌دونست که چند نفر زندانی تو هر بخش هستن، نگهبان‌ها چه زمانهایی شیفتشون عوض می‌شه و... . این اطلاعات بهش کمک می‌کرد که نقشه فرارش رو دقیق‌تر و هوشمندانه‌تر بکشه.

اگه Statistics به روز نباشن، مثل این می‌مونه که مایکل اسکافیلد فکر کنه هنوز همون نگهبانای قبلی سر پستشونن، در حالی که همه عوض شدن و نقشه‌هاش دیگه کار نمی‌کنه. نتیجه چی می‌شه؟ فرار شکست می‌خوره و نگهبانا هم بهش می‌خندن! 😂

نتیجه اخلاقی:

برای فرار موفق و سریع از زندان SQL Server، هم باید یه نقشه فرار (Execution Plan) بهینه داشته باشی و هم اطلاعاتت (Statistics) باید دقیق و به روز باشن. پس هر وقت کوئریت کند شد، یاد فرار از زندان مایکل اسکافیلد بیفت و برو سراغ نقشه و آمار! 🏃‍♂️
21👍8🤷‍♀1🤷‍♂1
سلام دوستان



📸 Snapshot Isolation تو SQL Server مثل صف بانک می‌مونه.

مردم عادی همه تو صف وایسادن تا کارشون راه بیفته 🧑‍🤝‍🧑.(تراکنش های Read Committed یا مدلهای دیگه ای از Isolation به غیر از Nolock یا Read Uncommitted)

ولی یهو یه آقای خیلی پولدار با حساب چند ده میلیاردی 💰 میاد، اصلا کاری به صف نداره. مستقیم میره پیش رئیس بانک 👔.

کارمندای بدبخت بانک (SQL Server) که سرشون شلوغه 🤯، با دستور رئیس یه لحظه کار همه رو ول می‌کنن و سریع کار این آقا رو راه میندازن.(Snapshot Isolation)

بعدشم برمی‌گردن برای کار همون صف و انگار نه انگار اتفاقی افتاده!(Blocking)

یعنی هرکی داره تو دنیای خودش توی صف پیش میره، ولی اون آقای میلیاردی یه نسخه‌ی ویژه (Snapshot) داره و هیچ دعوایی هم با بقیه پیش نمیاد 😅.

نتیجه:

کار همه انجام میشه.

صف به هم نمی‌ریزه.

کسی که پول داره همیشه در اولویته 😁 (همون بند پ خودمون)
👌172
بریم بایک مثال خفن دیگه تفاوت Index Scan و Index Seek رو بهتون بگم.

🔍 Index Scan

مثل خانمی که به شوهرش شک کرده 😅

شروع می‌کنه همه‌چیزو زیر و رو کردن: 📱 موبایل، 🎒 کیف، 📂 پرونده‌ها، حتی جیب شلوار!

یعنی از اول تا آخر همه‌چیزو می‌گرده تا بلکه یه سرنخ پیدا کنه.

🎯 Index Seek

اما این یکی خیلی هدفمنده 😎

صبح راه می‌افته دنبال شوهرش، صاف میره سر اصل ماجرا 👉 همون جایی که می‌دونه جوابش هست.(بعد همونجا پاره اش می کنه 😁 )
🤣19😁5👍32👌1
سلام

✍️ امروز یکی از دوستانم با مشکلی در SQL Server Always On Availability Group روبه‌رو شد.

بین دو سرور، کلاستر راه‌اندازی شده بود و حتی در سرویس SQL Server هم تیک مربوط به کلاستر خورده بود، اما هنگام ایجاد Availability Group خطای عجیبی نمایش داده می‌شد.

🔎 مراحل بررسی که انجام دادم:

1️⃣ اول از همه مطمئن شدم که سرویس کلاستر در حال اجراست.

2️⃣ بعد وضعیت نودها رو بررسی کردم تا هر دو در حالت Up باشند.

3️⃣ وجود File Share Witness رو هم چک کردم (اگر نباشه این خطا رو ایجاد نمی‌کنه، ولی بودنش همیشه بهتره).

4️⃣ در نهایت داخل SQL Server این کوئری رو اجرا کردم:



SELECT * FROM sys.dm_hadr_cluster

اینجا مشخص شد که برای سرویس، هیچ کلاستری تعریف نشده!

راه‌حل ساده بود:

یک‌بار قابلیت Always On Availability Group رو از داخل SQL Server Configuration Manager غیرفعال و دوباره فعال کردم. مشکل برطرف شد.

💡 گفتم این تجربه رو اینجا هم به اشتراک بذارم، شاید به کارتون بیاد.

#Alwayson #Availability_Group #HA #DBA
27👍12👌2
اگه دقت کرده باشید بچه‌ها وقتی یه اسباب‌بازی دستشونه، به هیچ‌وجه ول‌کن نیستن. 😅
هرکی هم بخواد بگیره سریع میگه: «مال خودمه!»
تا وقتی یا بازیشون تموم بشه (🔒 Commit) یا حواسشون پرت یه چیز دیگه بشه ( Rollback)، اون اسباب‌بازی رو ول نمی‌کنن.

Transaction توی SQL Server هم دقیقاً همین مدلیه!
وقتی بازه، رکورد یا جدول رو محکم گرفته و به هیچکس دیگه نمی‌ده.
یا باید کارش رو درست تموم کنه (Commit) یا بی‌خیال بشه و همه چی رو پس بده (Rollback).
16👍13
توی خونه‌های پرجمعیت، اگه پدر و مادرها مدیریت نمی‌کردن، بچه‌ها همدیگه رو تیکه‌پاره می‌کردن! 😅
قانون جنگل بود:
🍞 هرکی زودتر بیدار می‌شد غذا گیرش می‌اومد، وگرنه گشنه می‌موند.
🛏 هرکی زورش بیشتر بود، اتاق و تخت مال خودش می‌شد و بقیه باید وسط هال عشق می‌کردن!
اینجا بود که پدر و مادرها (و هنوز هم) وارد می‌شدن و منابع رو بین بچه‌ها عادلانه تقسیم می‌کردن. نتیجه؟ دیگه جنگ‌های قبیله‌ای داخلی از بین می‌رفت و همه در صلح و صفا زندگی می‌کردن. ✌️
فقط اگه بچه‌ای دست درازی می‌کرد، با سلاح کشنده‌ای به نام دمپایی 👡 مواجه می‌شد!
حالا توی SQL Server هم Resource Governor همین نقش رو داره. ⚙️
منابع رو بین یوزرها تقسیم می‌کنه تا درگیر نشن. و اگه یه کوئری هم بخواد زور بگه و منابع بیشتری بگیره، با Kill شدن و خطا (همون دمپایی معروف 😁) روبه‌رو میشه.
شما تا حالا از Resource Governor استفاده کردین؟
10👍8
سلام عزیزان

🚀 یه پست خفن دیگه 🚀
ما توی SQL Server چیزی داریم به اسم Cost Threshold for Parallelism (CTFP).
ولی خب این یعنی چی؟ 🤔

🔧 مثال خودمونی:
همه‌مون حداقل یه بار اسباب‌کشی داشتیم. کارگر باربر رودیدین؟
تا یه حدی بار رو تنهایی مثل بنز 🚛 میندازه رو کولش و می‌بره.
اما وقتی بار خیلی سنگین بشه، دیگه یه نفر جواب نمی‌ده و چند نفر باید با هم دست‌به‌کار شن.

🔍 تشبیه:
هر کارگر = یه CPU 🖥
اون حد توان = CTFP
وقتی هزینه‌ی اجرای یه Query از اون حد بیشتر بشه:
👉 یه CPU تنها نمی‌تونه
👉 چند CPU با هم می‌پرن وسط
👉 و تا وقتی اون بار سنگین جابه‌جا بشه، کارای سبک‌تر باید وایسن تو صف
📌 نتیجه‌گیری:
تا می‌تونید Queryهاتون رو بهینه بنویسید 💡
هزینه کم = سرعت بیشتر = CPU خوشحال 😎

⚖️ نکته مهم در تنظیم CTFP:
اگه خیلی زیاد باشه → یه CPU ممکنه زیر بار سنگین له بشه 😵‍💫
اگه خیلی کم باشه → حتی بارهای سبک هم چند CPU رو درگیر می‌کنن و همه‌چی کند میشه 🐌
14👍7👌2🤨2
سلام دوستان

🔑 توی SQL Server یه چیزی داریم به اسم Trace Flag، کلیدای مخفی که رفتارای پشت‌صحنه رو عوض می‌کنن.

حالا یعنی چی؟ 🤔

فرض کن با پارتنر عزیزت بحثت شده و رسماً در حالت پاره‌پوره هستید 😅

یه گل می‌خری 🌹 (یعنی یه Trace Flag فعال می‌کنی)

یهو رفتار طرف تغییر می‌کنه و همه‌چی دوباره گل و بلبل میشه! 🕊

ولی از اون ور، ممکنه یه جمله اشتباهی بگی و یکی از اون Trace Flagها فعال شه…

نتیجه؟ 😬 یه لاگ مفصل از غرغرها روی سرت میاد پایین! (مثل وقتی تو SQL Server می‌زنی 3704 و لاگهای ریزتر می‌بینی 📜)

نکته عجیبش چیه؟ 🤨

چه توی SQL Server چه تو زندگی واقعی، خیلی از این Trace Flagها Undocumented هستن!

یعنی هیچ راهنما و مستندی براشون نیست. باید خودت مورد عنایت قرار بگیری تا یاد بگیری 😅



📚 برای اینکه توی SQL Server بیشتر در موردش بدونید، این لینک میتونه مفید باشه



https://learn.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql?view=sql-server-ver17
👍155😁1👌1
ما توی SQL Server یه قابلیتی داریم به اسم Audit Log.
حالا یعنی چی؟

فرض کن داری با ماشینت توی خیابون حرکت می‌کنی:
از یه طرف دوربین‌ها همه‌جا هستن، از یه طرف پلیس نامحسوس رد میشه، اون وسط هم پلیس ایستاده داره سرعت رو می‌گیره. یعنی هر حرکتت رصد میشه و کافیه یه خطا کنی، سریع مچت رو می‌گیرن 🚨

دقیقاً همین کار رو Audit Log توی دیتابیس انجام می‌ده.

یا اگه بخوام یه مثال دیگه بزنم: شنیدین میگن خدا برای هر آدمی یه فرشته گذاشته که حتی وقتی دستتو می‌کنی توی دماغت هم یادداشت می‌کنه؟ 😅
چرا؟ برای اینکه اون دنیا جای حاشا نباشه و فیلمشو بذارن جلوت.
Audit Log هم حکم همون فرشته رو داره. هرکاری کنی ثبت میشه، تا فردا روز نشه گفت: «من نبودم، دستم خورد!» 😉
👍214🤨1
سلام دوستان

🚀 از ۱۰ میلیون Logical Read تا فقط ۲۵۰!
یکی از کوئری‌هایی که بررسی می‌کردم، به خاطر استفاده‌ی از OPENJSON ( که در اونجا بهش نیازی نبود ) بیش از ۱۰ میلیون logical read داشت و اجرای اون حدود ۱۰ ثانیه CPU time طول می‌کشید.

با بازنویسی ساده و حذف بخش‌های غیرضروری، همون کوئری در نهایت:
به ۸ میلی‌ثانیه زمان اجرا رسید
به تصاویر که نگاه کنید میزان Logical Read مخصوصا روی Worktable که برای استفاده از Tempdb هست مشخصه.

📊 این تجربه دوباره نشون داد که همیشه لازم نیست به سراغ راه‌حل‌های پیچیده بریم. گاهی یک بازنویسی ساده می‌تونه بیش از هزار برابر بهبود در پرفورمنس ایجاد کنه.

شما آخرین باری که یک کوئری رو به این شدت بهینه کردید، کی بوده؟
👍133
🤔 تا حالا خواستی دقیق بدونی جداول سیستمی SQL Server چطوری کار می‌کنن و چه روابطی با هم دارن؟

یه روش خیلی باحال برای یادگیری هست:
1️⃣ یه SQL Server روی سیستمت نصب کن.
2️⃣ یه ابزار مانیتورینگ مثل Profiler یا ترجیحاً XEvents اجرا کن.
3️⃣ شروع کن با SSMS کار کردن. مثلاً:

لیست دیتابیس‌ها رو باز کن.

روی گزینه‌های مختلف کلیک کن.

🔎 اینجا هر Query که توسط SSMS اجرا میشه (برای همون کاری که تو انجام دادی) توی ابزار لیست میشه و می‌تونی ببینی.

به این شکل خیلی راحت می‌فهمی پشت پرده دقیقاً چه اتفاقی میفته، چه جداول سیستمی درگیر میشن و کل ماجرا چطور مدیریت میشه.

⚡️ نتیجه؟ درک عمیق‌تر و واقعی‌تر از SQL Server 🚀
12👍4🔥1
سلام دوستان



🛒 یادتونه سال‌ها قبل از اینکه هایپراستار بیاد، برای هر چیزی مجبور بودیم بریم یه فروشگاه مخصوص همون؟

هیچ مرجعی نبود که یک‌جا همه نیازها رو پوشش بده.

وقتی هایپراستار اومد، ملت استقبال کردن چون همه‌چی یه جا جمع بود:



برندهای خوب

اجناس درست‌حسابی

خرید راحت‌تر



نتیجه؟ دسترسی ساده‌تر به کالاها و در عوض فروش مغازه‌های اطراف به شدت افت کرد.



حالا دقیقاً همین اتفاق توی دنیای SQL Server و Data Warehouse (DW) میفته.



📊 توی DW:

داده‌ها از منابع مختلف (مثل همون فروشگاه‌ها یا کارخانه‌ها) جمع میشن.

برای رکوردها Master Data پیاده‌سازی میشه (یه کدینگ واحد برای کالاها).

داده‌ها تمیز و پاکسازی میشن (کالاهای خراب و برندهای ضعیف حذف میشن).

و در نهایت کاربر با یه منبع داده‌ی مرتب و درست سروکله می‌زنه و می‌تونه به صورت تجمیعی به همه نیازهای گزارش‌گیری و تصمیم‌گیری دسترسی داشته باشه—بدون اینکه مجبور باشه بره سراغ تک‌تک سیستم‌ها.



⚠️ پس اگه جایی اومدن براتون DW و BI راه انداختن ولی این اتفاقا نیفتاد… احتمالاً یه جای کار می‌لنگه 😉
4