سلام دوستان عزیز
🔍 SET FMTONLY دقیقاً چیه و چرا دیگه بهتره ازش استفاده نکنیم؟
یه نکته فنی که این چند روز دوباره باهاش برخورد کردم و گفتم اینجا هم بگم:
SET FMTONLY ON
خیلیها هنوز توی پروژهها استفاده میکنن، در حالی که واقعاً دیگه وقتشه بذاریمش کنار 😄
🧪 SET FMTONLY ON یعنی چی؟
وقتی این گزینه رو فعال میکنی:
SET FMTONLY ON;
SELECT * FROM Sales.Orders;
SQL Server اصلاً کوئری رو اجرا نمیکنه!
فقط ساختار خروجی رو میده:
- اسم ستونها
- نوع دادهها
- نه دیتا میخونه
- نه لاجیک اجرا میکنه
- نه Temp Table میسازه
- نه حتی Cross DB Query اجرا میشه!
برای همون دوران ADO و ODBC قدیم ساخته شده بود.
❌ مشکلش چیه؟
FMTONLY از SQL 2012 به بعد رسماً منقرض شده (Deprecated) چون:
- با Temp Table و Table Variable قاطی میکنه
- خیلی وقتها خطای Invalid object name میده
- خروجی DMVها نصفهنیمه برمیگردونه
- روی نسخههای مختلف SQL Server متفاوت رفتار میکنه
دقیقاً همون چیزیه که تو ابزارهای مانیتورینگ یا ORMها باعث Errorهای عجیب میشه.
✔️ جایگزین استاندارد و مدرن
بهجاش از این DMV فوقالعاده استفاده کنید:
SELECT *
FROM sys.dm_exec_describe_first_result_set
(
N'SELECT CustomerId, TotalPrice FROM Sales.Orders',
NULL,
NULL
);
این کارها رو انجام میده:
✔️ کوئری رو اجرا نمیکنه
✔️ ساختار دقیق نتیجه رو برمیگردونه
✔️ با نسخههای مختلف SQL Server سازگاره
✔️ با Temp Table و Dynamic SQL هم درست کار میکنه
🔥 مثال عملیِ واقعی
فرض کن یک Stored Procedure داری:
CREATE PROCEDURE dbo.UspGetOrders
AS
BEGIN
SELECT TOP 100 OrderId, CustomerId, TotalAmount
FROM Sales.Orders
ORDER BY OrderDate DESC;
END
میخوای فقط ساختار خروجی رو ببینی، بدون اینکه SP رو واقعاً اجرا کنی:
SELECT *
FROM sys.dm_exec_describe_first_result_set
(
N'EXEC dbo.UspGetOrders',
NULL,
NULL
);
که میاد ساختار جداول و فیلدها رو بهتون ارائه میده.
شما تاحالا ازش استفاده کردین؟
🔍 SET FMTONLY دقیقاً چیه و چرا دیگه بهتره ازش استفاده نکنیم؟
یه نکته فنی که این چند روز دوباره باهاش برخورد کردم و گفتم اینجا هم بگم:
SET FMTONLY ON
خیلیها هنوز توی پروژهها استفاده میکنن، در حالی که واقعاً دیگه وقتشه بذاریمش کنار 😄
🧪 SET FMTONLY ON یعنی چی؟
وقتی این گزینه رو فعال میکنی:
SET FMTONLY ON;
SELECT * FROM Sales.Orders;
SQL Server اصلاً کوئری رو اجرا نمیکنه!
فقط ساختار خروجی رو میده:
- اسم ستونها
- نوع دادهها
- نه دیتا میخونه
- نه لاجیک اجرا میکنه
- نه Temp Table میسازه
- نه حتی Cross DB Query اجرا میشه!
برای همون دوران ADO و ODBC قدیم ساخته شده بود.
❌ مشکلش چیه؟
FMTONLY از SQL 2012 به بعد رسماً منقرض شده (Deprecated) چون:
- با Temp Table و Table Variable قاطی میکنه
- خیلی وقتها خطای Invalid object name میده
- خروجی DMVها نصفهنیمه برمیگردونه
- روی نسخههای مختلف SQL Server متفاوت رفتار میکنه
دقیقاً همون چیزیه که تو ابزارهای مانیتورینگ یا ORMها باعث Errorهای عجیب میشه.
✔️ جایگزین استاندارد و مدرن
بهجاش از این DMV فوقالعاده استفاده کنید:
SELECT *
FROM sys.dm_exec_describe_first_result_set
(
N'SELECT CustomerId, TotalPrice FROM Sales.Orders',
NULL,
NULL
);
این کارها رو انجام میده:
✔️ کوئری رو اجرا نمیکنه
✔️ ساختار دقیق نتیجه رو برمیگردونه
✔️ با نسخههای مختلف SQL Server سازگاره
✔️ با Temp Table و Dynamic SQL هم درست کار میکنه
🔥 مثال عملیِ واقعی
فرض کن یک Stored Procedure داری:
CREATE PROCEDURE dbo.UspGetOrders
AS
BEGIN
SELECT TOP 100 OrderId, CustomerId, TotalAmount
FROM Sales.Orders
ORDER BY OrderDate DESC;
END
میخوای فقط ساختار خروجی رو ببینی، بدون اینکه SP رو واقعاً اجرا کنی:
SELECT *
FROM sys.dm_exec_describe_first_result_set
(
N'EXEC dbo.UspGetOrders',
NULL,
NULL
);
که میاد ساختار جداول و فیلدها رو بهتون ارائه میده.
شما تاحالا ازش استفاده کردین؟
👏10❤5👍2👌2
گاهی وقتا برای فهمیدن پشتصحنهی واقعی SQL Server باید یه ذره چراغقوهی مخفی روشن کنیم 😎🔦
یکی از چیزهایی که همیشه کمکم کرده بفهمم دقیقاً اون زیر چه خبره، همین دستور معروفه:
dbcc traceon(3004,3604,-1)
این دستور باعث میشه جزییات کامل عملیات Backup و Restore رو ببینی؛
جزییاتی که SQL Server معمولاً ساکت و بیصدا انجامشون میده ولی ما میخوایم بدونیم دقیقاً در حال رخ دادن چیه ⚙️👀
نکتهی جالبش اینه که تو این جزییات دقیقاً مشخص میکنه:
✔️بکاپ یا ریستور با چه پارامترهایی داره انجام میشه،
✔️کدوم مرحله بیشترین زمان رو میبلعه،
✔️و چطور میتونی کل فرآیند رو بهینهتر کنی ⏱️🚀
وقتی فعالش میکنی، انگار وارد اتاق کنترل موتور SQL Server شدی و داری قدمبهقدم همهچیز رو لایو نگاه میکنی 🔍💡
و اما نکتهی مهم برای کسایی که تازه با این Trace Flagها آشنا میشن:
✔️Trace Flag 3004: مسئول نوشتن لاگ عملیات Backup/Restore هست.
✔️Trace Flag 3604: به SQL Server میگه همین لاگها رو مستقیم داخل نتیجهی همون کوئری نشون بده.
یعنی دقیقاً همان لحظه همونجا میبینی چه اتفاقی داره میفته 😍📜
برای من این چیزا فقط یه دستور نیستن؛
کلیدهایی هستن برای اینکه رفتار دیتابیس رو بفهمم، تحلیل کنم و دقیقتر از همیشه بهینهسازی انجام بدم.
#SQLServer #DBA #TraceFlag #BackupRestore #PerformanceTuning #DatabaseInternals #Monitoring #MicrosoftSQLServer #DataEngineering
یکی از چیزهایی که همیشه کمکم کرده بفهمم دقیقاً اون زیر چه خبره، همین دستور معروفه:
dbcc traceon(3004,3604,-1)
این دستور باعث میشه جزییات کامل عملیات Backup و Restore رو ببینی؛
جزییاتی که SQL Server معمولاً ساکت و بیصدا انجامشون میده ولی ما میخوایم بدونیم دقیقاً در حال رخ دادن چیه ⚙️👀
نکتهی جالبش اینه که تو این جزییات دقیقاً مشخص میکنه:
✔️بکاپ یا ریستور با چه پارامترهایی داره انجام میشه،
✔️کدوم مرحله بیشترین زمان رو میبلعه،
✔️و چطور میتونی کل فرآیند رو بهینهتر کنی ⏱️🚀
وقتی فعالش میکنی، انگار وارد اتاق کنترل موتور SQL Server شدی و داری قدمبهقدم همهچیز رو لایو نگاه میکنی 🔍💡
و اما نکتهی مهم برای کسایی که تازه با این Trace Flagها آشنا میشن:
✔️Trace Flag 3004: مسئول نوشتن لاگ عملیات Backup/Restore هست.
✔️Trace Flag 3604: به SQL Server میگه همین لاگها رو مستقیم داخل نتیجهی همون کوئری نشون بده.
یعنی دقیقاً همان لحظه همونجا میبینی چه اتفاقی داره میفته 😍📜
برای من این چیزا فقط یه دستور نیستن؛
کلیدهایی هستن برای اینکه رفتار دیتابیس رو بفهمم، تحلیل کنم و دقیقتر از همیشه بهینهسازی انجام بدم.
#SQLServer #DBA #TraceFlag #BackupRestore #PerformanceTuning #DatabaseInternals #Monitoring #MicrosoftSQLServer #DataEngineering
👏15❤8👌2👍1
امروز برای بررسی یک دیتابیس از یک نرمافزار در کشور دوست و همسایه 🌍 (همون سرزمین فرصتها و محل تحقق آمال و آرزوهای همه ما 😅✈️) وصل شدم.
حالا اینکه مدیریت درستوحسابی دیتابیس نداشتن، بماند… 🤦♂️
اما اصل ماجرا 👇
رفتم سراغ Jobهای بکاپ.
دیدم دوست عزیزمون رفته پنل زمانبندی رو باز کرده،
چون برای هر روز هفته یه چکباکس گذاشته بودن،
ایشون هم فکر کرده باید برای هر روز یه Job جدید بسازه! 😂😂
یعنی ۷ تا جاب بکاپ، یکی برای شنبه، یکی دوشنبه…
انگار بکاپ گرفتن نذریه و باید روز به روز پخش بشه 😄🍛
بابا یه دونه ماوس برداری یه دابلکلیک بزنی ببینی شاید بشه چندتا روز رو با هم انتخاب کرد…
ولی خب… ظاهراً ماوسش همون روز مرخصی بوده 🐭💤
راستش چیزهای عجیب زیاد دیدم،
اما این یکی واقعاً هنر خاصی میخواست 🎨😆
شما تا حالا به همچین شاهکارهای مهندسی برخوردین؟
تجربههای باحال و عجیبغریبتون رو بگین بخندیم 😂👇
حالا اینکه مدیریت درستوحسابی دیتابیس نداشتن، بماند… 🤦♂️
اما اصل ماجرا 👇
رفتم سراغ Jobهای بکاپ.
دیدم دوست عزیزمون رفته پنل زمانبندی رو باز کرده،
چون برای هر روز هفته یه چکباکس گذاشته بودن،
ایشون هم فکر کرده باید برای هر روز یه Job جدید بسازه! 😂😂
یعنی ۷ تا جاب بکاپ، یکی برای شنبه، یکی دوشنبه…
انگار بکاپ گرفتن نذریه و باید روز به روز پخش بشه 😄🍛
بابا یه دونه ماوس برداری یه دابلکلیک بزنی ببینی شاید بشه چندتا روز رو با هم انتخاب کرد…
ولی خب… ظاهراً ماوسش همون روز مرخصی بوده 🐭💤
راستش چیزهای عجیب زیاد دیدم،
اما این یکی واقعاً هنر خاصی میخواست 🎨😆
شما تا حالا به همچین شاهکارهای مهندسی برخوردین؟
تجربههای باحال و عجیبغریبتون رو بگین بخندیم 😂👇
😁15🔥5👍3
سلام دوستان.
🔧 بهینهسازی حذف 17 میلیون رکورد در SQL Server 🚀
قرار بود از یک جدول، حدود 17 میلیون رکورد حذف بشه.
منطق اولیه به این صورت بود که:
🔹 داخل یک حلقه، با یک SELECT
🔹 هر بار 20,000 رکورد در یک Local Variable ریخته میشد
🔹 و سپس عملیات حذف انجام میگرفت
⏳ این روش بهشدت کند بود و فرآیند حذف چندین ساعت زمان میبرد.
💡 راهکاری که پیادهسازی کردم:
✅ منطق را بهطور کامل بازطراحی کردم:
1️⃣ دستور SELECT را از داخل حلقه خارج کردم
2️⃣ یک Temporary Table ساختم
3️⃣ تمام IDهای موردنظر را یکجا داخل آن INSERT کردم
4️⃣ روی جدول Temp یک Index مناسب ایجاد کردم ⚡️
5️⃣ در حلقه، هر بار فقط 20,000 رکورد:
از جداول اصلی حذف میشد و همان 20,000 رکورد از جدول Temp هم پاک میشد
🔁 کل فرآیند در قالب یک Transaction کنترلشده انجام شد
📌 بهطوری که بعد از هر 20,000 رکورد COMMIT میشد تا:
رشد Transaction Log کنترل بشه.
با توجه به Auto Backupهای مداوم، فایل لاگ من رشد نمیکرد که باعث ترکیدن سیستم بشه.
🎯 نتیجه نهایی:
🔥 حذف کامل 17,000,000 رکورد فقط در 56 دقیقه
📉 کاهش چشمگیر زمان اجرا
📉 کنترل مصرف لاگ
📈 افزایش پایداری سیستم در زمان عملیات
⚠️ نکته مهم درباره علت کندی اولیه:
روی جدول، Cascade Delete فعال بود
و به دلیل محدودیتهای سیستمی امکان تغییر آن وجود نداشت
بنابراین بهینهسازی باید کاملاً در سطح منطق اجرا و معماری حذف داده انجام میشد، نه ساختار دیتابیس.
🔧 بهینهسازی حذف 17 میلیون رکورد در SQL Server 🚀
قرار بود از یک جدول، حدود 17 میلیون رکورد حذف بشه.
منطق اولیه به این صورت بود که:
🔹 داخل یک حلقه، با یک SELECT
🔹 هر بار 20,000 رکورد در یک Local Variable ریخته میشد
🔹 و سپس عملیات حذف انجام میگرفت
⏳ این روش بهشدت کند بود و فرآیند حذف چندین ساعت زمان میبرد.
💡 راهکاری که پیادهسازی کردم:
✅ منطق را بهطور کامل بازطراحی کردم:
1️⃣ دستور SELECT را از داخل حلقه خارج کردم
2️⃣ یک Temporary Table ساختم
3️⃣ تمام IDهای موردنظر را یکجا داخل آن INSERT کردم
4️⃣ روی جدول Temp یک Index مناسب ایجاد کردم ⚡️
5️⃣ در حلقه، هر بار فقط 20,000 رکورد:
از جداول اصلی حذف میشد و همان 20,000 رکورد از جدول Temp هم پاک میشد
🔁 کل فرآیند در قالب یک Transaction کنترلشده انجام شد
📌 بهطوری که بعد از هر 20,000 رکورد COMMIT میشد تا:
رشد Transaction Log کنترل بشه.
با توجه به Auto Backupهای مداوم، فایل لاگ من رشد نمیکرد که باعث ترکیدن سیستم بشه.
🎯 نتیجه نهایی:
🔥 حذف کامل 17,000,000 رکورد فقط در 56 دقیقه
📉 کاهش چشمگیر زمان اجرا
📉 کنترل مصرف لاگ
📈 افزایش پایداری سیستم در زمان عملیات
⚠️ نکته مهم درباره علت کندی اولیه:
روی جدول، Cascade Delete فعال بود
و به دلیل محدودیتهای سیستمی امکان تغییر آن وجود نداشت
بنابراین بهینهسازی باید کاملاً در سطح منطق اجرا و معماری حذف داده انجام میشد، نه ساختار دیتابیس.
👍25🔥8❤5🙏2🤷♂1
سلام دوستان
🔍 یک چالش جالب در SQL Server که میتونست یک مجموعه رو زمینگیر کنه!
چند وقت پیش در یکی از مجموعهها با یک مشکل عجیب مواجه بودن 👀
سیستم از یک تعداد کاربر مشخص به بعد خطا میداد و اجازه نمیداد اتصال جدیدی به دیتابیس برقرار بشه.
🔎 بعد از دیدن خطا، اولین چیزی که به ذهنم رسید این بود:
احتمالاً تنظیمات user connections دستکاری شده.
مشکل اینجا بود که حتی اتصال عادی هم به دیتابیس برقرار نمیشد!
با کلی داستان و از طریق sqlcmd تونستم مستقیم به Engine وصل بشم 💪
📌 با بررسی تنظیمات:
'sp_configure 'user connections
مشخص شد مقدار روی 100 ست شده 😐
🔧 راهحل ساده ولی حیاتی بود:
مقدار user connections رو روی 0 گذاشتم
عدد 0 یعنی:
👉 SQL Server خودش مدیریت میکنه (تا حدود 32767 اتصال همزمان)
بعد از اعمال تغییر، مجبور شدیم یک بار سرویس SQL Server رو ریست کنیم 🔄
و… مشکل بهطور کامل حل شد ✅
✨ نکته جالبتر؟
کاربران میگفتن حتی سرعت سیستم هم بهتر شده!
احتمالاً سیستم مدام سعی میکرد اتصال بگیره، خطا میخورد و منتظر میموند تا دوباره تلاش کنه ⏳
🧠 جمعبندی مهم:
هر عددی که در SQL Server میبینید، معمولاً پشتش یک منطق و سناریو وجود داره.
این تنظیمات رو:
❌ با حدس
❌ با سلیقه
❌ یا «ببینیم با کدوم عدد حال میکنیم»
نباید تغییر داد!
⚠️ یک عدد اشتباه، خیلی راحت میتونه کل یک شرکت رو دچار اختلال کنه.
کمی دقت بیشتر در این جزئیات، هزینههای خیلی بزرگی رو کم میکنه.
#SQLServer #DBA #Performance #Troubleshooting #Database #Production #Experience
🔍 یک چالش جالب در SQL Server که میتونست یک مجموعه رو زمینگیر کنه!
چند وقت پیش در یکی از مجموعهها با یک مشکل عجیب مواجه بودن 👀
سیستم از یک تعداد کاربر مشخص به بعد خطا میداد و اجازه نمیداد اتصال جدیدی به دیتابیس برقرار بشه.
🔎 بعد از دیدن خطا، اولین چیزی که به ذهنم رسید این بود:
احتمالاً تنظیمات user connections دستکاری شده.
مشکل اینجا بود که حتی اتصال عادی هم به دیتابیس برقرار نمیشد!
با کلی داستان و از طریق sqlcmd تونستم مستقیم به Engine وصل بشم 💪
📌 با بررسی تنظیمات:
'sp_configure 'user connections
مشخص شد مقدار روی 100 ست شده 😐
🔧 راهحل ساده ولی حیاتی بود:
مقدار user connections رو روی 0 گذاشتم
عدد 0 یعنی:
👉 SQL Server خودش مدیریت میکنه (تا حدود 32767 اتصال همزمان)
بعد از اعمال تغییر، مجبور شدیم یک بار سرویس SQL Server رو ریست کنیم 🔄
و… مشکل بهطور کامل حل شد ✅
✨ نکته جالبتر؟
کاربران میگفتن حتی سرعت سیستم هم بهتر شده!
احتمالاً سیستم مدام سعی میکرد اتصال بگیره، خطا میخورد و منتظر میموند تا دوباره تلاش کنه ⏳
🧠 جمعبندی مهم:
هر عددی که در SQL Server میبینید، معمولاً پشتش یک منطق و سناریو وجود داره.
این تنظیمات رو:
❌ با حدس
❌ با سلیقه
❌ یا «ببینیم با کدوم عدد حال میکنیم»
نباید تغییر داد!
⚠️ یک عدد اشتباه، خیلی راحت میتونه کل یک شرکت رو دچار اختلال کنه.
کمی دقت بیشتر در این جزئیات، هزینههای خیلی بزرگی رو کم میکنه.
#SQLServer #DBA #Performance #Troubleshooting #Database #Production #Experience
❤22👍7👌2
سلام دوستان
📉 Shrink در SQL Server به روایت یک فضای کار اشتراکی!
فرض کن یکی میره یه فضای کار اشتراکی 🏢
اوایل کارش کوچیکه، یه میز اشتراکی میگیره.
کمکم کارش میگیره 📈، میگه «نه، من یه اتاق میخوام» 🚪
اتاق رو میگیره، کارش راه میافته، همه چی خوبه 😌
فرداش چی؟
میگه «نه بابا، الان اتاق زیادیه»
اتاق رو پس میده، برمیگرده میز اشتراکی 😐
عصر دوباره کار زیاد میشه:
«بچهها اتاق بدین!»
دوباره اتاق میگیره…
پس میده…
میگیره…
پس میده… 🤦♂️
حالا صاحب فضای کار اشتراکی کلافه نشده؟
دیوارها جابهجا نمیشن؟
نظم فضا به هم نمیریزه؟ 😵
📌 Shrink توی SQL Server دقیقاً همینه!
دیتابیس رشد میکنه 📊
شما Shrink میکنی چون «فضا خالیه»
دوباره دیتا میاد، دوباره رشد میکنه
دوباره Shrink
نتیجه؟
Fragmentation شدید 🧩
فشار بیخودی به IO 💥
بدتر شدن Performance 🐌
📢 Shrink یعنی پس گرفتن فضا، نه مدیریت فضا!
Shrink برای شرایط خاصه:
بعد از حذف دائمی حجم عظیمی از دیتا
وقتی مطمئنی دیگه به اون فضا نیاز نداری
نه برای اینکه:
❌ هر هفته دیسک خالی ببینی
❌ یا وجدان DBAت آروم بشه 😄
و این مساله هم برای فایل LDF صدق می کنه هم MDF.
بارها توی همه Job ها من Job برای Shrink دیدم و ایجاد Fragmentation بر روی LDF ها.
🎯 نتیجه:
به جای این همه «اتاق پس بده، اتاق بگیر»
یه فضای مناسب بگیر، درست استفاده کن،
و بگذار دیتابیس با آرامش رشد کنه
و برای کنترل LDF هم تهیه بکاپ منظم از Log ها به این مساله به شدت کمک می کنه.🧘♂️
hashtag#SQLServer hashtag#DBA hashtag#Shrink hashtag#Performance hashtag#DatabaseLife hashtag#طنز_فنی 😄
📉 Shrink در SQL Server به روایت یک فضای کار اشتراکی!
فرض کن یکی میره یه فضای کار اشتراکی 🏢
اوایل کارش کوچیکه، یه میز اشتراکی میگیره.
کمکم کارش میگیره 📈، میگه «نه، من یه اتاق میخوام» 🚪
اتاق رو میگیره، کارش راه میافته، همه چی خوبه 😌
فرداش چی؟
میگه «نه بابا، الان اتاق زیادیه»
اتاق رو پس میده، برمیگرده میز اشتراکی 😐
عصر دوباره کار زیاد میشه:
«بچهها اتاق بدین!»
دوباره اتاق میگیره…
پس میده…
میگیره…
پس میده… 🤦♂️
حالا صاحب فضای کار اشتراکی کلافه نشده؟
دیوارها جابهجا نمیشن؟
نظم فضا به هم نمیریزه؟ 😵
📌 Shrink توی SQL Server دقیقاً همینه!
دیتابیس رشد میکنه 📊
شما Shrink میکنی چون «فضا خالیه»
دوباره دیتا میاد، دوباره رشد میکنه
دوباره Shrink
نتیجه؟
Fragmentation شدید 🧩
فشار بیخودی به IO 💥
بدتر شدن Performance 🐌
📢 Shrink یعنی پس گرفتن فضا، نه مدیریت فضا!
Shrink برای شرایط خاصه:
بعد از حذف دائمی حجم عظیمی از دیتا
وقتی مطمئنی دیگه به اون فضا نیاز نداری
نه برای اینکه:
❌ هر هفته دیسک خالی ببینی
❌ یا وجدان DBAت آروم بشه 😄
و این مساله هم برای فایل LDF صدق می کنه هم MDF.
بارها توی همه Job ها من Job برای Shrink دیدم و ایجاد Fragmentation بر روی LDF ها.
🎯 نتیجه:
به جای این همه «اتاق پس بده، اتاق بگیر»
یه فضای مناسب بگیر، درست استفاده کن،
و بگذار دیتابیس با آرامش رشد کنه
و برای کنترل LDF هم تهیه بکاپ منظم از Log ها به این مساله به شدت کمک می کنه.🧘♂️
hashtag#SQLServer hashtag#DBA hashtag#Shrink hashtag#Performance hashtag#DatabaseLife hashtag#طنز_فنی 😄
👍16👌6🙏2🤨2❤1
سلام دوستان
💼🌳 چالش همیشگی ما با درختهای سلسلهمراتبی در SQL!
همیشه وقتی با ساختار درختی کار میکنیم، معمولاً از ریشه شروع میکنیم و تا برگها میرویم.
اما یه سؤال جالب پیش میاد:
❓ فرض کنید شما یه نقطه وسط درخت دارید و میخواید بفهمید این رکورد به کدوم ریشه یا مدیر اصلی وصل میشه؟
برای مثال: مشخصات یک کارمند را دارید و میخواید ببینید در چارت سازمانی، مسیرش تا مدیر ارشد کجاست.
اینجاست که باید برعکس فکر کنید: از پایین به بالا حرکت کنید، نه از بالا به پایین.
و نکته جالب: در کدنویسی و SQL، مدل بازگشتی فرقی نمیکنه، فقط جهت پیمایش عوض میشه 😎
🔹 ساختار جدول عمومی (میتونید تست کنید)
Id → شناسه رکورد
ParentId → شناسه والد (NULL یعنی ریشه)
Name → نام رکورد
🔹 کوئری CTE برای پیدا کردن مسیر تا ریشه
اگر فقط ریشه براتون مهمه:
🔹 نکات حرفهای 💡
برای هر عمق درختی جواب میده
مناسب گزارشها، داشبوردها و تحلیل سلسلهمراتبی
میتونید مسیر رو به صورت رشته /Root/Parent/Child/... هم بسازید تا راحت نمایش بدید
🧠 تجربه شخصی:
وقتی شما از پایین شروع میکنید و مسیر تا ریشه رو پیدا میکنید، دید کاملتری نسبت به سلسلهمراتب پیدا میکنید.
مثل اینه که بفهمید یک کارمند دقیقاً تحت چه مدیریتی و چه شاخهای از سازمان قرار گرفته.
💼🌳 چالش همیشگی ما با درختهای سلسلهمراتبی در SQL!
همیشه وقتی با ساختار درختی کار میکنیم، معمولاً از ریشه شروع میکنیم و تا برگها میرویم.
اما یه سؤال جالب پیش میاد:
❓ فرض کنید شما یه نقطه وسط درخت دارید و میخواید بفهمید این رکورد به کدوم ریشه یا مدیر اصلی وصل میشه؟
برای مثال: مشخصات یک کارمند را دارید و میخواید ببینید در چارت سازمانی، مسیرش تا مدیر ارشد کجاست.
اینجاست که باید برعکس فکر کنید: از پایین به بالا حرکت کنید، نه از بالا به پایین.
و نکته جالب: در کدنویسی و SQL، مدل بازگشتی فرقی نمیکنه، فقط جهت پیمایش عوض میشه 😎
🔹 ساختار جدول عمومی (میتونید تست کنید)
CREATE TABLE Table1
(
Id UNIQUEIDENTIFIER PRIMARY KEY,
Name NVARCHAR(100),
ParentId UNIQUEIDENTIFIER NULL
);
Id → شناسه رکورد
ParentId → شناسه والد (NULL یعنی ریشه)
Name → نام رکورد
🔹 کوئری CTE برای پیدا کردن مسیر تا ریشه
DECLARE @InputId UNIQUEIDENTIFIER = 'YOUR_RECORD_ID_HERE';
WITH ReverseCTE AS
(
-- شروع از رکورد مورد نظر
SELECT Id, ParentId, Name, 0 AS Level
FROM Table1
WHERE Id = @InputId
UNION ALL
-- پیمایش به سمت والد
SELECT p.Id, p.ParentId, p.Name, c.Level + 1
FROM Table1 p
INNER JOIN ReverseCTE c ON c.ParentId = p.Id
WHERE c.ParentId IS NOT NULL
)
SELECT *
FROM ReverseCTE
ORDER BY Level DESC; -- ریشه بالای خروجی
اگر فقط ریشه براتون مهمه:
SELECT TOP 1 Id, Name
FROM ReverseCTE
ORDER BY Level DESC;
🔹 نکات حرفهای 💡
برای هر عمق درختی جواب میده
مناسب گزارشها، داشبوردها و تحلیل سلسلهمراتبی
میتونید مسیر رو به صورت رشته /Root/Parent/Child/... هم بسازید تا راحت نمایش بدید
🧠 تجربه شخصی:
وقتی شما از پایین شروع میکنید و مسیر تا ریشه رو پیدا میکنید، دید کاملتری نسبت به سلسلهمراتب پیدا میکنید.
مثل اینه که بفهمید یک کارمند دقیقاً تحت چه مدیریتی و چه شاخهای از سازمان قرار گرفته.
❤11👍6👌1💯1
تا حالا Running Total تو SQL Server نوشتی و با خیال راحت رد شدی؟ 😌
📌 معمولاً برای Running Total یه چیزی شبیه این مینویسیم:
همهچیز هم ظاهراً درسته…
اما دقیقاً همینجا مشکل شروع میشه 😐
🔍 مشکل کجاست؟
وقتی داخل OVER فقط ORDER BY مینویسیم و چیز دیگهای مشخص نمیکنیم،
خود SQL Server بهصورت پیشفرض از این استفاده میکنه 👇
و این یعنی چی؟ 🤔
یعنی اگر تو ستون ORDER BY (مثلاً OrderDate) مقدار تکراری وجود داشته باشه:
اونقوت SQL Server تمام ردیفهایی که تاریخ یکسان دارن رو «یک ردیف منطقی» در نظر میگیره
و Running Total برای همه اونها با هم محاسبه میشه
نتیجه؟
➕ جمع یههو میپره
😵💫 چیزی که حس میکنیم غلطه، ولی در واقع «غیرمنتظره» است
❗️ نکته مهم:
1- SQL Server اشتباه نکرده
2- ما ناخواسته رفتار RANGE رو فعال کردیم
🚀 راهحل درست و حرفهای:
اگه Running Total واقعی میخوای، یعنی ردیفبهردیف و بدون پرش،
باید صریح بنویسی:
یا حتی کوتاهتر:
✔️ محاسبه دقیق
✔️ بدون رفتار عجیب
✔️ بازدهی خیلی بهتر (In-Memory بهجای TempDB)
🧠 جمعبندی
همیشه Defaultها دوست ما نیستن
استفاده از RANGE فقط وقتی خوبه که عمداً بخوای Tieها یکی حساب بشن
برای ۹۹٪ سناریوهای Running Total → ROWS رو همیشه صریح بنویس
یه خط کداضافه ، ولی کلی تفاوت تو نتیجه و Performance 🔥
#SQLServer #TSQL #DBA #Performance #WindowFunctions #RunningTotal #DatabaseTips
📌 معمولاً برای Running Total یه چیزی شبیه این مینویسیم:
SUM(TotalDue) OVER (
PARTITION BY CustomerID
ORDER BY OrderDate
)
همهچیز هم ظاهراً درسته…
اما دقیقاً همینجا مشکل شروع میشه 😐
🔍 مشکل کجاست؟
وقتی داخل OVER فقط ORDER BY مینویسیم و چیز دیگهای مشخص نمیکنیم،
خود SQL Server بهصورت پیشفرض از این استفاده میکنه 👇
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
و این یعنی چی؟ 🤔
یعنی اگر تو ستون ORDER BY (مثلاً OrderDate) مقدار تکراری وجود داشته باشه:
اونقوت SQL Server تمام ردیفهایی که تاریخ یکسان دارن رو «یک ردیف منطقی» در نظر میگیره
و Running Total برای همه اونها با هم محاسبه میشه
نتیجه؟
➕ جمع یههو میپره
😵💫 چیزی که حس میکنیم غلطه، ولی در واقع «غیرمنتظره» است
❗️ نکته مهم:
1- SQL Server اشتباه نکرده
2- ما ناخواسته رفتار RANGE رو فعال کردیم
🚀 راهحل درست و حرفهای:
اگه Running Total واقعی میخوای، یعنی ردیفبهردیف و بدون پرش،
باید صریح بنویسی:
SUM(TotalDue) OVER (
PARTITION BY CustomerID
ORDER BY OrderDate
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
یا حتی کوتاهتر:
ROWS UNBOUNDED PRECEDING
✔️ محاسبه دقیق
✔️ بدون رفتار عجیب
✔️ بازدهی خیلی بهتر (In-Memory بهجای TempDB)
🧠 جمعبندی
همیشه Defaultها دوست ما نیستن
استفاده از RANGE فقط وقتی خوبه که عمداً بخوای Tieها یکی حساب بشن
برای ۹۹٪ سناریوهای Running Total → ROWS رو همیشه صریح بنویس
یه خط کداضافه ، ولی کلی تفاوت تو نتیجه و Performance 🔥
#SQLServer #TSQL #DBA #Performance #WindowFunctions #RunningTotal #DatabaseTips
👍14❤8🔥2
سلام دوستان
🚨 تا حالا شده بری Shrink File و با خودت بگی:
«اینا رو با یه SELECT نمیشه دید؟!» 🤔
خبر خوب برای DBAها و Backend Engineerها 🎉
بله… میشه! و حتی تمیزتر، سریعتر و قابل اتوماسیون 😎
🧠 مسئله چیه؟
تو SQL Server وقتی میری:
بخش Shrink Database
یا Shrink File
برای هر فایل اینا رو میبینی:
Total Size
Used Space
Free Space
اما این اطلاعات:
❌ اسکریپتپذیر نیست
❌ تو مانیتورینگ نمیاد
❌ تو گزارش DBA جایی نداره
🎯 سناریوی خیلی واقعی (احتمالاً الان داری باهاش دستوپنجه نرم میکنی 😅)
فرض کن:
روی یک سیستم تستی / Staging کار میکنی
میخوای روی یک دیتابیس خاص تغییرات سنگین بدی فضا کم آوردی 😬
اون دیتابیس هم ۱۰ تا Data File مختلف + یکی دوتا Log داره
حالا سوال مهم اینه 👇
👉 از کدوم فایل واقعاً میتونم فضا آزاد کنم؟
👉 کدوم فایل عملاً پره و Shrink روش جواب نمیده؟
اینجاست که Shrink UI دیگه کافی نیست…
و یه SELECT حسابی نجاتت میده 😏
✅ راهحل حرفهای
با کوئری زیر، دقیقاً همون چیزی که UI نشون میده رو میگیری
برای:
Data File 🗂
Log File 🧾
💎 این کوئری دقیقاً کجاها میدرخشه؟
✨ وقتی روی Test / QA / Staging فضا کم آوردی
✨ وقتی دیتابیس چندین فایل داره و تصمیمگیری سخته
✨ برای اینکه بدونی کدوم فایل ارزش Shrink داره
✨ قبل از Extend کردن دیسک (که همیشه هم در دسترس نیست 😐)
✨ توی Monitoring Dashboard
✨ برای Capacity Planning واقعی، نه حدسی
👥 این کد به درد کی میخوره؟
👨💻دوستان DBAها (Junior تا Senior)
👨💻همچنین Backend Engineerهایی که SQL Server دارن
🏢 تیمهای DevOps و Infra
📊 برای داشبوردهای Monitoring
⚠️ یادآوری دوستانه DBAطور
🔴اول اینکه Free Space ≠ Space قابل Shrink
🔴و Shrink مُسکنه، نه درمان
🔴 اول علت رشد فایل رو بفهم، بعد تصمیم بگیر
hashtag#SQLServer hashtag#DBA hashtag#Monitoring hashtag#CapacityPlanning hashtag#TSQL hashtag#DevOps hashtag#DataEngineering 🚀
🚨 تا حالا شده بری Shrink File و با خودت بگی:
«اینا رو با یه SELECT نمیشه دید؟!» 🤔
خبر خوب برای DBAها و Backend Engineerها 🎉
بله… میشه! و حتی تمیزتر، سریعتر و قابل اتوماسیون 😎
🧠 مسئله چیه؟
تو SQL Server وقتی میری:
بخش Shrink Database
یا Shrink File
برای هر فایل اینا رو میبینی:
Total Size
Used Space
Free Space
اما این اطلاعات:
❌ اسکریپتپذیر نیست
❌ تو مانیتورینگ نمیاد
❌ تو گزارش DBA جایی نداره
🎯 سناریوی خیلی واقعی (احتمالاً الان داری باهاش دستوپنجه نرم میکنی 😅)
فرض کن:
روی یک سیستم تستی / Staging کار میکنی
میخوای روی یک دیتابیس خاص تغییرات سنگین بدی فضا کم آوردی 😬
اون دیتابیس هم ۱۰ تا Data File مختلف + یکی دوتا Log داره
حالا سوال مهم اینه 👇
👉 از کدوم فایل واقعاً میتونم فضا آزاد کنم؟
👉 کدوم فایل عملاً پره و Shrink روش جواب نمیده؟
اینجاست که Shrink UI دیگه کافی نیست…
و یه SELECT حسابی نجاتت میده 😏
✅ راهحل حرفهای
با کوئری زیر، دقیقاً همون چیزی که UI نشون میده رو میگیری
برای:
Data File 🗂
Log File 🧾
SELECT
df.name,
df.type_desc,
df.physical_name,
df.size / 128.0 AS TotalSizeMB,
CASE
WHEN df.type = 1
THEN ls.used_log_space_in_bytes / 1024 / 1024
ELSE FILEPROPERTY(df.name, 'SpaceUsed') / 128.0
END AS UsedSpaceMB,
CASE
WHEN df.type = 1
THEN (df.size / 128.0) - (ls.used_log_space_in_bytes / 1024 / 1024)
ELSE (df.size - FILEPROPERTY(df.name, 'SpaceUsed')) / 128.0
END AS FreeSpaceMB
FROM sys.database_files df
OUTER APPLY sys.dm_db_log_space_usage ls;
💎 این کوئری دقیقاً کجاها میدرخشه؟
✨ وقتی روی Test / QA / Staging فضا کم آوردی
✨ وقتی دیتابیس چندین فایل داره و تصمیمگیری سخته
✨ برای اینکه بدونی کدوم فایل ارزش Shrink داره
✨ قبل از Extend کردن دیسک (که همیشه هم در دسترس نیست 😐)
✨ توی Monitoring Dashboard
✨ برای Capacity Planning واقعی، نه حدسی
👥 این کد به درد کی میخوره؟
👨💻دوستان DBAها (Junior تا Senior)
👨💻همچنین Backend Engineerهایی که SQL Server دارن
🏢 تیمهای DevOps و Infra
📊 برای داشبوردهای Monitoring
⚠️ یادآوری دوستانه DBAطور
🔴اول اینکه Free Space ≠ Space قابل Shrink
🔴و Shrink مُسکنه، نه درمان
🔴 اول علت رشد فایل رو بفهم، بعد تصمیم بگیر
hashtag#SQLServer hashtag#DBA hashtag#Monitoring hashtag#CapacityPlanning hashtag#TSQL hashtag#DevOps hashtag#DataEngineering 🚀
❤19👍1
سلام دوستان عزیزم
امیدوارم حالتون عالی باشه
من بعد از بیش از یک ماه تازه الان موفق شدم وصل بشم
این کانال رو در بله هم ساختم
گروه مشابهدهم در بله ساختم که اگه شرایط دوباره تغییر کرد بتونیم اونجا ادامه بدیم
لینک کانال
https://ble.ir/join/A5jkHESCYB
لینک گروه
https://ble.ir/join/741aKHYbrA
امیدوارم حالتون عالی باشه
من بعد از بیش از یک ماه تازه الان موفق شدم وصل بشم
این کانال رو در بله هم ساختم
گروه مشابهدهم در بله ساختم که اگه شرایط دوباره تغییر کرد بتونیم اونجا ادامه بدیم
لینک کانال
https://ble.ir/join/A5jkHESCYB
لینک گروه
https://ble.ir/join/741aKHYbrA
❤12👍3
سلام دوستان 👋
یه مدتیه دارم روی یه ایده کار میکنم و دوست دارم قبل از شروع، نظر شما رو بدونم.
قصدم اینه که یه سری وبینار کوتاه و کاربردی برگزار کنم؛ نه از اون مدل وبینارهایی که ۵۰ تا اسلاید نشون میدن و آخرش هم چیزی عاید آدم نمیشه!
بیشتر میخوام درباره چالشهای واقعی سازمانها صحبت کنیم. چیزهایی که توی پروژهها و شرکتها واقعاً باهاشون درگیریم:
قطعی سرویسها
مشکلات Performance
Backup و Disaster Recovery
مانیتورینگ و پیشگیری از بحران
رشد دیتابیسها و ظرفیت زیرساخت
امنیت و ریسکهای پنهان
قبل از اینکه موضوع اولین وبینار رو مشخص کنم، دوست دارم از خودتون بشنوم:
❓ بزرگترین چالشی که الان توی SQL Server، دیتابیس یا زیرساخت داده سازمانتون دارید چیه؟
❓ اگر قرار باشه فقط یک مشکل رو توی ۶ ماه آینده حل کنید، اون مشکل چیه؟
لطفاً توی کامنتها بنویسید. حتی اگر فکر میکنید موضوع خاصیه یا به درد بقیه نمیخوره.
همچنین توی نظرسنجی زیر هم شرکت کنید 👇
یه مدتیه دارم روی یه ایده کار میکنم و دوست دارم قبل از شروع، نظر شما رو بدونم.
قصدم اینه که یه سری وبینار کوتاه و کاربردی برگزار کنم؛ نه از اون مدل وبینارهایی که ۵۰ تا اسلاید نشون میدن و آخرش هم چیزی عاید آدم نمیشه!
بیشتر میخوام درباره چالشهای واقعی سازمانها صحبت کنیم. چیزهایی که توی پروژهها و شرکتها واقعاً باهاشون درگیریم:
قطعی سرویسها
مشکلات Performance
Backup و Disaster Recovery
مانیتورینگ و پیشگیری از بحران
رشد دیتابیسها و ظرفیت زیرساخت
امنیت و ریسکهای پنهان
قبل از اینکه موضوع اولین وبینار رو مشخص کنم، دوست دارم از خودتون بشنوم:
❓ بزرگترین چالشی که الان توی SQL Server، دیتابیس یا زیرساخت داده سازمانتون دارید چیه؟
❓ اگر قرار باشه فقط یک مشکل رو توی ۶ ماه آینده حل کنید، اون مشکل چیه؟
لطفاً توی کامنتها بنویسید. حتی اگر فکر میکنید موضوع خاصیه یا به درد بقیه نمیخوره.
همچنین توی نظرسنجی زیر هم شرکت کنید 👇
👍10👏5
اگر قرار باشه در اولین وبینار شرکت کنید، کدوم موضوع براتون جذابتره؟
Anonymous Poll
35%
۵ ریسک پنهان SQL Server که معمولاً دیر متوجهشون میشیم
23%
Disaster Recovery واقعی؛ آیا واقعاً برای بحران آمادهایم؟
28%
چطور سلامت SQL Server رو ارزیابی کنیم؟ (Health Check)
56%
مانیتورینگ SQL Server؛ از تشخیص مشکل تا پیشبینی بحران
30%
Performance و Capacity Planning در سازمانهای در حال رشد
30%
Performance و Capacity Planning در سازمانهای در حال رشد
اگر دوست دارید یکی از چالشهای واقعی سازمان شما (به صورت کاملاً ناشناس) توی یکی از وبینارها بررسی بشه، فقط بنویسید:
«علاقهمندم»
تا برای هماهنگی باهاتون در ارتباط باشم. 🙏
«علاقهمندم»
تا برای هماهنگی باهاتون در ارتباط باشم. 🙏
👌9
روزی از یک مرکز درمانی با من تماس گرفتند 📞
گفتند سیستم به شدت کند شده و عملاً کار پذیرش با مشکل مواجه شده است ⚠️
پشت هر کندی سیستم در مراکز درمانی، فقط چند ثانیه تأخیر نیست…
بیمار منتظر است 🧍♂️
پذیرش کلافه شده 😓
صف طولانیتر میشود ⏳
پزشک منتظر ثبت اطلاعات است 🩺
و فشار کاری لحظه به لحظه بیشتر میشود
به صورت آنلاین وارد سرور شدم و بررسی را شروع کردم 💻
اولین نکته این بود که SQL Server به نسخه جدید ارتقا پیدا کرده بود و Compatibility Level هم تغییر کرده بود. آن را به حالت قبلی برگرداندم 🔧
بعد سراغ منابع سرور رفتم
CPU به شدت درگیر بود 🔥
تنظیمات MAXDOP اصلاح شد و کمی وضعیت بهتر شد، اما مشکل اصلی هنوز باقی بود
در مرحله بعد Query Store را بررسی کردم و Queryهای پرمصرف را بر اساس CPU استخراج کردم 📊
نتیجه واضح بود
یک Query پرتکرار که ایندکس مناسب نداشت، بخش بزرگی از CPU را مصرف میکرد
ایندکس ایجاد شد ⚙️
چند دقیقه بعد، مصرف CPU به شکل محسوسی کاهش پیدا کرد 📉
و سیستم به حالت عادی برگشت ✅
کل این بحران-از صفهای طولانی تا نارضایتی کاربران-در نهایت به نبود یک ایندکس مناسب ختم شد
و اینجاست که همیشه این جمله برایم پررنگتر میشود:
مانیتورینگ پایگاه داده و حضور یک DBA فقط برای زمانی نیست که همه چیز خوب است…
ارزش واقعی آن زمانی مشخص میشود که سیستم در آستانه فروپاشی است 🚨
گاهی تفاوت بین یک روز عادی و یک بحران بزرگ، فقط یک ایندکس است 🎯
گفتند سیستم به شدت کند شده و عملاً کار پذیرش با مشکل مواجه شده است ⚠️
پشت هر کندی سیستم در مراکز درمانی، فقط چند ثانیه تأخیر نیست…
بیمار منتظر است 🧍♂️
پذیرش کلافه شده 😓
صف طولانیتر میشود ⏳
پزشک منتظر ثبت اطلاعات است 🩺
و فشار کاری لحظه به لحظه بیشتر میشود
به صورت آنلاین وارد سرور شدم و بررسی را شروع کردم 💻
اولین نکته این بود که SQL Server به نسخه جدید ارتقا پیدا کرده بود و Compatibility Level هم تغییر کرده بود. آن را به حالت قبلی برگرداندم 🔧
بعد سراغ منابع سرور رفتم
CPU به شدت درگیر بود 🔥
تنظیمات MAXDOP اصلاح شد و کمی وضعیت بهتر شد، اما مشکل اصلی هنوز باقی بود
در مرحله بعد Query Store را بررسی کردم و Queryهای پرمصرف را بر اساس CPU استخراج کردم 📊
نتیجه واضح بود
یک Query پرتکرار که ایندکس مناسب نداشت، بخش بزرگی از CPU را مصرف میکرد
ایندکس ایجاد شد ⚙️
چند دقیقه بعد، مصرف CPU به شکل محسوسی کاهش پیدا کرد 📉
و سیستم به حالت عادی برگشت ✅
کل این بحران-از صفهای طولانی تا نارضایتی کاربران-در نهایت به نبود یک ایندکس مناسب ختم شد
و اینجاست که همیشه این جمله برایم پررنگتر میشود:
مانیتورینگ پایگاه داده و حضور یک DBA فقط برای زمانی نیست که همه چیز خوب است…
ارزش واقعی آن زمانی مشخص میشود که سیستم در آستانه فروپاشی است 🚨
گاهی تفاوت بین یک روز عادی و یک بحران بزرگ، فقط یک ایندکس است 🎯
👍31🔥11❤2🤣2
خیلی ازمن این سوال پرسیده میشه که میخوایم SQL Server رو شروع کنیم باید چیکار کنیم.
ببینید شما اول باید مشخص کنید در چه مسیری میخواین پیش برید
این چند مسیر در ادامه یادگیری SQL Server وجود داره.
1- فعالیت به عنوان DBA یا Database Administrator
2- فعالیت به عنوان T-SQL Developer
3- فعالیت به عنوان تحلیلگر داده و طراح گزارشات
خوب برای هر سه مسیر اولین و مهمترین چیز ، یادگیری T-SQL هست. هیچکدوم از این سه مسیر بدون یادگیری حرفه ای T-SQLمعنی ندارن.
برای T-SQL بهترین و کاملترین منبع ، کتاب T-SQL Fundamental آقای Itzik Ben-GAN هست . من هم همین کتاب رو به صورت کامل در مکتبخونه تدریس کردم که لینکش رو قرار میدم.
خوب حالا مسیر اول شما باید علاقمند باشین به دیباگ سرورها ، بتونید استرس خودتون رو کنترل کنید. علاقمند باشین به کارهای پیچیده و پرحجم. مطالعات عمیق روی حوزه های مختلف داشته باشین.
برای مسیر دوم باید همین مسیر T-SQL رو پیشرفته تر مطالعه کنید و به حوزه Performance Tuning هم سری بزنید. ( یک دوره هم دراین زمینه در مکتبخونه ضبط کردم)
برای حوزه سوم بعد از درک کامل T-SQL باید به سراغ مفاهیم BI برید و با داشبوردها کار کنید. با ETL ها کار کنید و با SSAS آشنا بشین.
بعد هم در ادامه برید سراغ پایتون و یادگیری ماشین برای تحلیل های عمیقتر.
برای حرفه ای شدن در هر حوزه حداقل یک سال زمان نیاز خواهید داشت
برای هر حوزه هم بازارکار خیلی خوبی در کشور وجود داره و به شدت بازار کار تشنه هست.
اینم لینک هر دو دوره .
https://maktabkhooneh.org/course/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-sql-server-performance-tuning-mk6185/?v=1
https://maktabkhooneh.org/course/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-sql-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-sql-server-mk1378/?v=1
ببینید شما اول باید مشخص کنید در چه مسیری میخواین پیش برید
این چند مسیر در ادامه یادگیری SQL Server وجود داره.
1- فعالیت به عنوان DBA یا Database Administrator
2- فعالیت به عنوان T-SQL Developer
3- فعالیت به عنوان تحلیلگر داده و طراح گزارشات
خوب برای هر سه مسیر اولین و مهمترین چیز ، یادگیری T-SQL هست. هیچکدوم از این سه مسیر بدون یادگیری حرفه ای T-SQLمعنی ندارن.
برای T-SQL بهترین و کاملترین منبع ، کتاب T-SQL Fundamental آقای Itzik Ben-GAN هست . من هم همین کتاب رو به صورت کامل در مکتبخونه تدریس کردم که لینکش رو قرار میدم.
خوب حالا مسیر اول شما باید علاقمند باشین به دیباگ سرورها ، بتونید استرس خودتون رو کنترل کنید. علاقمند باشین به کارهای پیچیده و پرحجم. مطالعات عمیق روی حوزه های مختلف داشته باشین.
برای مسیر دوم باید همین مسیر T-SQL رو پیشرفته تر مطالعه کنید و به حوزه Performance Tuning هم سری بزنید. ( یک دوره هم دراین زمینه در مکتبخونه ضبط کردم)
برای حوزه سوم بعد از درک کامل T-SQL باید به سراغ مفاهیم BI برید و با داشبوردها کار کنید. با ETL ها کار کنید و با SSAS آشنا بشین.
بعد هم در ادامه برید سراغ پایتون و یادگیری ماشین برای تحلیل های عمیقتر.
برای حرفه ای شدن در هر حوزه حداقل یک سال زمان نیاز خواهید داشت
برای هر حوزه هم بازارکار خیلی خوبی در کشور وجود داره و به شدت بازار کار تشنه هست.
اینم لینک هر دو دوره .
https://maktabkhooneh.org/course/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-sql-server-performance-tuning-mk6185/?v=1
https://maktabkhooneh.org/course/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-sql-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-sql-server-mk1378/?v=1
مکتبخونه
آموزش SQL Server Performance Tuning
در این دوره در خصوص مانیتور کردن SQL Server یاد خواهیم گرفت و همچنین طریقه شناسایی چالش ها و گلوگاه ها را بررسی می کنیم.
❤22💯1
سلام دوستان
📊 چرا با وجود صرف هزینههای زیاد برای ساخت گزارشها، بسیاری از آنها در عمل استفاده نمیشوند؟
در یکی از پروژههایی که روی آن کار میکردم، کنار یکی از کاربران سازمان نشستم تا ببینم گزارشها را چطور استفاده میکند.
اتفاق جالبی افتاد.
کاربر گزارش را باز کرد، چند ثانیه به آن نگاه کرد و بعد... فایل Excel شخصی خودش را باز کرد.
شروع کرد اطلاعات گزارش را یکییکی وارد Excel کند و تحلیلش را آنجا ادامه داد.
همان لحظه یک سؤال در ذهنم شکل گرفت...
اگر سازمانها برای طراحی گزارشها زمان، انرژی و هزینه زیادی صرف میکنند، چرا بسیاری از کاربران در نهایت دوباره به Excel برمیگردند؟ 🤔
آیا مشکل از کیفیت گزارشهاست؟
یا گزارشها بر اساس نیاز واقعی کاربران طراحی نمیشوند؟
یا شاید اصلاً مسئله چیز دیگری است...
من فعلاً قصد ندارم به این سؤال پاسخ بدهم.
دوست دارم از تجربه شما یاد بگیرم. 🌱
اگر در سازمانتان گزارشهایی وجود دارد که کمتر از آنچه انتظار میرفت مورد استفاده قرار میگیرند، به نظر شما مهمترین دلیل چیست؟
👤 فرقی نمیکند مدیرعامل باشید، مدیر واحد، کارشناس، تحلیلگر داده، DBA یا توسعهدهنده BI.
تجربه شما میتواند به شناخت یک الگوی مشترک در سازمانها کمک کند.
💬 مشتاقم نظرات و تجربههای واقعی شما را بخوانم.
━━━━━━━━━━━━━━
🔍 Organizational Patterns
من در حال مطالعه الگوهای مشترک در سازمانها هستم؛ الگوهایی که بر نحوه تصمیمگیری، همکاری تیمها و خلق ارزش اثر میگذارند.
اگر تجربه مشابهی دارید، خوشحال میشوم آن را در بخش نظرات با من و دیگران به اشتراک بگذارید.
🧩 Organizational Pattern #001
📊 چرا با وجود صرف هزینههای زیاد برای ساخت گزارشها، بسیاری از آنها در عمل استفاده نمیشوند؟
در یکی از پروژههایی که روی آن کار میکردم، کنار یکی از کاربران سازمان نشستم تا ببینم گزارشها را چطور استفاده میکند.
اتفاق جالبی افتاد.
کاربر گزارش را باز کرد، چند ثانیه به آن نگاه کرد و بعد... فایل Excel شخصی خودش را باز کرد.
شروع کرد اطلاعات گزارش را یکییکی وارد Excel کند و تحلیلش را آنجا ادامه داد.
همان لحظه یک سؤال در ذهنم شکل گرفت...
اگر سازمانها برای طراحی گزارشها زمان، انرژی و هزینه زیادی صرف میکنند، چرا بسیاری از کاربران در نهایت دوباره به Excel برمیگردند؟ 🤔
آیا مشکل از کیفیت گزارشهاست؟
یا گزارشها بر اساس نیاز واقعی کاربران طراحی نمیشوند؟
یا شاید اصلاً مسئله چیز دیگری است...
من فعلاً قصد ندارم به این سؤال پاسخ بدهم.
دوست دارم از تجربه شما یاد بگیرم. 🌱
اگر در سازمانتان گزارشهایی وجود دارد که کمتر از آنچه انتظار میرفت مورد استفاده قرار میگیرند، به نظر شما مهمترین دلیل چیست؟
👤 فرقی نمیکند مدیرعامل باشید، مدیر واحد، کارشناس، تحلیلگر داده، DBA یا توسعهدهنده BI.
تجربه شما میتواند به شناخت یک الگوی مشترک در سازمانها کمک کند.
💬 مشتاقم نظرات و تجربههای واقعی شما را بخوانم.
━━━━━━━━━━━━━━
🔍 Organizational Patterns
من در حال مطالعه الگوهای مشترک در سازمانها هستم؛ الگوهایی که بر نحوه تصمیمگیری، همکاری تیمها و خلق ارزش اثر میگذارند.
اگر تجربه مشابهی دارید، خوشحال میشوم آن را در بخش نظرات با من و دیگران به اشتراک بگذارید.
🧩 Organizational Pattern #001
👍3🤣2❤1
سلام
📊 چند روز پیش درباره این سؤال نوشتم که چرا بسیاری از گزارشها و داشبوردهای سازمانی استفاده نمیشوند.
صادقانه بگویم، انتظار داشتم بیشتر درباره ابزارها، تکنولوژی یا نحوه طراحی گزارش صحبت شود.
اما چیزی که از دل گفتگوها بیرون آمد، برای خودم هم جالب بود.
تقریباً هرکسی از زاویه تجربه خودش به موضوع نگاه میکرد:
🔹 یکی میگفت باید کنار کاربر نشست و رفتار واقعی او را دید.
🔹 دیگری میگفت همیشه چنین فرصتی وجود ندارد و محدودیتهای سازمانی را هم باید در نظر گرفت.
🔹 فردی روی آموزش کاربران و نقش Master Trainer تأکید داشت.
🔹 عدهای معتقد بودند مشکل اصلی، بلوغ پایین سازمانها در استفاده از داده است.
نکتهای که برای من پررنگ شد این بود که ما معمولاً تصور میکنیم همه درباره یک مسئله صحبت میکنیم؛ در حالی که هرکدام از ما در حال توصیف بخشی از یک سیستم بزرگتر هستیم.
شاید مسئله اصلی «گزارش» نباشد.
شاید مسئله، فاصلهای باشد که بین نگاه توسعهدهنده، مدیر، کاربر و تصمیمگیرنده وجود دارد.
هرکدام واقعیت را از زاویه خودش میبیند و اگر این زاویهها به هم متصل نشوند، حتی بهترین نرمافزارها هم نمیتوانند ارزش واقعی ایجاد کنند.
برای من، این گفتگو فقط درباره گزارش نبود؛ بلکه شروع یک سؤال بزرگتر بود:
"❓ به نظر شما، بزرگترین شکاف بین تیمهای فنی و کسبوکار در سازمانها چیست؟ "
اگر تجربهای دارید، خوشحال میشوم آن را بخوانم. احتمالاً پاسخها، مثل دفعه قبل، از خود سؤال ارزشمندتر خواهند بود.
🧩 Organizational Pattern #002
📊 چند روز پیش درباره این سؤال نوشتم که چرا بسیاری از گزارشها و داشبوردهای سازمانی استفاده نمیشوند.
صادقانه بگویم، انتظار داشتم بیشتر درباره ابزارها، تکنولوژی یا نحوه طراحی گزارش صحبت شود.
اما چیزی که از دل گفتگوها بیرون آمد، برای خودم هم جالب بود.
تقریباً هرکسی از زاویه تجربه خودش به موضوع نگاه میکرد:
🔹 یکی میگفت باید کنار کاربر نشست و رفتار واقعی او را دید.
🔹 دیگری میگفت همیشه چنین فرصتی وجود ندارد و محدودیتهای سازمانی را هم باید در نظر گرفت.
🔹 فردی روی آموزش کاربران و نقش Master Trainer تأکید داشت.
🔹 عدهای معتقد بودند مشکل اصلی، بلوغ پایین سازمانها در استفاده از داده است.
نکتهای که برای من پررنگ شد این بود که ما معمولاً تصور میکنیم همه درباره یک مسئله صحبت میکنیم؛ در حالی که هرکدام از ما در حال توصیف بخشی از یک سیستم بزرگتر هستیم.
شاید مسئله اصلی «گزارش» نباشد.
شاید مسئله، فاصلهای باشد که بین نگاه توسعهدهنده، مدیر، کاربر و تصمیمگیرنده وجود دارد.
هرکدام واقعیت را از زاویه خودش میبیند و اگر این زاویهها به هم متصل نشوند، حتی بهترین نرمافزارها هم نمیتوانند ارزش واقعی ایجاد کنند.
برای من، این گفتگو فقط درباره گزارش نبود؛ بلکه شروع یک سؤال بزرگتر بود:
"❓ به نظر شما، بزرگترین شکاف بین تیمهای فنی و کسبوکار در سازمانها چیست؟ "
اگر تجربهای دارید، خوشحال میشوم آن را بخوانم. احتمالاً پاسخها، مثل دفعه قبل، از خود سؤال ارزشمندتر خواهند بود.
🧩 Organizational Pattern #002
❤4👏1
چالش های SQL Server
Anonymous Poll
17%
کاهش قطعی سرویس (Downtime) و افزایش پایداری
26%
افزایش امنیت، Audit و شناسایی تهدیدها
24%
بهبود Backup، Restore و Disaster Recovery
60%
رفع مشکلات Performance و کندی سیستم
25%
مانیتورینگ هوشمند و Alertهای دقیقتر
21%
تشخیص سریع علت اصلی مشکلات (Root Cause Analysis)
❤2
چند روز پیش روی یکی از دیتابیسها با یک سناریوی جالب روبهرو شدم که شاید برای خیلی از DBAها آشنا باشد.
کاربران از کندی شدید سیستم شکایت داشتند.
⏱️ زمان اجرای بعضی Updateها به ۷ تا ۸ ثانیه رسیده بود.
اولین چیزی که در Wait Stats جلب توجه میکرد، مقدار بالای LCK_M_U بود.
اگر فقط به همین Wait نگاه کنیم، احتمالاً اولین حدس این است که مشکل از Locking، Isolation Level یا یک Query بد است.
اما وقتی Blocking Chain را بررسی کردم، داستان چیز دیگری بود...
تقریباً تمام Sessionها پشت یک Session Block شده بودند.
و آن Session فقط یک Wait قابل توجه داشت:
🔴 WRITELOG
همانجا مشخص شد که احتمالاً مشکل اصلی Lock نیست.
مشکل این بود که Commit تراکنشها دیر انجام میشد.
در SQL Server، در حالت عادی (Full Durability)، زمانی که دستور COMMIT اجرا میشود، باید رکوردهای Transaction Log مربوط به آن تراکنش روی فایل Log (LDF) پایدار (Harden) شوند. تا زمانی که Commit کامل نشود، Lockهای آن تراکنش نیز آزاد نمیشوند.
بنابراین اگر به هر دلیلی Flush شدن Transaction Log کند باشد:
یک اینکه Commit دیرتر کامل میشود.
دوم اینکه Lockها مدت بیشتری نگه داشته میشوند.
سوم اینکه Sessionهای دیگر پشت آن منتظر میمانند.
و نتیجه چیزی است که ما به شکل LCK_M_U و Blocking مشاهده میکنیم.
برای اطمینان از فرضیه، روی Database گزینه Delayed Durability را در حالت ALLOWED فعال کردم.
نتیجه واقعاً جالب بود.
🚀 زمان Updateها از حدود ۷ تا ۸ ثانیه به کمتر از ۱۰۰ میلیثانیه رسید.
تقریباً تمام Blockingها از بین رفتند.
این تجربه دوباره یک نکته مهم را برایم یادآوری کرد:
💡 همیشه بزرگترین Wait الزاماً ریشه مشکل نیست.
گاهی چیزی که میبینیم فقط اثر دومینویی یک Bottleneck دیگر است.
در این سناریو، LCK_M_U علت نبود؛ پیامد بود.
ریشه اصلی، WRITELOG بود که باعث میشد Commitها دیرتر کامل شوند و در نتیجه Lockها نیز دیرتر آزاد شوند.
البته یک نکته مهم را هم نباید فراموش کرد.
توجه : Delayed Durability یک راهکار بدون هزینه نیست.
وقتی آن را فعال میکنید، SQL Server ممکن است بعضی Commitها را قبل از Flush شدن Log به دیسک به Application برگرداند. اگر قبل از Flush، Crash یا قطع برق اتفاق بیفتد، آخرین Transactionهای Commit شده اما هنوز Flush نشده ممکن است از بین بروند.
به همین دلیل، این قابلیت باید با توجه به نیازهای کسبوکار و میزان ریسک قابل قبول استفاده شود؛ نه صرفاً برای کاهش Waitها.
❓برای شما هم پیش آمده که یک Wait مثل LCK_M_U فقط یک علامت باشد و بعد از بررسی دقیقتر متوجه شوید ریشه اصلی مشکل جای دیگری بوده است؟
کاربران از کندی شدید سیستم شکایت داشتند.
⏱️ زمان اجرای بعضی Updateها به ۷ تا ۸ ثانیه رسیده بود.
اولین چیزی که در Wait Stats جلب توجه میکرد، مقدار بالای LCK_M_U بود.
اگر فقط به همین Wait نگاه کنیم، احتمالاً اولین حدس این است که مشکل از Locking، Isolation Level یا یک Query بد است.
اما وقتی Blocking Chain را بررسی کردم، داستان چیز دیگری بود...
تقریباً تمام Sessionها پشت یک Session Block شده بودند.
و آن Session فقط یک Wait قابل توجه داشت:
🔴 WRITELOG
همانجا مشخص شد که احتمالاً مشکل اصلی Lock نیست.
مشکل این بود که Commit تراکنشها دیر انجام میشد.
در SQL Server، در حالت عادی (Full Durability)، زمانی که دستور COMMIT اجرا میشود، باید رکوردهای Transaction Log مربوط به آن تراکنش روی فایل Log (LDF) پایدار (Harden) شوند. تا زمانی که Commit کامل نشود، Lockهای آن تراکنش نیز آزاد نمیشوند.
بنابراین اگر به هر دلیلی Flush شدن Transaction Log کند باشد:
یک اینکه Commit دیرتر کامل میشود.
دوم اینکه Lockها مدت بیشتری نگه داشته میشوند.
سوم اینکه Sessionهای دیگر پشت آن منتظر میمانند.
و نتیجه چیزی است که ما به شکل LCK_M_U و Blocking مشاهده میکنیم.
برای اطمینان از فرضیه، روی Database گزینه Delayed Durability را در حالت ALLOWED فعال کردم.
نتیجه واقعاً جالب بود.
🚀 زمان Updateها از حدود ۷ تا ۸ ثانیه به کمتر از ۱۰۰ میلیثانیه رسید.
تقریباً تمام Blockingها از بین رفتند.
این تجربه دوباره یک نکته مهم را برایم یادآوری کرد:
💡 همیشه بزرگترین Wait الزاماً ریشه مشکل نیست.
گاهی چیزی که میبینیم فقط اثر دومینویی یک Bottleneck دیگر است.
در این سناریو، LCK_M_U علت نبود؛ پیامد بود.
ریشه اصلی، WRITELOG بود که باعث میشد Commitها دیرتر کامل شوند و در نتیجه Lockها نیز دیرتر آزاد شوند.
البته یک نکته مهم را هم نباید فراموش کرد.
توجه : Delayed Durability یک راهکار بدون هزینه نیست.
وقتی آن را فعال میکنید، SQL Server ممکن است بعضی Commitها را قبل از Flush شدن Log به دیسک به Application برگرداند. اگر قبل از Flush، Crash یا قطع برق اتفاق بیفتد، آخرین Transactionهای Commit شده اما هنوز Flush نشده ممکن است از بین بروند.
به همین دلیل، این قابلیت باید با توجه به نیازهای کسبوکار و میزان ریسک قابل قبول استفاده شود؛ نه صرفاً برای کاهش Waitها.
❓برای شما هم پیش آمده که یک Wait مثل LCK_M_U فقط یک علامت باشد و بعد از بررسی دقیقتر متوجه شوید ریشه اصلی مشکل جای دیگری بوده است؟
👏9❤8👍4
سلام دوستان عزیزم.
👨💻 یکی از سوالهایی که همیشه ازم میپرسن اینه که:
«توی مصاحبه فنی از افراد چی میپرسی؟» 🤔
پیرو چند پست قبلی که درباره مصاحبه نوشتم، بد نیست اینم بگم که من معمولا افراد رو از نظر سطح دانش به چهار دسته تقسیم میکنم:
🔹 کارآموز
🔹 مبتدی
🔹 متوسط
🔹 حرفهای
و جالبه که نوع سوالاتم برای هر کدوم کاملا فرق میکنه.
مثلا اگر کسی بگه:
«من Senior هستم» 😎
راستش اولین چیزی که برام مهمه این نیست که چند تا Query از حفظ بلده یا چقدر سریع کد مینویسه.
اتفاقا خیلی از مصاحبهها از همون دقیقه اول میگن:
"این مسئله رو حل کن، کدش رو بنویس."
این روش بد نیست... ولی من بیشتر دوست دارم قبل از اینکه حتی به کد برسیم، بفهمم اون آدم دیتابیس رو واقعا درک کرده یا فقط باهاش کار کرده.
مثلا ازش میپرسم:
🟢وقتی SQL Server Engine این Query رو اجرا میکنه چه رفتاری داره؟
🟢 اثری که این کد روی Performance میذاره چیه؟
🟢 اگر سیستم کند بشه، از کجا شروع میکنی مشکل رو پیدا کنی؟
🟢 وقتی یک نیاز از سمت کاربر میاد، چطور اون رو تبدیل به طراحی دیتابیس و پیادهسازی میکنی؟
🟢 اگر بین چند راهحل انتخاب داشته باشی، چرا یکی رو انتخاب میکنی؟
برای من طرز فکر آدمها از خود جوابها مهمتره.
اما وقتی طرف در سطح مبتدی یا متوسط باشه، طبیعتا انتظارم فرق میکنه.
اونجا بیشتر میرم سراغ مفاهیم پایه:
✅ این دستور دقیقا چه کاری انجام میده؟
✅ کجا باید ازش استفاده کرد؟
✅ تفاوتش با دستور مشابهش چیه؟
✅ اگر بخوای این مسئله رو حل کنی، اولین قدمت چیه؟
و یکی از سوالهای مورد علاقهم همیشه اینه:
💡 «جذابترین چالشی که تا امروز حل کردی چی بوده؟»
نه برای اینکه جواب درست یا غلط داره...
برای اینکه از روی نحوه تعریف کردنش میشه فهمید:
چقدر عمیق فکر میکنه.
چطور مسئله رو تحلیل میکنه.
از چه ابزارهایی استفاده کرده.
و مهمتر از همه... آیا از حل کردن مسئله لذت میبره یا فقط دنبال بستن تیکت بوده؟ 😄
به نظر من، گاهی با همین چند سوال میشه شناختی از یک مهندس به دست آورد که شاید با یک ساعت کدنویسی هم به دست نیاد.
❓حالا دوست دارم نظر شما رو هم بدونم.
اگر شما مصاحبهکننده باشید، اولین سوالی که از یک Database Developer یا Data Engineer میپرسید چیه؟
👨💻 یکی از سوالهایی که همیشه ازم میپرسن اینه که:
«توی مصاحبه فنی از افراد چی میپرسی؟» 🤔
پیرو چند پست قبلی که درباره مصاحبه نوشتم، بد نیست اینم بگم که من معمولا افراد رو از نظر سطح دانش به چهار دسته تقسیم میکنم:
🔹 کارآموز
🔹 مبتدی
🔹 متوسط
🔹 حرفهای
و جالبه که نوع سوالاتم برای هر کدوم کاملا فرق میکنه.
مثلا اگر کسی بگه:
«من Senior هستم» 😎
راستش اولین چیزی که برام مهمه این نیست که چند تا Query از حفظ بلده یا چقدر سریع کد مینویسه.
اتفاقا خیلی از مصاحبهها از همون دقیقه اول میگن:
"این مسئله رو حل کن، کدش رو بنویس."
این روش بد نیست... ولی من بیشتر دوست دارم قبل از اینکه حتی به کد برسیم، بفهمم اون آدم دیتابیس رو واقعا درک کرده یا فقط باهاش کار کرده.
مثلا ازش میپرسم:
🟢وقتی SQL Server Engine این Query رو اجرا میکنه چه رفتاری داره؟
🟢 اثری که این کد روی Performance میذاره چیه؟
🟢 اگر سیستم کند بشه، از کجا شروع میکنی مشکل رو پیدا کنی؟
🟢 وقتی یک نیاز از سمت کاربر میاد، چطور اون رو تبدیل به طراحی دیتابیس و پیادهسازی میکنی؟
🟢 اگر بین چند راهحل انتخاب داشته باشی، چرا یکی رو انتخاب میکنی؟
برای من طرز فکر آدمها از خود جوابها مهمتره.
اما وقتی طرف در سطح مبتدی یا متوسط باشه، طبیعتا انتظارم فرق میکنه.
اونجا بیشتر میرم سراغ مفاهیم پایه:
✅ این دستور دقیقا چه کاری انجام میده؟
✅ کجا باید ازش استفاده کرد؟
✅ تفاوتش با دستور مشابهش چیه؟
✅ اگر بخوای این مسئله رو حل کنی، اولین قدمت چیه؟
و یکی از سوالهای مورد علاقهم همیشه اینه:
💡 «جذابترین چالشی که تا امروز حل کردی چی بوده؟»
نه برای اینکه جواب درست یا غلط داره...
برای اینکه از روی نحوه تعریف کردنش میشه فهمید:
چقدر عمیق فکر میکنه.
چطور مسئله رو تحلیل میکنه.
از چه ابزارهایی استفاده کرده.
و مهمتر از همه... آیا از حل کردن مسئله لذت میبره یا فقط دنبال بستن تیکت بوده؟ 😄
به نظر من، گاهی با همین چند سوال میشه شناختی از یک مهندس به دست آورد که شاید با یک ساعت کدنویسی هم به دست نیاد.
❓حالا دوست دارم نظر شما رو هم بدونم.
اگر شما مصاحبهکننده باشید، اولین سوالی که از یک Database Developer یا Data Engineer میپرسید چیه؟
💯10❤4👌3