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

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

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

گروه تبادل نظر:
https://t.me/+uIc1qhv58gU0NWQ0
Download Telegram
شرکت پخش رازی جهت تکمیل کادر فنی خود نیاز به افراد زیر به صورت تمام وقت دارد:

برنامه نویس Windows Application :

- مسلط به زبان C#.Net
- تسلط کافی به کدنویسی T-SQL
- آشنایی با برنامه نویسی تحت وب مزیت حساب می شود.

توانایی های عمومی :
- توانایی کار در سازمانهای بزرگ
- توانایی حل مشکلات پیچیده
- توانایی مدیریت استرس

افراد واجد شرایط لطفا رزومه های خود را به آیدی زیر ارسال کنید.
@Hamidreza_Sadeghian
سلام و عرض ادب خدمت دوستان گرامی
امیدوارم حالتون خوب باشه
اخیرا موردی در یک سازمان بزرگ رخ داده و اون هم این بوده که دیتابیس سیستم اتوماسیون دچار مشکل شده و شرکت محترم نرم افزاری که القصه یکی از بزرگترین شرکتهای بزرگ تولید کننده سیستم های اتوماسیون هست!! اومدن دیتابیس رو بررسی کردن و زحمت کشیدن آخرین بکاپ رو Restore کردن و به دلیل عدم دانش درست از دیتابیس ، سبب شده تقریبا 2 ساعت کار بر روی این دیتابیس در اون سازمان از دست بره.

دوستان عزیز ، اگر شرکت نرم افزاری هستید ، به هیچ وجه مسئولیت نگهداری بانک های اطلاعاتی یک سازمان به عهده شما نیست. اگر قرار هست بانک اطلاعاتی رو شما نگهداری کنید ، حتما در تیم خودتون از یک DBA حرفه ای استفاده کنید.
دوستان عزیز ، کار یک DBA ، در تخصص یک مهندس نرم افزار و برنامه نویس نیست به هیچ وجه.
مسئول شبکه نیز تخصصش DBA نیست. گاها مواردی پیش میاد که فقط یک DBA با تجربه میتونه مشکل رو حل کنه.
اگر همچنان مصر هستید که بانک های اطلاعاتی سازمان رو نگهداری کنید باید حتما یک قرارداد جداگانه برای نگهداری دیتابیس وضع بشه.
باید تمام ابزارهای مانیتورینگ تخصصی بر روی SQL Server پیاده سازی بشه . سیستم های Notification باید راه اندازی بشه و باید DBA شما بتونه در مواقع بحرانی و حساس در هر ساعت و ایامی بر روی دیتابیس کار کنه و حتما باید برای اینکار شیفت مخصوص داشته باشید.
حتما باید دیتابیس ها به صورت روزانه مانیتور بشه.

سازمانهای عزیز ، دقت کنید وقتی قرار هست دیتای شما توسط شرکت نگهداری بشه باید حتما قرارداد محرمانگی بین شما و شرکت نرم افزاری امضا بشه تا دیتای شما از دست نره.
فقط یک نفر و فقط یک نفر و فقط یک نفر باید SYSAdmin باشه.
حتی مدیر شبکه نباید دسترسی به دیتابیس داشته باشه
باید حتما Audit Log بر روی SQL Server راه اندازی شده باشه تا بتونید وضعیت رفتاری هر شخصی که بر روی سرور متصل میشه رو Trace کنید.

دوستان عزیز، اگر هر کدوم ا زموارد فوق رو رعایت نکردین ، باید عواقبی مانند از بین رفتن دیتا ، آلوده شدن و Encrypt شدن توسط باج افزارها ، کند شدن سرورها ، دزدیده شدن داده ها و .... رو کاملا بپذیرید.

ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
👍1
یک دوره عالی در شرکت الگوریتم پویا
در خصوص performance tuning

با بچه هایی بسیار پر انرژی ، باهوش و خستگی ناپذیر💪💪💪💪
سلام و عرض ادب خدمت دوستان عزیزم
شبتون بخیر باشه
نکته ای که اخیرا زیاد میشنوم در خصوص مدیریت فایلهای LDF ، این هست که بعضی مواقع نیاز شده فایلها سایزشون کم بشه ، دوستان اومدن دیتابیس رو Detach کردن و فایل log رو حذف کرده و با استفاده از attach for rebuild دیتابیس رو attachکردن که فایل Log هم ساخته شده.!!!
این یک کار بسیار خطرناک و پر ریسکی هست و اگر به هردلیلی تراکنش های باز در فایل Log باشه دیگه فایل Log برای شما ساخته نمیشه و در واقع دیتابیس شما attach نخواهد شد.
و تنها راهش استفاده از روشهای پیچیده برای بازیابی فایلهای MDF می باشد.
لطفا برای مدیریت Log ها از روشهای بهتر مانند Log Backup استفاده کنید و زندگی بی دردسری رو تجربه کنید. 😁😁

