SQL Server
3.95K subscribers
19 photos
7 videos
36 files
167 links
حمید رضا صادقیان

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

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

گروه تبادل نظر:
https://t.me/+uIc1qhv58gU0NWQ0
Download Telegram
قبل از اینکه مایکروسافت بیادTDE رو اضافه کنه ،‌ یکی از اساسی ترین چالش های ما این بود که در لایه دیتابیس کلی امنیت رو بهش میرسیدیم ، بعد یکی از راه می رسید سرویس رو استاپ میکرد فایلهای دیتابیس رو جابجا میکرد و بدون هیچ مشکلی به همه چیز دسترسی داشت !! 😐 همیشه جلوی Oracle کارها عرق شرم برپیشونی ما نقش می بست. 😁
بعد مایکروسافت زحمت کشید اومد مارو از این خجالت زدگی رها کرد و Encryption‌رو اضافه کرد. باعث شد که با فعال سازی Encryption بر روی دیتابیس ،‌حداقل اگه کسی تونست به هر علتی سرویس رو متوقف کنه یا دیتابیس رو به حالت Offline ببره و فایلهارو جابجا کنه ،‌دیگه نتونه فایلش رو باز کنه تا زمانی که به Master Key دسترسی داشته باشه.
یکی از اتفاقاتی که میبینم در همه سیستم ها وجود داره و باز هم همین چالش هست و هرکسی به فایلهای MDF , LDF دسترسی داشته باشه عملا به کل دیتابیس شما دسترسی کامل داره.
اگه TDE رو فعال نکردین یک کپی از فایلهای MDF ,LDF شما برای دسترسی به همه زندگی شما کفایت می کنه 😅
باشد که رستگار شویم. 😬
یکی از سوالات و ابهاماتی که دیدم خیلی وقتها رخ میده ، در خصوص شخص شخیص Transaction Log هست. ! 😂
خدا نکنه روزی سایه شون رو از سر دیتابیس بردارن ،‌همون لحظه است که دیتابیس یک سکته بندری(suspect) میزنه و سایه شوم خرابی داده ها روی سر دیتابیس شما هوار میشه. 😐
اسم این بنده خدا خیلی گمراه کننده است. ما خیلی جاها فکر می کنیم Log یک چیز بدرد نخوره که میشه خیلی راحت پاکش کرد. 🤦‍♂️
ولی این فایل ماهیتش فرق می کنه.
داستان از این قراره که این دوست عزیز کنار ماست تا همه عملیات های تغییرات داده ای رو درون خودش ثبت کنه و به محض اینکه مطمئن شد همه دستورات با موفقیت به اتمام رسیده تازه بیاد اعمال کنه بر روی داده اصلی. چرا؟؟؟؟؟؟؟ چون که ما وابسته نیستیم. 🙃 ( اها هیچی ،‌این به اینجا ربط نداشت. 😬 ) چون میخواد مطمئن بشه وسط کار اگه یک دفعه سرور ترکید دیتاها به لقالله نپیوندن.
دوستان ، عزیزان ،‌اگه این فایل رشد کرده باهاش مهربون باشید . یک دست نوازش ( Log Backup‌) به سرش بکشید آروم میشه . نزنید این فایل رو پاک کنید بعد بگید موقع ساخت دیتابیس خودش میسازه هاااا. از این خبرا همیشه نیستااا.
یک دفعه دیدین یک تراکنش باز داخلش هست که اخ اخ این فایل ساخته نمیشه و دیتابیستون داستان براش ایجاد میشه.
خلاصه از ما گفتن بود.
ما یک تنظیماتی در SQL Server داریم به نام Cost Threshold For Parallelism . مثل این عکسه. اگه ماشین توی سرپایینی باشه و روشن نشه خودمون تکی احتمالا یک هل میدیم و ماشین روشن میشه.(یعنی هزینه کد ما به این عدد نرسیده و روی Single Thread اجرا میشه)
حالا وقتی تو گل گیر کردیم یا سربالاییه یا جاییه که خلاصه یک نفری نمیشه هلش داد، هرکی رد بشه خفتش میکنیم داداش یک هل بدی روشن میشه مثل عکس پایینی( یعنی هزینه کدت بیشتر از این عددیه که تنظیم شده و SQL Server کدت رو میاد به صورت پارالل اجرا میکنه و بار کدت روبین Core های مختلف تقسیم می کنه)
خوب حالا حتما میگین ایول، ماهرچی پایین تر بذاریم که بهتره از همه ظرفیت CPU استفاده می کنیم.
نه دیگه این مدلی نیست. وقتی کد شما کم هزینه است اگه بیاین اینکارو بکنید خودش میتونه چالش کندی ایجاد کنه . چون همین تقسیم بار بین چند CORE و دوباره جمع آوری اون اطلاعات هزینه بره.
خوب چطوری به عدد درست برسیم؟
پیش فرض خود مایکروسافت عدد ۵ که عدد پایینیه. در حالت کلی این رو روی ۲۵-۳۵ تنظیم میکنند.
ولی درستش اینه که یک مدت کدها مانیتور بشن و بعد میانگین هزینه این کدها در نظر گرفته بشه.
من هرجا که به عنوان مشاور میرم ، اولین چیزی که بهش دقت می کنم تعداد دسترسی های Admin به دیتابیس هست. مثلا یک سرور هست که خوب روش نرم افزارهای مختلف وجود داره. فرض کنید از ۳۰ تا شرکت مختلف . بعد هر شرکتی برای کارش یک دسترسی Sysadmin گرفته.
من نمیدونم چرا باید برای کار روی دیتابیس خودشون دسترسی Sysadmin داشته باشن؟
یعنی روی یک سرور دیدم که ۳۲ تا لاگین sysadmin وجود داره.
خلاصه یک سفره ای پهنه و نون و دیتابیسی هست دور هم میزنن دیگه 😁
همه به همدیگه اعتماد دارن و کسی نمیاد بزنه یک دیتابیس دیگه رو بترکونه یا مشکلی براش ایجاد کنه.
شخصا تا زمانی که تمام دسترسی های ادمین به دیتابیس رو قطع نکنم و فقط خودم دسترسی داشته باشم هیچوقت هیچ مسئولیتی قبول نمیکنم.
شما هم یک سری به لیست ادمین های SQL Server تون بزنید ببینید چه خبره. 😉
میشه وقتی صحبت کندی نرم افزار یا بانک اطلاعاتی میشه ، از گوشه و کنار صداهایی به گوش میاد هی رفیق ایندکس بذار. 😂
مورد داشتیم روی یک جدولی ۴۵ تا ایندکس بوده و باز هم SQL Server توی اجرای کدها Missing Index پیشنهاد میداده. اخه مگه داریم؟ اینقدر یک RDBMS طماع میشه؟
چقدر دیگه باید ایندکس بریزیم توی حلقت تا آروم بگیگیری؟ 😁
حالا داستان اینجاست .
فرض کنید به حول و قوه الهی خدا اینقدر بهتون پول داده که شما یک کلکسیون از ماشین های لوکس رو خریداری کردین و مثلا یک پارکینگی دارید که ۵۰ تا ماشین سوپرلوکس توش پارکه. حالا قصد دارید برید توی بلوار اندرزگو دور دور 😁 (خدایی نکنید اینکارو کلی ترافیک ایجاد میشه 😅 )
اینجاست که هنگ میکنید. نمیدونید کدوم ماشین رو انتخاب کنید( انشالله به حق پنج تن همه تون دچار چنین چگونگی بشین والله)
دقیقا SQL Server هم چنین حالی داره. وقتی دوجین ایندکس میریزین توی جدول ، موقعی که پلن داره طراحی میشه و میخواد انتخاب کنه که کدوم ایندکس مناسبه،‌گیر میکنه که الان کدوم ایندکس رو انتخاب کنم و همچنین میتونه حتی منجر به انتخاب اشتباه بشه. ( مثلا شما هنگ کنید با ماشین آفرودی برید توی بلوار دور دور. نکنید اینکارهارو خدایی 😉 )
این یک بخش داستانه.
حالا شما شروع می کنید میخواهید داده وارد جدولتون کنید یا داده هاتون رو تغییر بدین. ( فرض کنید تصمیم دارین ماشین هاتون رو Tune کنید یا اینکه به شکل و ظاهرش برسید یا مثلا سرامیک کنید.)
هر فیلدی که تغییر می کنه ، اون تغییر باید در تمام ایندکس هایی که اون فیلد دراون حضور داره اعمال بشه .( نمیشه که یک ماشین رو سرامیک کنید یکی رو نه . اون ماشینم دلش میخواد دیگه 😁 )
این باعث میشه حجم زیادی کار صورت بگیره. تمام منابع شما درگیر میشن تا این عملیات بروز رسانی انجام بشه.( تمام ماشین های شما درگیر میشن تا سرامیک بشن و دیگه وقتی برای دور دور ندارین مجبورین با خط ۱۱ تشریف ببرین 😁 )
و حالا احتمالا میتونید حدس بزنید چه حجمی از انتظارها برای اجرای کدهای دیگه پشت در هستند تا این منابع آزاد بشن و برن اجرا بشن( افراد خانواده شما هم همشون منتظر هستن تا اینکار سرامیک ماشین ها به اتمام برسه و هرکسی یک ماشینی رو بزنه توی گوشش و بره به کارش برسه)
احتمالا میتونید بعدش حدس بزنید چه چالش هایی رخ میده؟ سیستم گیر میکنه. کند میشه و شاخص F/S (فحش برثانیه) افزایش پیدا می کنه 😂

