پرتکرارترین سؤالات، چالشها و راهکارها در SQL Server
🧩 1️⃣ Performance Optimization (بهینهسازی کوئریها)
چالشها:
- Query کند اجرا میشود
- CPU بالا میرود
- IO زیاد است
- Deadlock و Blocking
راهکارها:
- بررسی Execution Plan
- استفاده از Index مناسب (Covering Index, Composite Index)
- اجتناب از **SELECT ***
- محدود کردن دادهها با
WHEREوTOP - استفاده از Temp Table برای شکستن queryهای پیچیده
- جایگزینی Cursor با query set-based
- استفاده از Stored Procedure Parameter Sniffing Fix (با
OPTION (RECOMPILE)یا local variable)
⚙️ 2️⃣ Indexing Strategy (استراتژی ایندکسها)
سؤالات احتمالی:
- تفاوت Clustered و Non-Clustered Index چیه؟
- چند تا Clustered Index میشه داشت؟
- Fragmentation چیه و چطور حلش میکنی؟
- Fill Factor یعنی چی؟
راهکارها:
- بازسازی ایندکسها:
ALTER INDEX ALL ON Orders REBUILD WITH (FILLFACTOR = 90); - بررسی ایندکسهای بیاستفاده:
SELECT * FROM sys.dm_db_index_usage_stats; - ساخت ایندکس پوششی (Covering Index):
CREATE NONCLUSTERED INDEX IX_Orders_Date_Status ON Orders (OrderDate, OrderStatus) INCLUDE (CustomerID, TotalAmount);
🔐 3️⃣ Security & Permissions
سؤالات:
- چطور دسترسی کاربران را محدود میکنی؟
- تفاوت
db_datareader,db_datawriter,db_ownerچیه؟ - چطور دسترسی به Linked Server را امن میکنی؟
- چطور connection string رو ایمن نگه میداری؟
نکات:
- اصل Least Privilege (حداقل دسترسی ممکن)
- جدا کردن یوزرهای اپلیکیشن از یوزرهای ادمین
- استفاده از Stored Procedure بهجای دادن direct access به جداول
🧠 4️⃣ Concurrency & Locking / Blocking / Deadlock
سؤالات:
- Deadlock چیه و چطور ازش جلوگیری میکنی؟
- Isolation Levelها رو توضیح بده
- فرق Read Committed و Snapshot چیه؟
راهکارها:
Deadlock: دو تراکنش منتظر قفل همدیگر → یکی کشته میشود
راههای جلوگیری: تراکنش کوتاه، ترتیب دسترسی ثابت، Lock Hint، Snapshot
Isolation Level: تعیین نحوه تعامل تراکنشها با هم و Lockها
Read Committed vs Snapshot:
- Read Committed: دادههای Commit شده خوانده میشوند، ممکن است Non-Repeatable Read و Phantom رخ دهد
- Snapshot: نسخه ثابت، بدون Lock خواندن، تراکنشها بدون Block و Deadlock میتوانند بخوانند
🧾 5️⃣ Temp Tables vs Table Variables vs CTE
سؤالات:
- فرق بین
#Temp,@TableVar, وCTEچیه؟ - کِی از کدوم استفاده میکنی؟
| ویژگی | Temp Table | Table Variable | CTE |
|---|---|---|---|
| دارای ایندکس؟ | بله | محدود | خیر |
| Performance بالا در داده زیاد؟ | ✅ | ❌ | ❌ |
| در حافظه یا دیسک؟ | دیسک (tempdb) | حافظه (ولی ممکنه spill بشه) | حافظه (مجازی) |
| مناسب برای | داده زیاد و چندبار استفاده | داده کم و موقتی | خواندن recursive یا کوتاه |
🔄 6️⃣ Transactions & ACID
سؤالات:
- ACID یعنی چی؟
- چه زمانی COMMIT و ROLLBACK انجام میدی؟
- اگر بینشون خطا پیش بیاد چی میشه؟
مثال:
BEGIN TRY
BEGIN TRANSACTION;
UPDATE Accounts SET Balance -= 100 WHERE Id = 1;
UPDATE Accounts SET Balance += 100 WHERE Id = 2;
COMMIT;
END TRY
BEGIN CATCH
ROLLBACK;
PRINT ERROR_MESSAGE();
END CATCH;
📊 7️⃣ Query Tuning Tools
سؤالات رایج:
- از چه ابزارهایی برای آنالیز Performance استفاده کردی؟
✅ ابزارهای کلیدی:
- Execution Plan (Actual / Estimated)
- SET STATISTICS IO, TIME
- SQL Profiler / Extended Events
- DMVs (مثل
sys.dm_exec_query_statsیاsys.dm_db_index_usage_stats) - Query Store (در SQL Server 2016+)
راهنمایی :
۱. مفهوم DMVs
DMVها (Dynamic Management Views)، نماهای داخلی SQL Server هستند که اطلاعات زمان اجرا و وضعیت سیستم را به ما میدهند.
هدفشان: آنالیز Performance، تشخیص مشکلات و بهینهسازی کوئریها و ایندکسها است.
۲. انواع DMVs
- DMVهای مربوط به Query و Execution
sys.dm_exec_query_stats- اطلاعات آماری درباره کوئریهای اجرا شده در کش SQL Server.
- شامل: تعداد اجرا، زمان متوسط اجرا، CPU مصرف شده، Logical/Physical Reads.
- مثال:
SELECT TOP 10 qs.total_worker_time/qs.execution_count AS AvgCPU, qs.execution_count, st.text AS QueryText FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st ORDER BY AvgCPU DESC;با این کوئری میتوان کندترین یا پرهزینهترین کوئریها را شناسایی کرد.
- DMVهای مربوط به Index و Storage
sys.dm_db_index_usage_stats- نشان میدهد هر ایندکس چند بار استفاده شده یا اسکن شده است.
- مفید برای شناسایی ایندکسهای بلااستفاده یا کماستفاده.
- مثال:
SELECT OBJECT_NAME(I.object_id) AS TableName, I.name AS IndexName, S.user_seeks, S.user_scans, S.user_lookups, S.user_updates FROM sys.indexes AS I JOIN sys.dm_db_index_usage_stats AS S ON I.object_id = S.object_id AND I.index_id = S.index_id WHERE OBJECTPROPERTY(I.object_id,'IsUserTable') = 1 ORDER BY S.user_seeks DESC;
۳. کاربردهای اصلی DMVs
| کاربرد | توضیح |
|---|---|
| شناسایی کوئریهای پرهزینه | با sys.dm_exec_query_stats و join با SQL Text |
| تحلیل استفاده از ایندکسها | با sys.dm_db_index_usage_stats |
| بررسی Waitها و قفلها | با sys.dm_os_wait_stats |
| مانیتورینگ حافظه و کش | با sys.dm_os_buffer_descriptors |
۴. نکته مهم
- DMVها اطلاعات از زمان آخرین ریست سرویس SQL Server دارند، پس تاریخچه کامل ندارند.
- برای تحلیل طولانیمدت، بهتر است دادههای DMV را در جداول پایگاه داده ذخیره کنید.
💡 جمعبندی :
- DMVs ابزارهایی داخلی و سریع برای مانیتورینگ هستند.
sys.dm_exec_query_stats→ برای آنالیز کوئریها و عملکرد CPU/IOsys.dm_db_index_usage_stats→ برای بررسی استفاده از ایندکسها و بهینهسازی آنها- ترکیب DMVs با Extended Events یا Query Store بهترین دید Performance را میدهد.
💾 8️⃣ Maintenance & Backup
سؤالات:
- Full / Differential / Log Backup چیه؟
- چطور restore میکنی؟
- چطور Job برای Backup اتوماتیک میسازی؟
☁️ 9️⃣ High Availability & Replication
سؤالات:
- Mirroring, Log Shipping, Replication, AlwaysOn فرقشون چیه؟
- در چه شرایطی از هر کدوم استفاده میکنی؟
🧮 10️⃣ سایر موضوعات پرتکرار:
| موضوع | سوال محتمل | نکته کلیدی |
|---|---|---|
| Normalization | چند نوع داره؟ | از 1NF تا 3NF برای کاهش redundancy |
| Denormalization | چرا گاهی لازم میشه؟ | افزایش سرعت queryهای گزارشمحور |
| Partitioning | برای چی استفاده میشه؟ | افزایش کارایی روی دادههای حجیم |
| Stored Procedure vs Function | تفاوت اصلی در داشتن transaction و output | |
| Dynamic SQL | چطور ایمن بنویسی؟ | استفاده از sp_executesql با پارامتر |
💡 جمعبندی برای مصاحبه:
اگر مصاحبهگر گفت:
“به عنوان یه SQL Developer چطور Performance سیستم رو بالا میبری؟”
تو میتونی خلاصه و مطمئن بگی:
با بررسی Execution Plan، اصلاح Indexها، کنترل Parameter Sniffing، کوتاه کردن Transactions، تنظیم Isolation Level مناسب، و استفاده از ابزارهایی مثل Query Store و DMVs.