نکته دوم و خیلی حیاتی برای دوستانی که عادت دارند مستقیما در محیطهای عملیاتی داده ها رو تغییر بدن و عملا دل شیر دارن😉
حتما از این روش استفاده کنید که اگر یک درصد خطایی هم رخ داد بتونید به شرایط نرمال برگردین.
Begin Tran
Update Table1 set field1=10

اگر دقت کرده باشین من یک Transaction باز کردم ولی نه Commit کردم نه Rollback . این باعث میشه تغییرات من در دیتابیس اعمال نشه و در همین Session من میتونم از جداولی که نیاز هست Query تهیه کنم ببینم داده ها درست اعمال شدند یا خیر.
اگر درست بود میتونم با دستور Commit تغییرات رو اعمال کنم و اگر درست نبود با Rollback تغییرات برمیگرده.
بارها پیش اومده مثلا جدولی Drop شده یا مقداری حذف شده ، با این روش به راحتی میتونید جلوی خطاهایی مانندوارد کردن اشتباه اسم جداول ، نذاشتن فیلترهای مناسب ، دستورات نابجا رو بگیریم.
امیدوارم این دو نکته کمک کنه وارد شرایط بحرانی نشین.😉😉😉

ارادتمند شما
حمیدرضا صادقیان

ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
با سلام خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
در پست بعد مقاله ای رو به فارسی براتون قرار میدم که یکی از عزیزان زحمت ارسالش رو کشیدن و خیلی دقیق به موضوع SQL Injection پرداختند.
پیشنهاد میکنم حتما از این مقاله بهره ببرید تا امنیت سیستم هاتون ارتقا پیدا کنه.

ارادتمند شما
حمیدرضا صادقیان

با تشکر از @xXKingAttilaXx

ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
سلام وعرض ادب خدمت دوستان عزیز
امیدوارم حالتون خوب باشه
شاید بارها پیش اومده باشه براتون که نیاز داشته باشین روی نتیجه SP ها سلکت بزنین و شرط بذارین یا از نتیجه اون در Join ها استفاده کنید.
خوب راه معمولش این هست که نتیجه SP رو داخل یک جدول موقت بریزین و بعد از اون جدول استفاده کنید.
یک راه ساده تر این هست که از Openrowset استفاده کنید.
برای استفاده از OpenrowSet ابتدا باید دستور زیر رو اجرا کنید.
sp_configure 'Ad Hoc Distributed Queries',1
Go
Reconfigure
go