حالا حتما سوالتون اینکه چیکارش کنیم؟
هیچی در پستهای بعدی اشاراتی بهش خواهم کرد.
تا پست بعد به ماشینهاتون برسید به ماهم بدید باهاش دور بزنیم 😁

پ.ن : اگه فکر میکنید در این زمینه میتونیم کمکتون کنیم به من پیام بدین
میشه یکی از چالشهایی که در زندگی هست ، تغییر محل زندگیه. وقتی مثلا چندسالی در یک شهر یا محلی زندگی میکنی همه نیازهاتو میدونی از کجا باید تامین کنی ، کیفیت ها دستت میاد و...
وقتی که یک دفعه تصمیم میگیریم که به یک شهر یا یک منطقه دیگه بریم چند وقتی طول میکشه تا دوباره با اون شرایط بسازیم و این میتونه خیلی اختلال ایجاد کنه در زندگی ما و خیلی از فرآيندها رو کند کنه.
توی SQL Server هم Compatibility Level هر دیتابیس دقیقا چنین چیزیه. وقتی که یک دیتابیس با یک Compatibility Level شروع به کار می کنه همه ساخت پلن ها و نحوه اجرای کدها ،‌نحوه بروزرسانی Statistics ها و... برمیگرده به اون و با اون Compatibility Level کار می کنه.
حالا اگه یک دفعه وسط کار شما بیاین این عدد رو تغییر بدین و ارتقاش بدین( مثل این هست که مثلا فرض کنید تا الان توی یک منطقه ای زندگی می کردین که هزینه های زندگی به نسبت مناسبتر بوده یک دفعه میرین به یک میرین به یک منطقه گرون و هزینه ها واقعا دیوونتون می کنه) درسته که کیفیت همه چیز بهتر میشه ، ولی چون ساختار دیتابیس هنوز با این فرآيند جدید آشنا نیست باعث میشه کندی های عجیب غریبی ببینید.
دیروز با یک عزیزی صحبت می کردم ،‌میگفت در یک سیستم معروف کندی رخ داده بود و پشتیبان نرم افزار گفته که باید این رو ارتقا بدی و ارتقا دادن همانا و کندیه چند برابر شدن همانا. ( یک دفعه نمیشه از دنده یک بزنی دنده ۵ که داداش ماشین خاموش میکنه 😁 )
حالا خوب راهش چیه؟ چون این دیتابیس مثلابا نسخه ۲۰۰۸ توسعه داده شده تا ابد باید همون بمونه؟
آها سوال بسیار درستی پرسیدین. باید بگم که خیر.
راهش این هست که شما وقتی SQL Server رو بروز میکنی و نسخه جدید نصب میکنی یک مدتی باید روی دیتابیست Query Store رو فعال کنی و با همون رفتار قدیم ،‌دیتابیست کار کنه. بعد از اینکه مطمئن شدی با همه جای اصلی نرم افزار کار کردی میتونی بیای Compatibility Level رو ارتقا بدی. حالا یک سری کندی پیش میاد احتمالا ، که با Query Store و Force Plan میتونی حلش کنی. بعد سر فرصت باید بری همون کدها رو یک شخمی بزنی و اگه نیاز به بازنویسی داره بازنویسیش کنی.
یک زمانی در یک سازمانی بودم ، خیلی بهم ریختگی داشت توی تیم های مختلف ایجاد میشد، و سرو صدا بین آدمهای مختلف، زیاد رخ میداد.
(تمامی اسامی فرضی هستن) محمد میومد با علی حرف میزد میگفت میبینی این بهروز اصلا هیچی حالیش نیست ادعاش میشه ،‌یک نفره داره گند میزنه به کل کار تیم.
بهروز میومد محمد و علی رو میبرد زیر سوال .
بعد اینا بهم میرسیدن این برای اون نوشابه پوست میکند اون برای این یکی. 😂
یکبار من به مدیر تیم گفتم وقتی میبینی نارضایتی اینقدر زیاده ، کافیه برای هرکاری، سازمان هزینه کنه یک شخص از بیرون به عنوان بازرس بیاره. بهش گفتم حتی یک نفر خبره بیار کار منم بازرسی کنه. من فرآیندهامو بهش نشون بدم شاید یک جایی رو دارم اشتباه می کنم.
اون شخص هم که ذینفع نیست بخواد طرف من یا تورو بگیره. چه خوب باشه چه بد براش فرقی نداره. قاعدتا یک سری اشکال مطرح میکنه. یا میتونیم پاسخ بدیم که حل میشه یا نمیتونیم و برای اصلاحش برنامه ریزی میکنیم .
من به نظرم جای خالی چنین فضایی، در خیلی از شرکتها احساس میشه مخصوصا در تیمهای فنی.
مخصوصا درحوزه دیتابیس .
شاید خیلی وقتها یک چیزهایی به نظرمون خیلی خفنه. یکی که از بیرون میاد ، داستان مارو میشنوه و معماری مارو میبینه، ممکنه چون خارج از گود هست خیلی قشنگتر بتونه به مساله فکر کنه و به حل باکیفیت تر و ساده تر اون کمک کنه.
یک وام از کتاب #خودفریبی بگیرم ، داستان اینه که خیلی وقتها میریم درون یک کوزه و از بیرونش اطلاعی نداریم و اطراف رو نمیبینیم. وقتی یکی از بالای اون کوزه میاد مساله رو میبینه خیلی از جوانب دیگه هم میبینه که کمک میکنه دیرتر به فنا بریم.
نظرتون چیه؟
اینم اون آماری که SQL Server بر مبنای اون میاد نقشه راه میچینه تا بتونه دیتای شمارو در سریعترین حالت ممکن بدست بیاره.
حالا این قابلیت وجود داره یک جوری کد بزنیم که ۱۰ میلیون رکورد رو این بی نوا ۵۲ میلیارد رکورد در نظر بگیره و بگه احتمالا ۴ پتابایت !! دیتا داری در صورتی که خداوکیلی به ۱۰۰ گیگابایت هم نمیرسه.

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

