سلام و عرض ادب خدمت دوستان گرامی
امیدوارم حالتون خوب باشه
یکی از نکاتی که در اکثر دیتابیس هایی که میبینم و بهش برمیخورم عدم رعایت کردن Data Type ها هست
بذارید یک مثال بزنم.
مثلا فرض کنید یک جدول کالا دارید که فیلد کدکالای اون از نوع عددی هست
حالا یک SP نوشتید که بیاد یک کالا رو در این جدول درج کنه یا اینکه یک کالایی رو جستجو کنه.
پارامتر ورودی SP برای کد کالا مثلا از نوع char هست.
کد نوشته شده هم به این شکل هست.
Select * from Tbl_Goods
Where GoodNo = '123245'
این کد با موفقیت اجرا میشه و مشکلی هم نداره.
ولی اگر در Execution Plan نگاه کنید یک Implicit Convert رخ داده.
که باعث میشه از ایندکسها درست نتونه استفاده کنید. Cardinality رو درست نتونه تخمین بزنه و درنهایت سبب ایجاد یک پلن پیچیده و پر هزینه خواهد شد
به عنوان مثال دیشب روی کدی کار میکردم که فیلدهای ID رو از نوع Guid گرفته و چون داخل برنامه از نوع Varchar گرفته همه جا اومده از CAst استفاده کرده و به Varchar تبدیل کرده و همین باعث شده بود که SQL Server با وجود ایندکس نمیتونست از ایندکس درستی استفاده کنه چون دیگه Where Clause شما Sargable نیست و فیلدهای اون ماهیتا تغییر کردن بنابراین یک Index Scan رخ میده.
همین امر باعث شده بود که هزینه پلن نزدیک 30 بود و پلن پارالل شده بود و همچنین 70000 تا Logical Read بر روی جدول فوق داشتیم.
کدهای مربوطه رو اصلاح کردم و به همون شکل Guid نشونش دادم هزینه پلن شد 0.00170 , تعداد Logical REad جدول فوق نیز به 4 رسید و از ایندکسی که گذاشته بودم به راحتی استفاده کرد و یک Index Seek در پلن رخ داد.
لطفا در کدهاتون این مورد رو بسیار بهش دقت کنید و اگر مواردی این تیپی دارید حتما اصلاح کنید.
سعی میکنم در پست بعد کدی که بتونید به واسطه اون این تیپ Warning هارو بدست بیارید رو ارسال کنم.
ارادتمند شما
حمیدرضا صادقیان
@Hamidreza_Sadeghian
امیدوارم حالتون خوب باشه
یکی از نکاتی که در اکثر دیتابیس هایی که میبینم و بهش برمیخورم عدم رعایت کردن Data Type ها هست
بذارید یک مثال بزنم.
مثلا فرض کنید یک جدول کالا دارید که فیلد کدکالای اون از نوع عددی هست
حالا یک SP نوشتید که بیاد یک کالا رو در این جدول درج کنه یا اینکه یک کالایی رو جستجو کنه.
پارامتر ورودی SP برای کد کالا مثلا از نوع char هست.
کد نوشته شده هم به این شکل هست.
Select * from Tbl_Goods
Where GoodNo = '123245'
این کد با موفقیت اجرا میشه و مشکلی هم نداره.
ولی اگر در Execution Plan نگاه کنید یک Implicit Convert رخ داده.
که باعث میشه از ایندکسها درست نتونه استفاده کنید. Cardinality رو درست نتونه تخمین بزنه و درنهایت سبب ایجاد یک پلن پیچیده و پر هزینه خواهد شد
به عنوان مثال دیشب روی کدی کار میکردم که فیلدهای ID رو از نوع Guid گرفته و چون داخل برنامه از نوع Varchar گرفته همه جا اومده از CAst استفاده کرده و به Varchar تبدیل کرده و همین باعث شده بود که SQL Server با وجود ایندکس نمیتونست از ایندکس درستی استفاده کنه چون دیگه Where Clause شما Sargable نیست و فیلدهای اون ماهیتا تغییر کردن بنابراین یک Index Scan رخ میده.
همین امر باعث شده بود که هزینه پلن نزدیک 30 بود و پلن پارالل شده بود و همچنین 70000 تا Logical Read بر روی جدول فوق داشتیم.
کدهای مربوطه رو اصلاح کردم و به همون شکل Guid نشونش دادم هزینه پلن شد 0.00170 , تعداد Logical REad جدول فوق نیز به 4 رسید و از ایندکسی که گذاشته بودم به راحتی استفاده کرد و یک Index Seek در پلن رخ داد.
لطفا در کدهاتون این مورد رو بسیار بهش دقت کنید و اگر مواردی این تیپی دارید حتما اصلاح کنید.
سعی میکنم در پست بعد کدی که بتونید به واسطه اون این تیپ Warning هارو بدست بیارید رو ارسال کنم.
ارادتمند شما
حمیدرضا صادقیان
@Hamidreza_Sadeghian
سلام خدمت دوستان عزیز
امیدوارم حالتون خوب باشه
یکی از دوستان از من سوال کرد که برای طراحی دیتابیس بهتره چه مواردی رعایت بشه.
من لیستی رو نوشتم که به نظرم اومد ، گفتم با شما هم به اشتراک بذارم امیدوارم به دردتون بخوره و کارساز باشه.
اگر نکته یا مطلبی در این خصوص دارید ممنون میشم به آیدی من ارسال کنید.
1 - دیتابیس باید تا حد امکان نرمال طراحی بشه
2- تعداد فیلدهای جدول نباید زیاد باشه
3- دیتا تایپ ها باید درست انتخاب بشه
4- هنگام نوشتن کدها باید حتما دیتا تایپها مشابه هم باشن
5- هنگام نوشتن کدهای SP و توابع باید حتی المقدور از Casting خودداری بشه
6- فقط داده هایی برگرده که بهش نیاز داریم
7- حتما کدها به صورت Set Based نوشته بشه
8- از توابع Scalar و MSTVF حتی المقدور کم استفاده بشه ( حداقل تا نسخه 2016)
9- به جای تریگرها حتی المقدور از Check Constraint ها استفاده بشه
10- کلیدها بهتره از نوع Int باشن
11- کلیدها وابسته نباشن و نیازی نباشه هنگام Update مقدار اونها عوض بشه
12- شرط ها به صورت Sargable Argument نوشته بشه که ایندکس ها درست روش اعمال بشن
13- بر روی هرجدول بیش از 2-3 تا ایندکس نباید باشه
14- تمام کوئری ها باید زیر 3 ثانیه جواب برگردونن که Locking و Blocking به حداقل برسه
15- برای درج داده ها به صورت دسته ای بهتره از SP با پارامترهای Table Parameter استفاده بشه و یک SP بارها صدا زده نشه
16- مدت زمانی که یک Transaction باز هست به حداقل برسه و تعداد لاک ها به حداقل برسه که عملیات lock escalation رخ نده ( البته این مورد به خودی خودش اشکال نیست و DB Engine انجام میده ولی با تکنیک های کدنویسی میشه مانع رخ دادنش شد که احتمال Blocking رو کاهش بده)
ارادتمند شما
حمیدرضا صادقیان
ID :@Hamidreza_Sadeghian
امیدوارم حالتون خوب باشه
یکی از دوستان از من سوال کرد که برای طراحی دیتابیس بهتره چه مواردی رعایت بشه.
من لیستی رو نوشتم که به نظرم اومد ، گفتم با شما هم به اشتراک بذارم امیدوارم به دردتون بخوره و کارساز باشه.
اگر نکته یا مطلبی در این خصوص دارید ممنون میشم به آیدی من ارسال کنید.
1 - دیتابیس باید تا حد امکان نرمال طراحی بشه
2- تعداد فیلدهای جدول نباید زیاد باشه
3- دیتا تایپ ها باید درست انتخاب بشه
4- هنگام نوشتن کدها باید حتما دیتا تایپها مشابه هم باشن
5- هنگام نوشتن کدهای SP و توابع باید حتی المقدور از Casting خودداری بشه
6- فقط داده هایی برگرده که بهش نیاز داریم
7- حتما کدها به صورت Set Based نوشته بشه
8- از توابع Scalar و MSTVF حتی المقدور کم استفاده بشه ( حداقل تا نسخه 2016)
9- به جای تریگرها حتی المقدور از Check Constraint ها استفاده بشه
10- کلیدها بهتره از نوع Int باشن
11- کلیدها وابسته نباشن و نیازی نباشه هنگام Update مقدار اونها عوض بشه
12- شرط ها به صورت Sargable Argument نوشته بشه که ایندکس ها درست روش اعمال بشن
13- بر روی هرجدول بیش از 2-3 تا ایندکس نباید باشه
14- تمام کوئری ها باید زیر 3 ثانیه جواب برگردونن که Locking و Blocking به حداقل برسه
15- برای درج داده ها به صورت دسته ای بهتره از SP با پارامترهای Table Parameter استفاده بشه و یک SP بارها صدا زده نشه
16- مدت زمانی که یک Transaction باز هست به حداقل برسه و تعداد لاک ها به حداقل برسه که عملیات lock escalation رخ نده ( البته این مورد به خودی خودش اشکال نیست و DB Engine انجام میده ولی با تکنیک های کدنویسی میشه مانع رخ دادنش شد که احتمال Blocking رو کاهش بده)
ارادتمند شما
حمیدرضا صادقیان
ID :@Hamidreza_Sadeghian
سلام به دوستان عزیز - آیا تا به حال با مشکلاتی از قبیل نداشتن فضای کافی برای گرفتن بکآپ و یا کاهش سرعت در هنگام بکآپ گیری برخورد کرده اید! اکثر این مشکلات از اینجا شروع میشود که پلن خوبی برای بکآپ گیری در سازمان وجود ندارد و تمامی بانکهای اطلاعاتی با یک پلن از پیش تعیین شده بکآپ گیری میشوند. در این بلاگ من در خصوص بکآپ گیری هوشمند توضیحاتی را داده ام. امیدوارم مورد قبول شما دوستان باشه. http://fard-solutions.com/sql-server-smart-database-backup-plan/
سلام خدمت دوستان عزیز
امیدوارم حالتون خوب باشه
احتمالا شما هم به این مشکل برخورد کردین که با چه روشی عملیات Paging رو در دیتابیس انجام بدین و یک سری رکوردهای خاص رو برگردونید.
در نسخه 2012 دستوری به نام offset Fetch معرفی شد که جز دستورات SQL ANSI است.
در ادامه یک SP نوشتم که دو تا پارامتر میگیره . یک تعداد رکوردهایی که نیاز هست فراخوانی بشه و دوم تعداد رکوردهایی که نیاز دارین Skip بشه و ازش رد بشه.
ساختار این دستور به شکل زیر است
Offset x rows fetch next y rows only
که پارامتر x تعداد رکوردهایی هست که شما میخواهید ازش صرفنظر کنید و بگذرید و پارامتر y تعداد رکوردهایی هست که تمایل دارید نمایش بده.
به کد SP توجه کنید.
Create Procedure UspPaging @FetchRow int, @SkipRow int
as
Select
Ob.object_id,
Ob.Name
from
Sys.objects as OB
order by ob.object_id
Offset @SkipRow rows fetch next @FetchRow rows only
Go
این هم نحوه فراخوانی
Exec UspPaging 10,0
در این دستور با اجرای SP هیچ رکوردی صرفنظر نشده و براساس Object_ID که مرتب شده ده رکورد اول رو برمیگردونه
Exec UspPaging 10,9
در این دستور 9 رکورد اول رو براساس Object_ID که مرتب شده صرفنظر میکنه و 10 رکورد بعدی رو نمایش میده.
امیدوارم این دستور به کار بیاد
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
امیدوارم حالتون خوب باشه
احتمالا شما هم به این مشکل برخورد کردین که با چه روشی عملیات Paging رو در دیتابیس انجام بدین و یک سری رکوردهای خاص رو برگردونید.
در نسخه 2012 دستوری به نام offset Fetch معرفی شد که جز دستورات SQL ANSI است.
در ادامه یک SP نوشتم که دو تا پارامتر میگیره . یک تعداد رکوردهایی که نیاز هست فراخوانی بشه و دوم تعداد رکوردهایی که نیاز دارین Skip بشه و ازش رد بشه.
ساختار این دستور به شکل زیر است
Offset x rows fetch next y rows only
که پارامتر x تعداد رکوردهایی هست که شما میخواهید ازش صرفنظر کنید و بگذرید و پارامتر y تعداد رکوردهایی هست که تمایل دارید نمایش بده.
به کد SP توجه کنید.
Create Procedure UspPaging @FetchRow int, @SkipRow int
as
Select
Ob.object_id,
Ob.Name
from
Sys.objects as OB
order by ob.object_id
Offset @SkipRow rows fetch next @FetchRow rows only
Go
این هم نحوه فراخوانی
Exec UspPaging 10,0
در این دستور با اجرای SP هیچ رکوردی صرفنظر نشده و براساس Object_ID که مرتب شده ده رکورد اول رو برمیگردونه
Exec UspPaging 10,9
در این دستور 9 رکورد اول رو براساس Object_ID که مرتب شده صرفنظر میکنه و 10 رکورد بعدی رو نمایش میده.
امیدوارم این دستور به کار بیاد
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
👍1
سلام و عرض ادب خدمت دوستان گرامی
شبتون بخیر باشه
نسخه ۲۰۱۷ نیز قابل استفاده می باشد و میتونید نسخه Developer اونو که تمامی امکانات نسخه Enterprise رو داره و به صورت رایگان عرضه میشه از سایت مایکروسافت دانلود کنید.
یکی از قابلیتهای جذابی که بهش اضافه شده این هست که شما میتونید دیتابیس هایی با ساختار گراف رو داخلش پیاده سازی کنید.
به عنوان مثال دیتابیسی مثل Facebook که همه اجزا به نوعی باهم درارتباط باشند.
این نوع دیتابیسها برای مواقعی بسیار کاربردی هست که شما یا ارتباطات بسیار پیچیده ای بین جداول خودتون دارید یا اینکه از فیلدهای hierarchyID استفاده می کنید.
یکی از محدودیتهای این فیلدها این هست که شما نمیتونید برای یک نود چندین نود پدر یا اصلی داشته باشید
ولی با وجود دیتابیس های گراف این مورد برای شما کاملا محیاست.
به این شکل شما میتونید یک ساختار درختی رو ایجاد کنید.
CREATE TABLE Person (ID INTEGER PRIMARY KEY, Name VARCHAR(100), Age INT) AS NODE;
CREATE TABLE friends (StartDate date) AS EDGE;
هم node ها هم Edge ها به صورت Table هستند و تمامی کارهایی که بر روی جداول میتونید انجام بدین بر روی این نوع جداول قابل پیاده سازی هست
برای کد نویسی هم دستور حدیدی به نام Match ااضافه شده که به شکل زیر است:
— Find friends of John
SELECT Person2.Name
FROM Person Person1, Friends, Person Person2
WHERE MATCH(Person1-(Friends)->Person2)
AND Person1.Name = 'John';
همچنین لازم به ذکر است که این ساختار به صورت کامل توسط خود SQL Server Engine ساپورت میشه و یک پردازشگر جداگانه براش تهیه نشده و همچنین ابزارها و کل اکوسیستم SQL Server مثل SSRS,SSIS, Power BI به راحتی با این نوع جداول ارتباط برقرار خواهند کرد .
امیدوارم از این مطلب لذت برده باشید
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
شبتون بخیر باشه
نسخه ۲۰۱۷ نیز قابل استفاده می باشد و میتونید نسخه Developer اونو که تمامی امکانات نسخه Enterprise رو داره و به صورت رایگان عرضه میشه از سایت مایکروسافت دانلود کنید.
یکی از قابلیتهای جذابی که بهش اضافه شده این هست که شما میتونید دیتابیس هایی با ساختار گراف رو داخلش پیاده سازی کنید.
به عنوان مثال دیتابیسی مثل Facebook که همه اجزا به نوعی باهم درارتباط باشند.
این نوع دیتابیسها برای مواقعی بسیار کاربردی هست که شما یا ارتباطات بسیار پیچیده ای بین جداول خودتون دارید یا اینکه از فیلدهای hierarchyID استفاده می کنید.
یکی از محدودیتهای این فیلدها این هست که شما نمیتونید برای یک نود چندین نود پدر یا اصلی داشته باشید
ولی با وجود دیتابیس های گراف این مورد برای شما کاملا محیاست.
به این شکل شما میتونید یک ساختار درختی رو ایجاد کنید.
CREATE TABLE Person (ID INTEGER PRIMARY KEY, Name VARCHAR(100), Age INT) AS NODE;
CREATE TABLE friends (StartDate date) AS EDGE;
هم node ها هم Edge ها به صورت Table هستند و تمامی کارهایی که بر روی جداول میتونید انجام بدین بر روی این نوع جداول قابل پیاده سازی هست
برای کد نویسی هم دستور حدیدی به نام Match ااضافه شده که به شکل زیر است:
— Find friends of John
SELECT Person2.Name
FROM Person Person1, Friends, Person Person2
WHERE MATCH(Person1-(Friends)->Person2)
AND Person1.Name = 'John';
همچنین لازم به ذکر است که این ساختار به صورت کامل توسط خود SQL Server Engine ساپورت میشه و یک پردازشگر جداگانه براش تهیه نشده و همچنین ابزارها و کل اکوسیستم SQL Server مثل SSRS,SSIS, Power BI به راحتی با این نوع جداول ارتباط برقرار خواهند کرد .
امیدوارم از این مطلب لذت برده باشید
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه و تعطیلات خوبی رو داشته باشید
یکی از سوالاتی که میبینم خیلی مطرح میشه نحوه لاگ کردن عملیات کاربران هست
جوابهایی هم که احتمالا خواهید شنید استفاده از CDC یا تریگر هست.
یکی از مشکلاتی که تریگر ایجاد میکنه روی مباحث پرفورمنسی هست و وقتی تعداد درخواستها زیاد میشه کندی هایی رو همراه خواهدداشت و معمولا چون کدها نیز بهینه نوشته نمی شوند ، همین کدها میشه سرمنشا Blocking ها و Dead Lock ها.
احتمالا میپرسید خوب پس راه حل چیه؟
یکی از راههای خوب و مناسب استفاده از دستور Output در دستورات Insert,Update,Delete هست. توسط این دستور شما به جداول Deteled,Inserted که در فایل Log ایجاد می شوند و فقط در تریگرها در دسترس بود ، دسترسی خواهید داشت.
بیاید باهم این روش رو پیش ببریم و یک نمونه برای این روش به صورت تستی پیاده سازی کنیم.
در کد زیر من یک جدول محصولات دارم و یک جدول Userlog که قراره روی این سه تا عمل من لاگش رو ایجاد کنم.
اگر این کد رو اجرا کنید نتیجه رو خواهید دید.
Create Table Product
(ID int Identity(1,1),
UserId int,
Code varchar(20),
[Name] Varchar(30)
)
Go
Create Table UserLog
(Id Int identity(1,1),
UserId int,
section varchar(30),
Operation varchar(30),
[Message] varchar(1000)
)
Go
Insert Into Product
(UserId,
Code,
[Name])
Output
inserted.userId,
'Prodcut Table' as Section,
'Insert Operation' as Operation,
inserted.code+'-'+inserted.[name] as [Message]
Into
UserLog (UserId,section,Operation,[Message])
Values(10,
'AX10_25',
'LG Television'),
(20,
'50627XP25',
'Apple Iphone')
Go
Delete From Product
Output SUSER_ID(),
'Product Table',
'Delete Operation',
deleted.code+' - '+deleted.[Name] as [Message]
Into
UserLog (UserId,section,Operation,[Message])
Where
Id=1
Go
Update
Product
Set [Name]='Iphone 7sPlus'
output SUSER_ID(),
'Product Operation',
'Update operation',
deleted.code+' - '+deleted.[Name]+' is Old value' +char(13)+char(10)+
inserted.code+' - '+inserted.[Name]+' is new value' as [message]
Into
UserLog (UserId,section,Operation,[Message])
where
id=2
Go
select * from Product;
Select * from UserLog;
اگر سوالی در این زمینه بود یا متوجه نشدین لطفا در گروه مطرح کنید پاسخ بدم
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
امیدوارم حالتون خوب باشه و تعطیلات خوبی رو داشته باشید
یکی از سوالاتی که میبینم خیلی مطرح میشه نحوه لاگ کردن عملیات کاربران هست
جوابهایی هم که احتمالا خواهید شنید استفاده از CDC یا تریگر هست.
یکی از مشکلاتی که تریگر ایجاد میکنه روی مباحث پرفورمنسی هست و وقتی تعداد درخواستها زیاد میشه کندی هایی رو همراه خواهدداشت و معمولا چون کدها نیز بهینه نوشته نمی شوند ، همین کدها میشه سرمنشا Blocking ها و Dead Lock ها.
احتمالا میپرسید خوب پس راه حل چیه؟
یکی از راههای خوب و مناسب استفاده از دستور Output در دستورات Insert,Update,Delete هست. توسط این دستور شما به جداول Deteled,Inserted که در فایل Log ایجاد می شوند و فقط در تریگرها در دسترس بود ، دسترسی خواهید داشت.
بیاید باهم این روش رو پیش ببریم و یک نمونه برای این روش به صورت تستی پیاده سازی کنیم.
در کد زیر من یک جدول محصولات دارم و یک جدول Userlog که قراره روی این سه تا عمل من لاگش رو ایجاد کنم.
اگر این کد رو اجرا کنید نتیجه رو خواهید دید.
Create Table Product
(ID int Identity(1,1),
UserId int,
Code varchar(20),
[Name] Varchar(30)
)
Go
Create Table UserLog
(Id Int identity(1,1),
UserId int,
section varchar(30),
Operation varchar(30),
[Message] varchar(1000)
)
Go
Insert Into Product
(UserId,
Code,
[Name])
Output
inserted.userId,
'Prodcut Table' as Section,
'Insert Operation' as Operation,
inserted.code+'-'+inserted.[name] as [Message]
Into
UserLog (UserId,section,Operation,[Message])
Values(10,
'AX10_25',
'LG Television'),
(20,
'50627XP25',
'Apple Iphone')
Go
Delete From Product
Output SUSER_ID(),
'Product Table',
'Delete Operation',
deleted.code+' - '+deleted.[Name] as [Message]
Into
UserLog (UserId,section,Operation,[Message])
Where
Id=1
Go
Update
Product
Set [Name]='Iphone 7sPlus'
output SUSER_ID(),
'Product Operation',
'Update operation',
deleted.code+' - '+deleted.[Name]+' is Old value' +char(13)+char(10)+
inserted.code+' - '+inserted.[Name]+' is new value' as [message]
Into
UserLog (UserId,section,Operation,[Message])
where
id=2
Go
select * from Product;
Select * from UserLog;
اگر سوالی در این زمینه بود یا متوجه نشدین لطفا در گروه مطرح کنید پاسخ بدم
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
سلام و عرض ادب خدمت دوستان عزیزم
شب بر شما خوش
یکی از مشکلاتی که اکثر مدیران سازمانها و شرکتها باهاش درگیر هستن این هست که شاید بعضی از موقعیتهای شغلی رو نشناسن یا اینکه اسمش رو شنیده باشن ولی درک درستی از وظایف اون نداشته باشن.
یکی از این مشاغلی که درک درستی ازش نیست و متاسفانه در سازمانها نیز بسیار پراهمیت هست DBA یا مسئول نگهداری بانک های اطلاعاتی هست.
الان تا با شرکتی صحبت میکنم یا یک سازمان ، بحث DBA که مطرح میشه سریع میگن ما خودمون یک DBA داریم.
بعد که شروع میکنم 10 درصد وظایف DBA رو میگم تازه متوجه میشن ظاهرا همچین شخصی رو ندارند.
شما به عنوان مدیر یک مجموعه آیا نسبت به صحت اطلاعات خود مطمئن هستید؟
نسبت به صحت Backup های تهیه شده مطمئن هستید؟
نسبت به امنیت بانک های اطلاعاتی و سرور مطمئن هستید؟
تسبت به Stable بودن سرور بانک های اطلاعاتی تون مطمئن هستید؟
و....
این لیست ادامه دار است!!!!
مدیران عزیز، دقت کنید کسی که مسئول شبکه هست یا برنامه نویس هست الزاما نمیتونه DBA سازمان شما باشه. به خاطر کاهش هزینه بعدا سربارهای هزینه ای زیادی رو همین صرفه جویی به شما تحمیل خواهد کرد که مجبور خواهید بود پرداخت کنید.
آیا شما برای بدن خودتون وقتی که قلبتون درد میکنه به یک دکتر عمومی مراجعه میکنید؟ آیا برای کمردرد یا دردهای دیگه (خدای نکرده) به دکتر عمومی مراجعه میکنید؟ یا برای هردرد پیش متخصص اون درد یا بیماری می روید؟
هفته پیش از یک شرکت نسبتا بزرگی یک دیتابیسی رو آوردن برای من که بازیابی کنم.
این دیتابیس گرفتار باج افزار شده بود. تمام بکاپ ها آسیب دیده بودن. فایل MDF خراب شده بود.
خوب حال چرا این مشکلات بر سر دیتابیس عملیاتی رخ داده؟
DBA سازمان مسئول شبکه بود.
مسئولیت تهیه بکاپ از نرم افزار به عهده شرکت نرم افزاری بود که سیستم رو راه اندازی کرده بود!!!!!!!!!!!!!! ( شرکت های نرم افزاری اصلا نباید نباید نباید به هیچ وجهی دسترسی به سرور بانک اطلاعاتی داشته باشن)
بعد جالبه که خواستن اسکریپت تغییرات رو اجرا کنن، خیلی راحت یک RDP به سرور زدن ، یک نرم افزار نصب کردن اسکریپت رو اجرا کردن همه چیز تعطیل شده.
کسی که نبوده اسکریپت رو چک کنه( بارها دیدم متاسفانه شرکتهای نرم افزاری برای حل مشکلات سرعت یک کلمه ای رو میشنون ، میرن یک جستجوی سطحی میکنن چند تا اسکریپت پیدا میکنن و به صورت تستی روی محیط تست خودشون اجرا میکنن ، چون 10-20 درصد پیشرفت میبینن سریع میان اونو بسطش میدن روی تمام محیط ها بدون اینکه اصلا بدونن کار اون اسکریپت چیه و چیکار میکنه)
الحمدلله بکاپ هم که قبل از کار نمیگرفتن یعنی خیلی اعتقادی به بکاپ و این چیزها نداشتن . این مسائل سوسول بازیه ظرفیت هارد رو میگیره.
بعد که اطلاعات پریده حالا شرکت نرم افزاری با دوجین نرم افزار ریکاوری دیتابیس افتادن به جون MDF بخشی از دیتا برگشته مابقیش هم خیر. خودشون هم که توان ندارن دیتای سیستم خودشون رو اصلاح کنن.!!!!
حالا اگر مدیرعامل اون سازمان میدونست که یک DBA میتونه از این فاجعه جلوگیری کنه ، حاضر نیست مثلا ماهی 4 میلیون هزینه کنه؟
یعنی اطلاعات سازمانش، عدم تعطیلی و از بین رفتن اطلاعاتش ، هزینه های جانبی دیگه براش کم ارزش تر از 4 میلیونه؟
در شبهای آتی بیشتر در این خصوص صحبت خواهم کرد.
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
شب بر شما خوش
یکی از مشکلاتی که اکثر مدیران سازمانها و شرکتها باهاش درگیر هستن این هست که شاید بعضی از موقعیتهای شغلی رو نشناسن یا اینکه اسمش رو شنیده باشن ولی درک درستی از وظایف اون نداشته باشن.
یکی از این مشاغلی که درک درستی ازش نیست و متاسفانه در سازمانها نیز بسیار پراهمیت هست DBA یا مسئول نگهداری بانک های اطلاعاتی هست.
الان تا با شرکتی صحبت میکنم یا یک سازمان ، بحث DBA که مطرح میشه سریع میگن ما خودمون یک DBA داریم.
بعد که شروع میکنم 10 درصد وظایف DBA رو میگم تازه متوجه میشن ظاهرا همچین شخصی رو ندارند.
شما به عنوان مدیر یک مجموعه آیا نسبت به صحت اطلاعات خود مطمئن هستید؟
نسبت به صحت Backup های تهیه شده مطمئن هستید؟
نسبت به امنیت بانک های اطلاعاتی و سرور مطمئن هستید؟
تسبت به Stable بودن سرور بانک های اطلاعاتی تون مطمئن هستید؟
و....
این لیست ادامه دار است!!!!
مدیران عزیز، دقت کنید کسی که مسئول شبکه هست یا برنامه نویس هست الزاما نمیتونه DBA سازمان شما باشه. به خاطر کاهش هزینه بعدا سربارهای هزینه ای زیادی رو همین صرفه جویی به شما تحمیل خواهد کرد که مجبور خواهید بود پرداخت کنید.
آیا شما برای بدن خودتون وقتی که قلبتون درد میکنه به یک دکتر عمومی مراجعه میکنید؟ آیا برای کمردرد یا دردهای دیگه (خدای نکرده) به دکتر عمومی مراجعه میکنید؟ یا برای هردرد پیش متخصص اون درد یا بیماری می روید؟
هفته پیش از یک شرکت نسبتا بزرگی یک دیتابیسی رو آوردن برای من که بازیابی کنم.
این دیتابیس گرفتار باج افزار شده بود. تمام بکاپ ها آسیب دیده بودن. فایل MDF خراب شده بود.
خوب حال چرا این مشکلات بر سر دیتابیس عملیاتی رخ داده؟
DBA سازمان مسئول شبکه بود.
مسئولیت تهیه بکاپ از نرم افزار به عهده شرکت نرم افزاری بود که سیستم رو راه اندازی کرده بود!!!!!!!!!!!!!! ( شرکت های نرم افزاری اصلا نباید نباید نباید به هیچ وجهی دسترسی به سرور بانک اطلاعاتی داشته باشن)
بعد جالبه که خواستن اسکریپت تغییرات رو اجرا کنن، خیلی راحت یک RDP به سرور زدن ، یک نرم افزار نصب کردن اسکریپت رو اجرا کردن همه چیز تعطیل شده.
کسی که نبوده اسکریپت رو چک کنه( بارها دیدم متاسفانه شرکتهای نرم افزاری برای حل مشکلات سرعت یک کلمه ای رو میشنون ، میرن یک جستجوی سطحی میکنن چند تا اسکریپت پیدا میکنن و به صورت تستی روی محیط تست خودشون اجرا میکنن ، چون 10-20 درصد پیشرفت میبینن سریع میان اونو بسطش میدن روی تمام محیط ها بدون اینکه اصلا بدونن کار اون اسکریپت چیه و چیکار میکنه)
الحمدلله بکاپ هم که قبل از کار نمیگرفتن یعنی خیلی اعتقادی به بکاپ و این چیزها نداشتن . این مسائل سوسول بازیه ظرفیت هارد رو میگیره.
بعد که اطلاعات پریده حالا شرکت نرم افزاری با دوجین نرم افزار ریکاوری دیتابیس افتادن به جون MDF بخشی از دیتا برگشته مابقیش هم خیر. خودشون هم که توان ندارن دیتای سیستم خودشون رو اصلاح کنن.!!!!
حالا اگر مدیرعامل اون سازمان میدونست که یک DBA میتونه از این فاجعه جلوگیری کنه ، حاضر نیست مثلا ماهی 4 میلیون هزینه کنه؟
یعنی اطلاعات سازمانش، عدم تعطیلی و از بین رفتن اطلاعاتش ، هزینه های جانبی دیگه براش کم ارزش تر از 4 میلیونه؟
در شبهای آتی بیشتر در این خصوص صحبت خواهم کرد.
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
در پست قبل بحثی رو پیرامون شرح وظایف یک DBA و کلا تعریف کلمه و کار یک DBA آغاز کردم.
چندین پیام مختلف داشتم از شما عزیزان داشتم که بهش اشاره خواهم کرد.
اول پستهای اون عزیزان رو درحد یکی دو جمله بهش میپردازم بعد ادامه مطلب رو پیش میگیرم
دوست بزرگواری گفتن که وقتی مسئول شبکه 2 میلیون حقوق میگیره و شخصی میاد به عنوان DBA درخواست 4 میلیون حقوق میکنه . مدیر شبکه میگه اون 2 میلیون رو بدین من کارشو انجام میدم. خوب بله این حرف تا حدی درسته. شاید اون مدیر شبکه تا حدودی بلد باشن با SSMS! کار کنند نه SQL Server !
اینکه یک مدیر شبکه بلد باشه با SSMS کار کنه و به SQL Server وصل بشه و یک Backup تهیه کنه دلیل نمیشه که تسلط کافی داشته باشه و به ساختار داخلی اون مسلط باشه( البته برای هر ابزاری این نیاز نیست ولی حداقل برای زبان های برنامه نویسی و بانک های اطلاعاتی، درصورتی که میخواهید به یک کد باکیفیت برسید این مورد الزامی و واجبه. در ثانی این عدم تسلط زمان Disaster به صورت خیلی واضح خودش رو به نمایش خواهد گذاشت 😅😅)
دوم اینکه اون شخصی که مسئول شبکه هست هم نباید این رقم حقوقش باشه اگر واقعا در کار خودش حرفه ای است. چون شبکه یک سازمان جز شاهراه حیاتی اون سازمان محسوب میشه و کوچکترین خطا میتونه به مرگ سازمان منجر بشه.
حالا بپردازیم به تعریف اولیه DBA
کلمه DBA مخفف عبارت Database Administrator هست.
یعنی شخصی که مسئولیت نگهداری از بانکهای اطلاعاتی را به عهده دارد.
خوب احتمالا این سوال براتون پیش میاد که این مسئولیت ها چه چیزهایی هست و یک DBA باید به چه مواردی تسلط داشته باشد.
در ادامه من لیست مواردی که یک DBA باید به آنها تسلط داشته باشد را ارائه خواهم داد.
- نگهداری از سرور SQL Server و کنترل لاگ های تولیدی در سطح ویندوز
- آشنایی با مفاهیم شبکه
- بررسی لاگ های تولیدی SQL Server
- آشنایی با سخت افزارهای مختلف موجود بر روی یک سرور و نحوه Config کردن آنها ( مانند شناخت انواع Raid ها ، CPU ها و ... )
- آشنایی با دیباگرها مانند kd یا windbg برای بررسی Memory Dump های SQL Server
- تسلط کامل به زبان T-SQL
- تسلط کامل نسبت به رفتار درونی SQL Server
- تسلط کامل به راه اندازی HA
- آشنا با ابزارهای مانیتورینگ و تسلط کامل برای مانیتور کردن سرور
- آشنا با ابزار SSIS
- شناخت کامل Service های SQL Server و نحوه Config کردن آنها مانند SSRS,SSAS,SSIS
- تسلط کامل نسبت به مباحث امنیتی پیرامون SQL Server مانند پیاده سازی استراتژی سطح دسترسی ها، کنترل دسترسی سرویس ها، و...
- شناخت کامل نسخه های مختلف SQL Server و ارائه راه کار برای بروز رسانی به نسخه های جدید
- دارای توانایی بسیار زیاد در کنترل سطح استرس خویش
- دارای توانایی زیاد در ارائه گزارشات دقیق مدیریتی و روحیه تعاملی با تیم های نرم افزاری
در پستهای بعدی د رمورد شرح وظایف یک DBA مواردی رو بیان میکنم شاید این موارد باعث شود مدیران مجموعه ها نسبت به انتخاب افراد دقت بیشتری به خرج دهند و کمتر شاهد از بین رفتن داده ها ، به سرقت رفتن اطلاعات و مواردی از این دست باشیم
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
امیدوارم حالتون خوب باشه
در پست قبل بحثی رو پیرامون شرح وظایف یک DBA و کلا تعریف کلمه و کار یک DBA آغاز کردم.
چندین پیام مختلف داشتم از شما عزیزان داشتم که بهش اشاره خواهم کرد.
اول پستهای اون عزیزان رو درحد یکی دو جمله بهش میپردازم بعد ادامه مطلب رو پیش میگیرم
دوست بزرگواری گفتن که وقتی مسئول شبکه 2 میلیون حقوق میگیره و شخصی میاد به عنوان DBA درخواست 4 میلیون حقوق میکنه . مدیر شبکه میگه اون 2 میلیون رو بدین من کارشو انجام میدم. خوب بله این حرف تا حدی درسته. شاید اون مدیر شبکه تا حدودی بلد باشن با SSMS! کار کنند نه SQL Server !
اینکه یک مدیر شبکه بلد باشه با SSMS کار کنه و به SQL Server وصل بشه و یک Backup تهیه کنه دلیل نمیشه که تسلط کافی داشته باشه و به ساختار داخلی اون مسلط باشه( البته برای هر ابزاری این نیاز نیست ولی حداقل برای زبان های برنامه نویسی و بانک های اطلاعاتی، درصورتی که میخواهید به یک کد باکیفیت برسید این مورد الزامی و واجبه. در ثانی این عدم تسلط زمان Disaster به صورت خیلی واضح خودش رو به نمایش خواهد گذاشت 😅😅)
دوم اینکه اون شخصی که مسئول شبکه هست هم نباید این رقم حقوقش باشه اگر واقعا در کار خودش حرفه ای است. چون شبکه یک سازمان جز شاهراه حیاتی اون سازمان محسوب میشه و کوچکترین خطا میتونه به مرگ سازمان منجر بشه.
حالا بپردازیم به تعریف اولیه DBA
کلمه DBA مخفف عبارت Database Administrator هست.
یعنی شخصی که مسئولیت نگهداری از بانکهای اطلاعاتی را به عهده دارد.
خوب احتمالا این سوال براتون پیش میاد که این مسئولیت ها چه چیزهایی هست و یک DBA باید به چه مواردی تسلط داشته باشد.
در ادامه من لیست مواردی که یک DBA باید به آنها تسلط داشته باشد را ارائه خواهم داد.
- نگهداری از سرور SQL Server و کنترل لاگ های تولیدی در سطح ویندوز
- آشنایی با مفاهیم شبکه
- بررسی لاگ های تولیدی SQL Server
- آشنایی با سخت افزارهای مختلف موجود بر روی یک سرور و نحوه Config کردن آنها ( مانند شناخت انواع Raid ها ، CPU ها و ... )
- آشنایی با دیباگرها مانند kd یا windbg برای بررسی Memory Dump های SQL Server
- تسلط کامل به زبان T-SQL
- تسلط کامل نسبت به رفتار درونی SQL Server
- تسلط کامل به راه اندازی HA
- آشنا با ابزارهای مانیتورینگ و تسلط کامل برای مانیتور کردن سرور
- آشنا با ابزار SSIS
- شناخت کامل Service های SQL Server و نحوه Config کردن آنها مانند SSRS,SSAS,SSIS
- تسلط کامل نسبت به مباحث امنیتی پیرامون SQL Server مانند پیاده سازی استراتژی سطح دسترسی ها، کنترل دسترسی سرویس ها، و...
- شناخت کامل نسخه های مختلف SQL Server و ارائه راه کار برای بروز رسانی به نسخه های جدید
- دارای توانایی بسیار زیاد در کنترل سطح استرس خویش
- دارای توانایی زیاد در ارائه گزارشات دقیق مدیریتی و روحیه تعاملی با تیم های نرم افزاری
در پستهای بعدی د رمورد شرح وظایف یک DBA مواردی رو بیان میکنم شاید این موارد باعث شود مدیران مجموعه ها نسبت به انتخاب افراد دقت بیشتری به خرج دهند و کمتر شاهد از بین رفتن داده ها ، به سرقت رفتن اطلاعات و مواردی از این دست باشیم
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
سلام وعرض ادب خدمت دوستان عزیز
امیدوارم حالتون خوب باشه
سالروز ولادت حضرت محمد مصطفی (ص) و امام جعفر صادق(ع) رو خدمت همه عزیزان تبریک عرض میکنم
یکی از موارد بسیار مهم در بررسی Performance کدهای نوشته شده بررسی Plan ایجاد شده توسط SQL Server است.
خود SSMS بهتون این Plan رو نمایش میده و میتونید موارد زیادی رو د راین پلن مشاهده کنید.
یکی از ابزارهایی که این پلن ها رو خیلی دقیقتر و با جزئیات خیلی بیشتری در یک نگاه به شما ارائه می کند، Plan Explorer هست
این ابزار رو می تونید به صورت رایگان از لینک زیر دریافت کنید.
https://www.sentryone.com/plan-explorer
بعد از نصب این ابزار ، در خود SSMS میتونید روی Plan ایجاد شده راست کلیک کنید و گزینه View with SentryOne Plan Explorer رو بزنید
سعی میکنم در پستهای بعدی مواردی را که در این ابزار بسیار مورد توجه قرار میگیرد ، در موردش صحبت کنم.
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
امیدوارم حالتون خوب باشه
سالروز ولادت حضرت محمد مصطفی (ص) و امام جعفر صادق(ع) رو خدمت همه عزیزان تبریک عرض میکنم
یکی از موارد بسیار مهم در بررسی Performance کدهای نوشته شده بررسی Plan ایجاد شده توسط SQL Server است.
خود SSMS بهتون این Plan رو نمایش میده و میتونید موارد زیادی رو د راین پلن مشاهده کنید.
یکی از ابزارهایی که این پلن ها رو خیلی دقیقتر و با جزئیات خیلی بیشتری در یک نگاه به شما ارائه می کند، Plan Explorer هست
این ابزار رو می تونید به صورت رایگان از لینک زیر دریافت کنید.
https://www.sentryone.com/plan-explorer
بعد از نصب این ابزار ، در خود SSMS میتونید روی Plan ایجاد شده راست کلیک کنید و گزینه View with SentryOne Plan Explorer رو بزنید
سعی میکنم در پستهای بعدی مواردی را که در این ابزار بسیار مورد توجه قرار میگیرد ، در موردش صحبت کنم.
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
Solarwinds
Plan Explorer – SQL Query Analysis | SolarWinds
Simplify query analysis with Plan Explorer, a free query analyzer and index optimization tool. 100% free download.
سلام و عرض ادب خدمت دوستان گرامی
امیدوارم حالتون خوب باشه
این پست روبعد از ده ساعت کار مداوم بر روی ۲۰۰ گیگابایت اطلاعات دیتابیس میذارم که بدون بکاپ بازیابی شد.
یکی از نکات بسیار مهم جهت بازیابی اطلاعات فایلهای آسیب دیده این هست که اول با اون دیتابیس دیگه شخصی کار نکنه.
مورد دوم این هست که دیتابیس detach نشه و اگه قصد دارید فایلهای دیتا رو جابجا کنید یا instance رو stop کنید یا اینکه دیتابیس رو offline کنید
مورد بعدی اینکه دیتابیس شیرینک نشه
نکته بعد اینکه اگر دستور dbcc checkdb رو بر روی دیتابیس اجرا کردین وسط کار اونو قطع نکنید و اجازه بدین کارش به اتمام برسه
با رعایت نکردن این موارد عملا کار بازیابی اطلاعات سخت تر خواهد شد.
امیدوارم با راهکارهای مناسب نگهدای دیتابیس هاتون هیچ وقت این قبیل مشکلات براتونرخ نده.
ارادتمند شما
حمیدرضا صادقیان
Id:@Hamidreza_sadeghian
@SQL_server
امیدوارم حالتون خوب باشه
این پست روبعد از ده ساعت کار مداوم بر روی ۲۰۰ گیگابایت اطلاعات دیتابیس میذارم که بدون بکاپ بازیابی شد.
یکی از نکات بسیار مهم جهت بازیابی اطلاعات فایلهای آسیب دیده این هست که اول با اون دیتابیس دیگه شخصی کار نکنه.
مورد دوم این هست که دیتابیس detach نشه و اگه قصد دارید فایلهای دیتا رو جابجا کنید یا instance رو stop کنید یا اینکه دیتابیس رو offline کنید
مورد بعدی اینکه دیتابیس شیرینک نشه
نکته بعد اینکه اگر دستور dbcc checkdb رو بر روی دیتابیس اجرا کردین وسط کار اونو قطع نکنید و اجازه بدین کارش به اتمام برسه
با رعایت نکردن این موارد عملا کار بازیابی اطلاعات سخت تر خواهد شد.
امیدوارم با راهکارهای مناسب نگهدای دیتابیس هاتون هیچ وقت این قبیل مشکلات براتونرخ نده.
ارادتمند شما
حمیدرضا صادقیان
Id:@Hamidreza_sadeghian
@SQL_server
سلام وعرض ادب خدمت دوستان عزیز
شب بر شما خوش باشه انشالله
یکی از قابلیتهای اضافه شده در SQL Server 2016 استفاده از JSON هست.
در این مقاله که لینکش رو قرار میدهم به شما نشان میدهد که چطور و به سادگی میتوانید با استفاده از این قابلیت توسعه Rest API رو خیلی راحتتر انجام بدین.
امیدوارم از این مقاله لذت ببرید
ارادتمند شما
حمیدرضا صادقیان
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/01/29/simplify-rest-api-development-modern-single-page-apps-sql-server/?utm_source=dlvr.it&utm_medium=linkedin
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
شب بر شما خوش باشه انشالله
یکی از قابلیتهای اضافه شده در SQL Server 2016 استفاده از JSON هست.
در این مقاله که لینکش رو قرار میدهم به شما نشان میدهد که چطور و به سادگی میتوانید با استفاده از این قابلیت توسعه Rest API رو خیلی راحتتر انجام بدین.
امیدوارم از این مقاله لذت ببرید
ارادتمند شما
حمیدرضا صادقیان
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/01/29/simplify-rest-api-development-modern-single-page-apps-sql-server/?utm_source=dlvr.it&utm_medium=linkedin
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
Forwarded from AM
#نکته شماره 1
استفاده از تابع بر روی ستونی که دارای ایندکس است در where clause عموما به جای index seek منجر به index scan یا Table Scan می شود.
مثال : جدول دانشجو با مشخصات زیر موجود است :
Student(Sno,Name,Family,…)
Sno : PK+Clustered Index
Family: Non Clustered Index
اجرای کوئیری ذیل منجر به non clustered index scan خواهد شد.
Select *
From Student
Where Left(Family,2)=’Ma’
علت : نیاز به محاسبه مقدار خروجی تابع به ازاء هر رکورد جدول
راه حل : استفاده از Like
Select *
From Student
Where Family Like ’Ma%’
در این حالت از Non clustered Index Seek استفاده می شود که از نظر تعداد IO و زمان اجرا نسبت به Non clustered Index Scan بسیار کارآمدتر است.
عبارات Sargable عباراتی هستند که دستخوش تغییرات نمی شوند و SQL Server هنگامی که ایندکس مناسبی روش باشه ، از ایندکس ها استفاده خواهد کرد. ولی اگر فیلدها دستخوش تغییرات شوند دیگه Sargable نبوده و باعث می شود از Index Scan استفاده بشه که سبب کندی و خواندن Page های زیاد خواهد شد.
استفاده از تابع بر روی ستونی که دارای ایندکس است در where clause عموما به جای index seek منجر به index scan یا Table Scan می شود.
مثال : جدول دانشجو با مشخصات زیر موجود است :
Student(Sno,Name,Family,…)
Sno : PK+Clustered Index
Family: Non Clustered Index
اجرای کوئیری ذیل منجر به non clustered index scan خواهد شد.
Select *
From Student
Where Left(Family,2)=’Ma’
علت : نیاز به محاسبه مقدار خروجی تابع به ازاء هر رکورد جدول
راه حل : استفاده از Like
Select *
From Student
Where Family Like ’Ma%’
در این حالت از Non clustered Index Seek استفاده می شود که از نظر تعداد IO و زمان اجرا نسبت به Non clustered Index Scan بسیار کارآمدتر است.
عبارات Sargable عباراتی هستند که دستخوش تغییرات نمی شوند و SQL Server هنگامی که ایندکس مناسبی روش باشه ، از ایندکس ها استفاده خواهد کرد. ولی اگر فیلدها دستخوش تغییرات شوند دیگه Sargable نبوده و باعث می شود از Index Scan استفاده بشه که سبب کندی و خواندن Page های زیاد خواهد شد.
👍1
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
یکی از ابزارهای جالبی که در SSMS 17.5 اضافه شده قابلیت دسته بندی و کشف داده های حساس و برچسب گداری بر روی این اطلاعات هست. که براساس این دسته بندی میتونید نوع جدیدی از امنیت رو بر روی دیتابیس فراهم کنید و همچنین گزارشات مختلفی رو میتونید به صورت Pivot تهیه کنید.
در لینک زیر در این خصوص کامل توضیح داده شده است.
برای نسخه جدید SSMS نیز میتونید از سایت مایکروسافت اقدام کنید
ار از نسخه های 17.X استفاده میکنید میتونید پکیج Update اونو که حدود 360 مگابایت هست دانلود کنید و نیازی نیست که نسخه جدید که نزدیک 900 مگابایت هست رو دانلود کنید.
ارادتمند شما
حمیدرضا صادقیان
https://docs.microsoft.com/en-us/sql/relational-databases/security/sql-data-discovery-and-classification
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
امیدوارم حالتون خوب باشه
یکی از ابزارهای جالبی که در SSMS 17.5 اضافه شده قابلیت دسته بندی و کشف داده های حساس و برچسب گداری بر روی این اطلاعات هست. که براساس این دسته بندی میتونید نوع جدیدی از امنیت رو بر روی دیتابیس فراهم کنید و همچنین گزارشات مختلفی رو میتونید به صورت Pivot تهیه کنید.
در لینک زیر در این خصوص کامل توضیح داده شده است.
برای نسخه جدید SSMS نیز میتونید از سایت مایکروسافت اقدام کنید
ار از نسخه های 17.X استفاده میکنید میتونید پکیج Update اونو که حدود 360 مگابایت هست دانلود کنید و نیازی نیست که نسخه جدید که نزدیک 900 مگابایت هست رو دانلود کنید.
ارادتمند شما
حمیدرضا صادقیان
https://docs.microsoft.com/en-us/sql/relational-databases/security/sql-data-discovery-and-classification
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
SQL Server Group : https://telegram.me/joinchat/BTQQtzy50j80lW2DM90Wtw
Docs
SQL Data Discovery & Classification - SQL Server
سلام و عرض ادب خدمت دوستان عزیز
امیدوارم حالتون خوب باشه
شاید برای شما پیش اومده باشه که بخواهید هنگام نمایش اطلاعات ، اونها رو مخفی کنید . مثلا بخواهید فقط سه رقم شماره موبایل رو نمایش بدید. یا مثلا حرف اول ایمیل رو نمایش بدین ولی اطلاعات به صورت کاملا صحیح و درست در داخل دیتابیس ذخیره شده باشند. از طریق کنترل دسترسی ها شما نمیتونید این تغییرات رو اعمال کنید.
به عنوان مثال فرض کنید شما قصد دارید شماره های تلفن به شکل زیر نمایش داده بشه
0912XXXXXXXXX
ولی داده های شماره ها به صورت کاملا صحیح در دیتابیس ذخیره شده و کاربر نیز دسترسی Select به این ستون رو داره فقط میخواهیم موقع نمایش اطلاعات به این شکل نمایش داده بشه.
راه اولش این هست سمت Client ودر UI این مورد هندل بشه
راه دوم استفاده از Dynamic Data Masking در SQL Server هست که در این مقاله به شما نحوه استفاده از اون رو آموزش خواهم داد.
برای استفاده از این قابلیت باید در جدول و بر روی فیلد مورد نظر این تغییرات رو اعمال کنید.
اگر جدول جدیدی میخواهید بسازید و نیاز به فعال سازی این قابلیت دارید میتونید از ساختار زیر در هنگام ساخت جدول استفاده کنید.
CREATE TABLE HR.EmployeePersonalData
(empid int NOT NULL PRIMARY KEY,
salary int MASKED WITH (FUNCTION = 'default()') NOT NULL,
email_address varchar(255) MASKED WITH (FUNCTION = 'email()') NULL,
voice_mail_pin smallint MASKED WITH (FUNCTION = 'random(0, 9)') NULL,
company_credit_card_number varchar(30) MASKED WITH (FUNCTION = 'partial(0,"XXXX-",4)') NULL,
home_phone_number varchar(30) NULL
);
GO
اگر جدول وجود داره و نیاز دارید این قابلیت رو به یک فیلد اضافه کنید از شکل زیر استفاده کنید.
ALTER TABLE HR.EmployeePersonalData
ALTER COLUMN home_phone_number
ADD MASKED WITH (FUNCTION = 'partial(4,"-XXX",0)');
GO
همچنین اگر این قابلیت بر روی یک فیلد فعال باشه و شما بخواهید یک کاربر به صورت کامل اطلاعات رو ببینه میتونید با استفاده از دستور زیر بهش دسترسی بدین که کل اطلاعات رو بدون اعمال Masking ملاحظه کنه.
Grant UNMASK TO test_user;
و اگر بخواهید مجدد دسترسی نمایش کل اطلاعات رو ازش بگیرید و به صورت Mask شده دیتاها رو ملاحظه کنه میتونید از دستور زیر استفاده کنید.
Revoke UNMASK TO test_user;
برای توضیحات تکمیل تر به این لینک مراجعه کنید.
https://docs.microsoft.com/en-us/sql/relational-databases/security/dynamic-data-masking
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
امیدوارم حالتون خوب باشه
شاید برای شما پیش اومده باشه که بخواهید هنگام نمایش اطلاعات ، اونها رو مخفی کنید . مثلا بخواهید فقط سه رقم شماره موبایل رو نمایش بدید. یا مثلا حرف اول ایمیل رو نمایش بدین ولی اطلاعات به صورت کاملا صحیح و درست در داخل دیتابیس ذخیره شده باشند. از طریق کنترل دسترسی ها شما نمیتونید این تغییرات رو اعمال کنید.
به عنوان مثال فرض کنید شما قصد دارید شماره های تلفن به شکل زیر نمایش داده بشه
0912XXXXXXXXX
ولی داده های شماره ها به صورت کاملا صحیح در دیتابیس ذخیره شده و کاربر نیز دسترسی Select به این ستون رو داره فقط میخواهیم موقع نمایش اطلاعات به این شکل نمایش داده بشه.
راه اولش این هست سمت Client ودر UI این مورد هندل بشه
راه دوم استفاده از Dynamic Data Masking در SQL Server هست که در این مقاله به شما نحوه استفاده از اون رو آموزش خواهم داد.
برای استفاده از این قابلیت باید در جدول و بر روی فیلد مورد نظر این تغییرات رو اعمال کنید.
اگر جدول جدیدی میخواهید بسازید و نیاز به فعال سازی این قابلیت دارید میتونید از ساختار زیر در هنگام ساخت جدول استفاده کنید.
CREATE TABLE HR.EmployeePersonalData
(empid int NOT NULL PRIMARY KEY,
salary int MASKED WITH (FUNCTION = 'default()') NOT NULL,
email_address varchar(255) MASKED WITH (FUNCTION = 'email()') NULL,
voice_mail_pin smallint MASKED WITH (FUNCTION = 'random(0, 9)') NULL,
company_credit_card_number varchar(30) MASKED WITH (FUNCTION = 'partial(0,"XXXX-",4)') NULL,
home_phone_number varchar(30) NULL
);
GO
اگر جدول وجود داره و نیاز دارید این قابلیت رو به یک فیلد اضافه کنید از شکل زیر استفاده کنید.
ALTER TABLE HR.EmployeePersonalData
ALTER COLUMN home_phone_number
ADD MASKED WITH (FUNCTION = 'partial(4,"-XXX",0)');
GO
همچنین اگر این قابلیت بر روی یک فیلد فعال باشه و شما بخواهید یک کاربر به صورت کامل اطلاعات رو ببینه میتونید با استفاده از دستور زیر بهش دسترسی بدین که کل اطلاعات رو بدون اعمال Masking ملاحظه کنه.
Grant UNMASK TO test_user;
و اگر بخواهید مجدد دسترسی نمایش کل اطلاعات رو ازش بگیرید و به صورت Mask شده دیتاها رو ملاحظه کنه میتونید از دستور زیر استفاده کنید.
Revoke UNMASK TO test_user;
برای توضیحات تکمیل تر به این لینک مراجعه کنید.
https://docs.microsoft.com/en-us/sql/relational-databases/security/dynamic-data-masking
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
Docs
Dynamic Data Masking - SQL Server
Learn about dynamic data masking, which limits sensitive data exposure by masking it to non-privileged users. It can greatly simplify security in SQL Server.
👍2
سلام وعرض ادب خدمت دوستان گرامی
امیدوارم حالتون خوب باشه
یک نکته ساده ولی کاربردی رو میخوام خدمتتون عرض کنم.
یکی از دیتابیس های سیستمی داخل SQL Server دیتابیس Model هست.
کاربرد این دیتابیس برای این هست که هر زمان که شما یک دیتابیس جدید ایجاد می کنید ، در واقع یک نمونه از این دیتابیس ایجاد میشه.
فرض کنید شما بر روی سرورتون سیاست هایی رو میخواهید اعمال کنید.
مثلا میخواهید هر دیتابیسی که ایجاد میشه از یک سری سایز مشخصی از دیتا فایل و لاگ فایل استفاده کنه
یا تعداد فایل های دیتا رو مشخص کنید
یا اینکه لاگین های خاصی در هر دیتابیس باشه
یا میخواهید یک سری جدول ،تابع ،SP و ... بر روی هر دیتابیس جدیدی که ساخته میشه ، وجود داشته باشه.
کافیه همه این موارد رو داخل دیتابیس Model تعریف کنید.
پس از اون ، هر دفعه که دیتابیس جدیدی ایجاد کنید تمام مواردی که داخل دیتابیس Model ایجاد کردین ، داخل دیتابیس جدید قرار میگیره.
امیدوارم این نکته به دردتون خورده باشه.
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
امیدوارم حالتون خوب باشه
یک نکته ساده ولی کاربردی رو میخوام خدمتتون عرض کنم.
یکی از دیتابیس های سیستمی داخل SQL Server دیتابیس Model هست.
کاربرد این دیتابیس برای این هست که هر زمان که شما یک دیتابیس جدید ایجاد می کنید ، در واقع یک نمونه از این دیتابیس ایجاد میشه.
فرض کنید شما بر روی سرورتون سیاست هایی رو میخواهید اعمال کنید.
مثلا میخواهید هر دیتابیسی که ایجاد میشه از یک سری سایز مشخصی از دیتا فایل و لاگ فایل استفاده کنه
یا تعداد فایل های دیتا رو مشخص کنید
یا اینکه لاگین های خاصی در هر دیتابیس باشه
یا میخواهید یک سری جدول ،تابع ،SP و ... بر روی هر دیتابیس جدیدی که ساخته میشه ، وجود داشته باشه.
کافیه همه این موارد رو داخل دیتابیس Model تعریف کنید.
پس از اون ، هر دفعه که دیتابیس جدیدی ایجاد کنید تمام مواردی که داخل دیتابیس Model ایجاد کردین ، داخل دیتابیس جدید قرار میگیره.
امیدوارم این نکته به دردتون خورده باشه.
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
سلام و عرض ادب خدمت دوستان عزیز
صبحتون بخیر و شادی
سرویس پک 2 برای SQL Server 2016 در دسترس قرار گرفت
پیشنهاد میکنم حتما بر روی سرورها نصب کنید.
از طریق لینک زیر میتونید دانلود کنید.
https://www.microsoft.com/en-us/download/details.aspx?id=56836
همچنین جزئیات تغییرات رو میتونید در این لینک ملاحظه کنید.
https://support.microsoft.com/en-us/help/4052908/sql-server-2016-service-pack-2-release-information
ارادتمند شما
حمیدرضا صادقیان
صبحتون بخیر و شادی
سرویس پک 2 برای SQL Server 2016 در دسترس قرار گرفت
پیشنهاد میکنم حتما بر روی سرورها نصب کنید.
از طریق لینک زیر میتونید دانلود کنید.
https://www.microsoft.com/en-us/download/details.aspx?id=56836
همچنین جزئیات تغییرات رو میتونید در این لینک ملاحظه کنید.
https://support.microsoft.com/en-us/help/4052908/sql-server-2016-service-pack-2-release-information
ارادتمند شما
حمیدرضا صادقیان
Microsoft Store - Download Center
Download Microsoft® SQL Server® 2016 Service Pack 2 (SP2) from Official Microsoft Download Center
Download Service Pack 2 for Microsoft® SQL Server® 2016
سلام و عرض ادب خدمت دوستان عزیزم
دوستانی که تازه میخواهند SQL Server رو یاد بگیرند و با مفاهیم اولیه آشنا بشن پیشنهاد میکنم این سری فیلمها رو مشاهده کنند.
این فیلمها رایگان بوده و برای سایت Microsoft هست و از کیفیت بالایی نیز برخوردار هست.
https://mva.microsoft.com/en-US/training-courses/sql-database-fundamentals-16944?l=w7qq6nAID_6805121157
دوستانی که تازه میخواهند SQL Server رو یاد بگیرند و با مفاهیم اولیه آشنا بشن پیشنهاد میکنم این سری فیلمها رو مشاهده کنند.
این فیلمها رایگان بوده و برای سایت Microsoft هست و از کیفیت بالایی نیز برخوردار هست.
https://mva.microsoft.com/en-US/training-courses/sql-database-fundamentals-16944?l=w7qq6nAID_6805121157
Docs
Microsoft Learn
The skills required to advance your career and earn your spot at the top do not come easily. Now there’s a more rewarding approach to hands-on learning that helps you achieve your goals faster. Earn points, levels, and achieve more!
دوستانی هم که تمایل دارند در خصوص Query نویسی مطالب ابتدایی رو یاد بگیرند و از پایه مفاهیم رو باهاش کار کنند.
پیشنهاد میکنم حتما این سری فیلمها رو مطالعه کنند که بسیار آموزنده و باکیفیت هست.
https://mva.microsoft.com/en-US/training-courses/querying-with-transactsql-10530?l=TjT07f87_9804984382
ارادتمند شما
حمیدرضا صادقیان
پیشنهاد میکنم حتما این سری فیلمها رو مطالعه کنند که بسیار آموزنده و باکیفیت هست.
https://mva.microsoft.com/en-US/training-courses/querying-with-transactsql-10530?l=TjT07f87_9804984382
ارادتمند شما
حمیدرضا صادقیان
Docs
Microsoft Learn
The skills required to advance your career and earn your spot at the top do not come easily. Now there’s a more rewarding approach to hands-on learning that helps you achieve your goals faster. Earn points, levels, and achieve more!
سلام و عرض ادب خدمت دوستان عزیز
شاید بارها برای شما پیش اومده باشه که بخواهید مثلا یک موردی رو در Administration در SQL Server تست کنید ولی ابزار یا تجهیزاتش رو نداشته باشید
به عنوان مثال مثلا تمایل دارید Replication رو راه اندازی کنید یا AlwaysON رو راه اندازی کنید ولی سیستم به اندازه کافی ندارید و همچنین PC شما نیز قدرت کافی نداره بخواهید مثلا VM بیارید بالا یا اینکه تنظیمات اولیه شبکه برای شما دشوار باشه.
سایت Virtual Lab مایکروسافت این امکانات رو در اختیار شما قرار میده.
تنها چیزی که نیاز دارید فقط یک اکانت ایمیل مایکروسافت هست و بس.!
در حوزه های مختلف خودش Lab هایی رو برای شما آماده سازی کرده و همچنین یک سری Documentation نیز آماده کرده و یک زمانی مشخص کرده.
به اندازه مورد نیاز اون Feature به شما منابع میده و شما به راحتی به سیستم ها لاگین میکنید و طبق اون مستنداتی که بهتون داده مراحل رو طی میکنید و میتونید راه اندازی Feature مورد نظر رو یاد بگیرید.
لینک سایتش رو قرار میدم امیدوارم که مفید واقع بشه.
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
https://www.microsoft.com/handsonlabs/SelfPacedLabs
شاید بارها برای شما پیش اومده باشه که بخواهید مثلا یک موردی رو در Administration در SQL Server تست کنید ولی ابزار یا تجهیزاتش رو نداشته باشید
به عنوان مثال مثلا تمایل دارید Replication رو راه اندازی کنید یا AlwaysON رو راه اندازی کنید ولی سیستم به اندازه کافی ندارید و همچنین PC شما نیز قدرت کافی نداره بخواهید مثلا VM بیارید بالا یا اینکه تنظیمات اولیه شبکه برای شما دشوار باشه.
سایت Virtual Lab مایکروسافت این امکانات رو در اختیار شما قرار میده.
تنها چیزی که نیاز دارید فقط یک اکانت ایمیل مایکروسافت هست و بس.!
در حوزه های مختلف خودش Lab هایی رو برای شما آماده سازی کرده و همچنین یک سری Documentation نیز آماده کرده و یک زمانی مشخص کرده.
به اندازه مورد نیاز اون Feature به شما منابع میده و شما به راحتی به سیستم ها لاگین میکنید و طبق اون مستنداتی که بهتون داده مراحل رو طی میکنید و میتونید راه اندازی Feature مورد نظر رو یاد بگیرید.
لینک سایتش رو قرار میدم امیدوارم که مفید واقع بشه.
ارادتمند شما
حمیدرضا صادقیان
ID: @Hamidreza_Sadeghian
SQL Server Channel : @SQL_Server
https://www.microsoft.com/handsonlabs/SelfPacedLabs