سپس میتونید از این قالب استفاده کنید.
select a.* from openrowset('sqlncli','server=.;trusted_connection=yes;','
exec DbName.dbo.UspReturnPersonelList
''01-11-2018'',''29-12-2018''') as a
where a.[name] =N'Hamidreza'

در این کد در قسمت Trusted_Connection من از Windows_Authentication استفاده کردم و در قسمت Server هم نام سرور لوکال خودم رو قرار دادم. که میتونه نام هر سروری و باهر دسترسی باشه.
و درنهایت نام دیتابیس به همراه Schema رو با نام SP صدا زدم و بهش دوتا پارامتر تاریخ پاس دادم.

نکته : اگر حجم داده ها زیاد هست و نیاز دارید خیلی از این داده ها استفاده کنید پیشنهاد میکنم از جدول استفاده کنید. چون روی جدول شما قابلیت ایندکس گذاری نیز دارید . این مورد برای زمانهایی هست که یا حجم داده ها کمتر هستن یا تعداد استفاده آنها خیلی کم هست.

امیدوارم از این نکته لذت ببرید ☺️☺️

ارادتمند شما
حمیدرضا صادقیان



#openRowset #SQL_Server #TSQL #SP #Stored_Procedure
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
SQL Server Group :https://t.me/joinchat/BTQQtzy50j_MVbMcUf6PtA
1
بدون شرح 😍😍😍😍😉😉
👍1
دوره بسیار عالی با افرادی بسیار دقیق و باهوش در شرکت موتورسازان تراکتور سازی تبریز

#performance_tuning
#T_SQL
#SQL_Server
👍1
سلام و عرض ادب خدمت دوستان عزیزم
عید همه عزیزان مبارک باشه

فیلم زیر رو توصیه میکنم ببینید و به قدرت SQL Server بیشتر پی ببرین 😊

ارادتمند همه عزیزان

حمیدرضا صادقیان

@Hamidreza_Sadeghian

SQL Server 2017: World’s First Diskless Database

https://www.instagram.com/tv/B1DWD5fFqwo/?igshid=8so896hylwa8
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
میخوام کتاب SQL Server 2019 wait statistics رو بهتون معرفی کنم.
در این کتاب با مفاهیم Wait Statistics ها آشنا میشین و یاد میگیرین که چطوری در Performance Tuning ازشون به بهترین نحو استفاده کنید .

در لینک زیر این کتاب رو برای دانلود قرار میدم .
امیدوارم بهره کافی رو از این کتاب ببرید.

سوالاتتون رو پیرامون مباحث مطرح شده میتونید در گروه نیز مطرح کنید

ارادتمند شما حمیدرضا صادقیان

@Hamidreza_Sadeghian

SQL Server Group :https://t.me/joinchat/BTQQtzy50j-wVkfdnQOtRA

Download link: http://2ad.ir/52kV9NC
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوش باشه

یکی از مسائلی که شاید باهاش برخورد کنید این هست که هنگامی که یک Select رو بر روی یک جدول میگیرید که Clustered Index داره ، شاید اگر دقت کرده باشید نتیجه به صورت مرتب شده گاها براساس PK نمایش داده میشه.
ممکنه این به ذهنتون برسه که خوب پس با این اوصاف نیازی نیست که حتما از Order By استفاده کنیم.!
خیر این مورد صحیح نیست. وقتی که SQL Server نیاز به Clustered Index Scan داره ، داده ها رو به ترتیب PK میخونه و پیش میره.
خوب یکی از ویژگی های موجود در مسائل Performance بحثی هست به نام Merry-go-round scan .
که به شما اجازه میده چند تا Task همزمان بتونن از منابع یک Index استفاده کنند.
فرض کنید در Session 1 من یک کوئری اجرا کردم که نیاز به Index Scan بوده و تا نصف ایندکس نیز پیش رفته.
در همین حال در Session 2 نیز همون کوئری اجرا میشه و نیاز هست که از همون ایندکس استفاده بشه.
اتفاقی که اینجا رخ میده این هست که S2 به S1 می پیونده و مابقی مسیری که ایندکس بررسی میشه طی میکنه و داده هایی که نیاز هست حالا برای دوتا Session ارسال میشه. به محض اینکه S1 به انتهای ایندکس رسید S2 از ابتدای ایندکس جستجو کرده تا به نقطه ای برسه که به S1 متصل شده بود. به همین خاطر باعث میشه اون ترتیب PK عملا از بین بره .

نکته : هر زمانی که نیاز به خروجی مرتب شده داشتید حتما از Order By استفاده کنید.

ارادتمند شما
حمیدرضا صادقیان

@hamidreza_Sadeghian
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه و عزاداریاتون مقبول درگاه حضرت حق.

اگر تمایل دارید وارد مباحث Data Science بشین و میخواهید Machine Learning رو فرابگیرید پیشنهاد میکنم ابتدا با ابزار Octave پیشنهاد می کنم شروع کنید .
چون با این زبان ، که بسیار به Matlab نیز شبیه هست خیلی راحت میشه الگوریتم هارو پیاده سازی کرد یا پروتوتایپ آماده کرد و راحت الگوریتم هارو در زمان کوتاه تری فرا گرفت
بعد از اینکه به الگوریتم ها مسلط شدین میتونید به سمت پایتون یا زبانهای دیگه مثل C++ یا جاوا مهاجرت کنید.
در سیلیکون ولی هم برای یادگیری و یا طراحی پروتوتایپ از این زبان استفاده می کنند.
از طریق لینک زیر میتونید به صورت رایگان اونو دانلود کنید.
و همچنین برای یادگیری Machine LEarning نیز میتونید از کورس زیر که لینکش رو قرار میدم استفاده کنید که رایگان نیز هست.

ارادتمند شما
حمیدرضا صادقیان
@Hamidreza_Sadeghian

#Data_Science
#Machine_Learning

https://www.gnu.org/software/octave/#install

https://www.coursera.org/learn/machine-learning
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
امروز ویدئویی رو مشاهده کردم که در خصوص روشهای Paging توضیح میدادو اینکه Performance کدوم روش بهتر است.
سوای اینکه نیاز بود پلن ها بررسی بشه که نشد و همچنین IO Statistics بررسی بشه که اون هم نشد ، بیان شد که Row_Number عملکرد بهتری نسبت به Offset / Fetch داره در صورتی که اگر یک جستجوی ساده در اینترنت انجام بدین و مقالات MVP های مختلف رو بررسی کنید و حتی بلاگ های سایت مایکروسافت رو نیز مطالعه کنید خواهید دید که Performance دستور Offset/Fetch به مراتب بهتر از Row_Number هست .
در ادامه دو نمونه از این مقالات و مقایسه هارو براتون قرار میدم تا دقیقتر موضوع رو بررسی کنید.

ارادتمند شما
حمیدرضا صادقیان
@Hamidreza_Sadeghian

https://www.mssqltips.com/sqlservertip/2696/comparing-performance-for-different-sql-server-paging-methods/

https://sqlperformance.com/2015/01/t-sql-queries/pagination-with-offset-fetch
سلام و عرض ادب خدمت دوستان عزیزم

یکی از مسائلی که اکثر قریب به اتفاق شرکت ها با اون دست و پنجه نرم می کنند عدم وجود سورس کنترل و ورژن کنترل بر روی دیتابیس هست وبرای هندل کردن این مورد میان از ابزارهایی مثل RedGate استفاده می کنند که متاسفانه نمیتونه چرخه DLM رو تکمیل کنه.

استفاده از Database Project یا همون SSDT به شما کمک میکنه چرخه DLM رو پیاده سازی کنید.
می تونید برای دیتابیس ها Unit Test بنویسید ، چیزی که من تقریبا در هیچ شرکت و یا سازمانی اصلا ندیدم و حتی متاسفانه دانشش وجود نداشت.
همچنین میتونید برای دیتابیس ها محیط Test,UAT,PRoduction ایجاد کنید و پابلیش های مختلفی داشته باشین.
همزمان چندین نفر می تونن بر روی دیتابیس تغییرات اعمال کنند بدون اینکه باهم تداخلی داشته باشه.
دسترسی ها از روی محیط عملیاتی کاملا حذف میشه .
هیچ وقت تداخل تغییرات به وجود نمیاد
به راحتی میتونید ورژن های مشتریان و دیتابیس های عملیاتی ر وکنترل کنید و تغییرات رو داشته باشید و بر روی مقصد اعمال کنید.
اگر تصمیم دارید یک چرخه دقیق مهندسی نرم افزار رو پیاده سازی کنید پیشنهاد می کنم حتما چرخه DLM رو در سازمان یا شرکتتون پیاده سازی کنید.
میتونید Build های اتوماتیک پیاده سازی کنید.
خیلی راحت میتونید Refactoring بر روی دیتابیس انجام بدین بدون اینکه نگران باشید ممکنه در یک شی در داخل دیتابیس یک چیزی تغییر کرده باشه که در جاهای دیگه تغییر نکرده و میتونه در یک جایی باعث از کار افتادن سیستم بشه.

پیشنهاد می کنم برای درک صحیح از صحبتهایی که عرض کردم فیلم زیر رو حتما ببینید

ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian

#DLM #DAtabase_Project #Database_Lifecycle_Management #SQL_Server #CI

https://channel9.msdn.com/Events/TechEd/Europe/2014/DBI-B312
👍1
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
یکی از سوالاتی که خیلی مطرح هست ، نحوه انتخاب دیتاتایپ ها و سایز فیلدها هست. گاها مشاهده کردم که خیلی دست و دلبازانه 😜 سایز فیلدها و نوعشون انتخاب میشه. خوب شاید بفرمایید چه مشکلی پیش میاد؟
در حجم های دیتای پایین یا تعداد کاربرهای کم شاید مشکل خاصی پیش نیاد.
ولی وقتی که تعداد کاربران افزایش پیدا میکنه یا سایز جداول شما افزایش پیدا می کنه برای شما دچار دردسر میکنه.
یکی از مسائلی که پیش میاد حدس زدن اشتباه SQL Server بر روی داده های شما در Query های شما هست. وقتی شما کدی رو مینویسید SQL Server برای اینکه حدس بزنه چقدر داده رو قراره استخراج کنه یا روش کار کنه که به SQL Server بگه که من چقدر Ram نیاز دارم برمبنای سایز و نوع فیلدها و تعداد رکوردی هست که در کوئری شما مدنظر هست. اینهارو باهم ضرب میکنه و به یک عددی میرسه.
فرض کنید مثلا جدول شما صدمگابایت فضا داره و این جدول شما دارای دو یا سه تافیلد varchar(1000) هست. وقتی که در کدتون این فیلدها استفاده میشه SQL Server ابتدای امر حدس میزنه که چه تعداد رکورد قراره استخراج بشه بعد سایز یک رکورد رو با مقدار دیتاتایپ ها محاسبه میکنه واون تعداد رکورد رو در سایز یک رکورد ضرب میکنه و مثلا میرسه به عدد 10 گیگابایت. و اینجا به SQL Server درخواست میده که من نیاز به 10 گیگابایت Ram برای اجرای این دستور دارم.
و احتمالا بعدش رو میتونید به راحتی حدس بزنید چه اتفاقی میافته؟؟؟؟

این نکته رو گفتم که اگر تصمیم دارید دیتابیس بزرگی طراحی کنید یا فکر میکنید در آینده ممکنه دیتابیس بزرگ بشه ، به این نکته دقت کنید تا در آینده دچار مشکل نشید.

ارادتمند شما
حمیدرضا صادقیان
@Hamidreza_Sadeghian