به خاطر همین بود که در یکی از پستها من پرسیدم از کجا میدونید اطلاعاتی که به دستتون میرسه درسته؟
آخر سرهم هیچ جواب درستی نگرفتم 🤨
یعنی همه جا توکل می کنیم . عالیه و جواب میده ها. 😁
معماری کلان داده ای شرکت شمارو چه کسی تبیین می کنه؟
براساس چه استراتژی ساختار معماری داده ای خودتون رو پیاده سازی می کنید؟

مثلا فرض کنید ۲۰ تا شعبه دارید. آیا اینها به صورت مستقل اطلاعات وارد می کنند و بعد در شعبه مرکزی داده ها جمع آوری میشه و گزارش میگیرید؟
مثلا کدینگ هارو چطوری حل می کنید؟
کیفیت داده اطلاعات رو چطوری بررسی می کنید؟
سطوح دسترسی داده ای رو چطور مدیریت می کنید؟
متولی اینها چه کسی یا کسانی هستند؟

یکی از چالش های درست طراحی نشدن معماری کلان داده ای، دقیقا عدم توسعه پذیری اون معماری هست.

بعد تغییر این زیرساخت به شدت هزینه برداره و خیلی چیزها باید تغییر کنه.
دوست دارم نظراتتون رو بشنوم و یاد بگیرم.
احتمالا شما هم در گیر و دار ازدواج ، درگیر وام ازدواج شدین( به دلیل شیرینی امر ازدواج وام ازدواج رو مثال زدم وگرنه همه وام هارو شامل میشه 😁 )
شما اول که داخل یک صف هستید تا نوبتتون بشه و درخواستتون رو مطرح کنید( کد شما در صف اجرا قرار میگیره تا نوبتش بشه و بهش منابع تخصیص داده بشه)
حالا زمانی که میخواین اقدام کنید ،‌متصدی باجه به شما میگه مثلا فلان مدرک کمه. حتما باید کپی کارت ملی عمه گرامی هم بیاری 😂 تا بهم وام بدیم. روی پرونده شما یک برچسب میچسبونه که این وام در انتظار کارت ملی عمه اش هست.
یکی دیگه میاد بهش یک برچسب می چسبونه که منتظر عقدنامه هستیم ازدواج سفید قبول نمی کنیم 😂 .

(اینجا کد شما یک برچسبی به نام Wait میخوره که یا منتظر CPU هست یا Memory یا در انتظار آزاد شدن یک جدول و....)
حالا هروقت اون مدارک رو شما بیارید و اون برچسب برداشته بشه اون وام لعنتی بهتون داده میشه( هروقت منبع مورد نظر بهتون تخصیص داده بشه ، کدتون اجرا میشه)
این کل مفهوم Wait ها در SQL Server هست.
حالا شما میتونید وضعیت بیشترین Wait هایی که روی سیستم اتفاق افتاده از
select * from sys.dm_os_wait_stats
اینجا ملاحظه کنید.
درواقع به زبون مثالمون بخوام بیانش کنم ، داره لیست وامهایی که پرداخت شده و انواع نقصی مدارک و تعدادشون و مدت زمان انتظار برای جبران اون نقص مدارک رو به شما میگه.
حالا اگه میخواین ببینید چند نفر در صف انتظار وام هستند و الان منتظر چه مدارکی هستند از کد زیر میتونید استفاده کنید.
select * from sys.dm_os_waiting_tasks
این داره میگه کدهایی که درحال اجرا هستند هر کدوم منتظر چه منبعی هستند تا بتونن اجرا بشن.
به واسطه رفتار این Wait ها میشه سرنخ کندی رو پیدا کرد.
یعنی اگه توی بانکها بیان همین لیست انتظارها و وامهای گرفته شده رو بررسی کنن و علل گیر کردن اونها رو بررسی کنن شاید این فرآیندش خیلی سریعتر بشه.
Media is too big
VIEW IN TELEGRAM
توی این فیلم در خصوص قوانین نرمال سازی و اصول طراحی جدول صحبت می کنم.
#مکتبخونه
حتما براتون پیش اومده که رفتین مثلا تره باری یا یک میوه فروشی ، شروع به جداکردن میوه ها کردین ، بعد اون متصدی غرفه اومده بالا سرتون که داداش جدا نکن درهمه. (البته الان وضعیت بهتر شده ولی قبلا زیاد بود)
حالا اگه شما میخواستین میوه های خوب رو جداکنید احتمالا مجبور بودین هزینه بیشتری پرداخت کنید.
آفرین ، SQL Server هم دقیقا همینه. وقتی یک نتیجه ای به شما میده اون نتیجه درهمه ، هیچ مرتب سازی نداره. یعنی برای اینکه شما نتیجه نهایی رو مرتب شده داشته باشین ، باید هزینه اونو بپردازین و قید کنید که براساس چی مرتب بشه.
اما یک چالش، شاید دیده باشین در کدهای مختلف که مثلا طرف یک VIEW نوشته یا یک Inline-Function نوشته و داخلش اومده یک Order گذاشته و SQL Server بهش خطا داده. این طرف هم رفته پیش مدیر فنیش که مثلا حمیدرضا این چرا خطا میده؟
حمیدرضا هم یک ژست ما خیلی خفنیم گرفته 😁 گفته برو یک Top 100 percent بذار حل میشه. این بنده خدا هم رفته گذاشته و تونسته اون Object رو ایجاد کنه. تو دلش گفته وای خدا،‌این حمیدرضا چه خفنه خیلی وارده 😁
ولی کجا گندش درمیاد.؟ زمانی که دوست عزیزمون یک Select از View میزنه و انتظار داره نتیجه مرتب شده برگردونده بشه ولی امااااااااا اصلا از این خبرا نیست.
اینجاست که حمیدرضا باید بره تو افق محو بشه 😂
حمیدرضا ندونسته که اون مرتب سازی داخل View , Function , CTE برای این هست که صرفا شما میخوای مثلا از Top یا Offset استفاده کنی و یک تعدادی رکورد برگردونی و داری میگی براساس چی مرتب باشه که من ۱۰-۱۰۰-۱۰۰۰ تای اول یا آخرش رو برگردونم. همین به خدا 😉 .
یعنی توی هر جایی چیزی غیر از این شنیدین اشتباهه.
هر نتیجه ای که قراره بگیرین و مرتب باشه باید در بیرونی ترین Select قید کنید که براساس چی مرتب باشه.
وقتی داخل یک View میاین مینویسین Top 100 percent یعنی همه دیتا رو براساس مثلا فیلد تاریخ مرتب کن و برگردون.کجا برگردونه؟ آفرین اون Select درونی توی View. حالا زمانی که من میخوام از View استفاده کنم اون میاد داخلش داده هارو فیلتر میکنه که میشه همه داده ها وبراساس تاریخ مرتب میکنه. حالا روی این نتیجه میاد Select میزنه ولی اینجا که شما هیچ مرتب سازی قید نکردین! دوباره مرتب سازی شما بهم میخوره و باید حتما این رو قید کنید که براساس چی باید مرتب بشه.
امیدوارم این توضیح من برای همیشه این مساله رو در ذهنتون حل کنه که کاربرد Order by , Offset در کلا Table Expression ها برای چیه.
امروز داشتم به مانیتورینگ نگاه می کردم ، دیدم توی یک بازه یک دفعه CPU به شدت رفته بالا و Wait ها هم زیاد بودن.
بررسی کردم دیدم یک کدی هست که یک دفعه ظاهر شده و تعداد دفعات اجراش زیاده.
زمان اجرای کد حدودا ۲ دقیقه بود و همچنین Logical Read بیش از ۲ میلیون داشت.
همچنین CPU هم به شدت درگیر شده بود.
اومدم پلن کد رو بررسی کردم . دیدم عزیز دل ، جان جانان ، آقامون SQL Server 😁 داره یک هشدار زیبای Implicit Convert میده.
دیدم توی شرط دوتا فیلد دارن باهم چک میشن که یکی bigint بود و یکی Nvarchar . همین باعث شده بود که پلن درستی ایجاد نشه و از ایندکس روی اون فیلد بهره نبره و کل جدول هربار اسکن بشه .
با تغییر اون فیلد Nvarchar به Bigint ( به خاطر اینکه داده هاشون یکی بودن و نیازی به Nvarchar نبود)‌ زمان اجرای کد مربوطه شد ۲۰۰ میلی ثانیه و Logical Read به زیر ۱۰۰ رسید.
حالا این دوست عزیز Implicit Convert چیست؟
زمانی که توی شرط ها فیلدی که قراره جستجو بشه ،‌نوع داده اش با نوع داده ای که داره بهش پاس داده میشه برابر نباشه‌، SQL Server میاد اینهارو بهم تبدیل میکنه.
همین باعث میشه یک فاجعه رخ بده. یعنی چی؟ دیگه اون جداول آماری Statistics مورد استفاده قرار نمیگیره و کل جدول رو مورد عنایت قرار میده. 😂
به همین راحتی کدتون میتونه یک فاجعه ای مثل کد بالا رو خلق کنه.
دقت کردین میگن پشت تلفن هر حرفی رو نگید و هر کلمه ای رو نگید. ممکنه که بیان روی خطتون و ...
یعنی یک سرویس مخفی اون سمت هست که همیشه حواسش به شما هست 😂
دقیقا توی تعریف Nonclustered Index ها هم همین صادقه.
زمانی که شما دارید یک Clustered Index تعریف می کنید ( که این در اکثر مواقع با PK همراهه و میتونه دوجین فیلد رو باهم PK قرار بده)
یک کلید داره که میتونه یک فیلد باشه میتونه ترکیبی از چند فیلد باشه.
حالا هر ایندکس غیر کلاستری که تعریف می کنید همیشه به صورت یک ستون مخفی این کلید کلاستر داخلش قرار داره.
فرض کنید شما مثلا یک فیلد از نوع UniqueIdentifier دارید یکی از نوع Varchar یکی هم از نوع INT و ترکیب اینهارو اومدین یک PK گرفتین که کلاستر ایندکس شما هم شده.
حالا هر ایندکس دیگه ای بسازید این سه تا فیلد عزیز توی همه ایندکس های شما وجود داره.
حتما میگین خوب باشه مگه جای تورو تنگ کرده؟ 😅
نه عزیز دل ، جای منو که تنگ نکرده ولی باعث میشه ایندکس شما به شدت بزرگ بشه.
سایز جدول و دیتابیس شما افزایش پیدا کنه.
هرباری هرکدوم از این فیلدهای کلیدی کلاستر تغییر کنن توی همه ایندکس ها باید این تغییرات اعمال بشه و الی آخر.
یعنی قشنگ مثل یک دومینو هست که اولش خراب بشه همینطوری خیاری همه رو پشت هم خراب میکنه. 😂
نکته اخلاقی : در تعریف PK ها باید دقت کنید. الزامی نداره ایندکس کلاستر شما با PK شما یکی باشه. PK برای ارتباط با جداول دیگه در نظر گرفته میشه ولی ایندکس کلاستر برای ساختار ذخیره سازی و مسائل دیگه است.
سلام دوستان عزیزم
امیدوارم حالتون عالی عالی باشه
خوب بالاخره دوره Performance Tuning در مکتب خونه منتشر شد

در این دوره در خصوص چالش های Performance و نحوه مانیتورینگ ورفع این چالش ها صحبت کردم.

از لینک زیر میتونید دوره رو تهیه کنید

https://maktabkhooneh.org/course/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-sql-server-performance-tuning-mk6185/?v=1&affiliate_code=y7p0k0

کد تخفیف : COUPON-48513

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

نوروز مبارک 💐💐💐
سلام خدمت دوستان عزیزم
امیدوارم که عالی باشین
ما برای شرکت سلامت الکترونیک تامین (ساتا) نیازمند یک نیروی DBA هستیم.
تسلط به مفاهیم و ساختارهای Replication , HA و Database Maintenance برامون حائز اهمیته.
به دلیل اینکه هم تعداد دیتابیس ها زیاده . هم ساختار Replication پیچیده ای هست.
هم اینکه حساسیت داده ای بسیار بالاست.
محل کار هم تهرانسر هست.
کار هم به صورت حضوریه.

عزیزانی که تمایل دارند رزومه هاشون رو برای من بفرستند.

شاد باشین
@Hamidreza_Sadeghian
سلام دوستان عزیزم



🚨 توی چند روز اخیر دو مورد Disaster برای دو مرکز مختلف رخ داد.

هرکدوم از این مراکز دو تا سرور داشتند که HA بودند و کلاستر مدام از دسترس خارج می‌شد.

هر دو نود می‌رفتند توی حالت Resolving... 😵‍💫

🔍 طی بررسی لاگ‌های کلاستر و لاگ‌های تولیدشده توسط SQL Server

دیدم Memory Dump‌های مختلفی توسط SQL Server ایجاد شده.

📉 معمولاً زمانی که یک Memory Dump توسط SQL Server ایجاد می‌شه، یعنی یک خطای حاد وجود داره.

یا مشکل سخت‌افزاریه، یا خود Engine دچار یه مشکل اساسی شده که داره چنین فایلی رو تولید می‌کنه.

🛠 در اولین مورد فهمیدیم یک باگ در Query Store هست در نسخه ۲۰۲۲

که با نصب Service Pack مشکل حل شد.

💽 در مورد دوم هم دیسک مشکل داشت و باعث شده بود کدهایی که اجرا می‌شن، خطای Access Violation بدن.

با اصلاح دیسک‌ها، مسأله حل شد.

اینجاست که وجود یک DBA واقعی حیاتی می‌شه...

🤔 شما تجربه‌ی مشابهی داشتین؟

خوشحال می‌شم بدونم چطور باهاش برخورد کردین. 💬