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

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

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

گروه تبادل نظر:
https://t.me/+uIc1qhv58gU0NWQ0
Download Telegram
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
یک مقاله ای امروز داشتم مطالعه میکردم از Itzik Ben-Gan در خصوص رفتار SQL Server برای Log buffer Flush . پیشنهاد میکنم حتما این مقاله رو مطالعه کنید و اگر سوالی داشتید در این خصوص ، من در خدمتتون هستم.

شاد و خوش باشید
ارادتمند

حمیدرضا صادقیان
https://sqlperformance.com/2018/11/sql-performance/understanding-log-buffer-flushes

ID:@Hamidreza_Sadeghian
Channel :@SQL_Server

#DBA #Log_Buffer_Flush #LOGBuffer #صادقيان
سلام و عرض ادب خدمت دوستان عزیزم
لینک گروه تخصصی SQL Server رو قرار میدم .‌سوالی داشتید می تونید در گروه با رعایت قوانین‌گروه مطرح بفرمایید

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

https://t.me/joinchat/BTQQtzy50j_MVbMcUf6PtA
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حال همه شما خوب و خوش باشه .
یکی از موارد مهمی که برای اکثر شرکتهای نرم افزاری پیش میاد ، نحوه بروز رسانی دیتابیس های مشتری ، پیدا کردن تفاوت های بین دیتابیس های مشتری ، نحوه توسعه Database ، و این دست موارد هست.
در این پست میخواهم در خصوص Database Project به شما توضیح بدم.
این ابزار ابتدا توسط مجموعه SSDT Tools توسط مایکروسافت در نسخه 2013 ارائه می شد و از نسخه 2015 به بعد به صورت Builtin درون خود Project های VS قرار داره. وقتی شما در VS از منوی File-new رو انتخاب می کنید یک گزینه ای به نام SQL Server projects داره که داخلش Database Project قرار داره.
حالا چه مزایایی داره؟

1- توسعه دیتابیس بسیار سریع
2- امکان Refactor کردن آبجکت های دیتابیس ، تغییر نام ، و... و اعمال در تمام آبجکتهای وابسته بدون اینکه نگران باشید جایی شاید ممکنه تغییرات شما اعمال نشده باشه.
3- امکان نوشتن Unit Test برای SP,View,Function
4- دارای Intellisense بسیار قدرتمند
5- امکان Compare کردن دیتابیس با دیتابیس محیط Production و بدست آوردن اختلافات بین دو دیتابیس
6- قابلیت اضافه شدن بسیار راحت به TFS
7- امکان Publish کردن دیتابیس و طراحی Automation build
8- امکان Publish بر روی محیط تست و اجرای تست ها بر روی محیط Test و در صورت درست بودن آن ، Publish بر روی محیط عملیاتی
9- اضافه کردن دیتابیس با استفاده از Import دیتابیس فعلی

و ایضا تمام قابلیتهایی که محصولات Red gate در اختیار شما قرار میدن به راحتی با Database Project و در یک مجموعه دراختیار خواهید داشت

نحوه کار با آن بسیار راحت هست و شما دیگه از سردرگمی در خصوص توسعه دیتابیس رهایی پیدا خواهید کرد.
سعی میکنم در پست بعدی یک فیلم از نحوه کار با این ابزار رو برای شما عزیزان فراهم کنم.

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

#DBA #Database_Project #Manage_Database #Database_Compare #Compare #publish #publish_Database #صادقيان #AutomationDeploy #DevOps
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حال همگی خوب باشه
یکی از مسائلی که اکثرا باهاش در کدنویسی ها درگیر هستیم بحث کنارهم قراردادن رشته هاست.
مثلا فرض کنید میخواهیم ستون نام یک جدول رو کنار هم قرارداده و با , اینهارو از هم جدا کنیم ورشته ای مثل رشته زیر رو تولید کنیم.

علی,حمید,محمد,داریوش,....

یکی از روشهای اینکار استفاده از For Xml path بود که باید رشته رو تولید کرده و توسط دستورات stuff رشته درست بشه و اضافاتش حذف بشه.
در نسخه 2017 تابعی به نام String_Agg() اضافه شده که همین کار رو برای شما انجام میده.
این تابع دوتا ورودی میگیره که رشته و نوع جداکننده هست
و همچنین میتونید تعیین کنید رشته مورد نظر براساس چه فیلدی مرتب بشه.

به این مثال توجه کنید.:
SELECT town,
STRING_AGG (email, ';') WITHIN GROUP (ORDER BY email ASC) AS emails
FROM dbo.Employee
GROUP BY town;
نتیجه کوئری :
town emails
Seattle catherine0@adw.com;kim2@adw.com;syed0@adw.com
LA hazem0@adw.com;sam1@adw.com

در این مثال لیست ایمیلها به واسطه ; از هم جداشدند و براساس Town نیز دسته بندی شدند و خود ایمیلها نیز به صورت الفبا مرتب شدند.

امیدوارم این نکته براتون مفید واقع شده باشه.

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

ID:@Hamidreza_Sadeghian
Channel :@SQL_Server

#TSQL #For_XML_PAth #String_agg #Concatenates_String
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
یکی از مواردی که در بررسی کدهای سازمانها و شرکتهای مختلف دیدم وجود داره استفاده از Scalar function ها هست. امروز میخوام نکته ای رو بگم که بهتون کمک میکنه پرفورمنس این نوع توابع نیز افزایش پیدا کنه.
اگر در تعریف این تابع دقت کرده باشین این کلید ها وجود داره
<function_option>::=
{
[ ENCRYPTION ]
| [ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
| [ EXECUTE_AS_Clause ]
}
یکی از این گزینه ها Returns null on null input هست . اگر د راستفاده از این تابع در جدول مورد نظر مقادیر Null وجود داره که میتونه Null برگردونه ، با اضافه کردن این گزینه به هدر تابع ، اسکیوال سرور مقادیر Null رو صرفنظر کرده و فقط مقادیر اصلی رو به این تابع ارسال ، و خروجی واحد دریافت خواهد کرد.
مثلا فرض کنید در یک جدولی تابعی نوشتید که میدونید اگر مقدار Null به پارامتر تابع ارسال بشه حتما خروجی Null خواهد بود و این جدول فرضا 40000 ردیف دارد. که 20000 ردیف آن Null و مابقی مقدار دارد.
اگر از این دستور استفاده نکنید و از تابعی که نوشتید در بدنه Select استفاده کنید ، این تابع به ازای هر 40000 ردیف موجود در جدول اجرا خواهد شد. ولی اگر از این دستور استفاده کنید تابع شما فقط 20000 مرتبه اجرا خواهد شد و برای مقادیر Null اجرا نمی شود.
این سبب خواهد شد سرعت پردازش و اجرای کدهای Scalar شما در صورتی که دارای شرط فوق باشه ، افزایش پیدا کنه.
در ضمن اینکه این گزینه از نسخه 2008 به بعد وجود داره.
برای تست این موضوع ، بر روی دیتابیس Adventureworks 2017 نیز میتونید با توابع زیر این رو تست کنید.
USE [AdventureWorks2017];
GO

CREATE FUNCTION [dbo].[ufnLeadingZeros_new](
@Value int
)
RETURNS varchar(8)
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS
BEGIN
DECLARE @ReturnValue varchar(8);
SET @ReturnValue = CONVERT(varchar(8), @Value);
SET @ReturnValue = REPLICATE('0', 8 - DATALENGTH(@ReturnValue)) + @ReturnValue;
RETURN (@ReturnValue);
END;
GO

و سپس این کدهارو اجرا کنید.
SELECT SalesOrderID, dbo.ufnLeadingZeros(CurrencyRateID)
FROM Sales.SalesOrderHeader;
GO
SELECT SalesOrderID, dbo.ufnLeadingZeros_new(CurrencyRateID)
FROM Sales.SalesOrderHeader;
GO

برای مانیتور کردنش هم Event های زیر رو تعریف کنید.
CREATE EVENT SESSION [Session72] ON SERVER
ADD EVENT sqlserver.module_end(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_batch_completed(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_batch_starting(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_statement_completed(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_statement_starting(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125))))
WITH (TRACK_CAUSALITY=ON)
GO

فقط نکته اینکه مقدار 125 برای Session تستی من هست که فیلتر کنم که دقیقا همین کدهارو نمایش بده. شما اینرو براساس Session خودتون فیلتر کنید.

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

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

#TSQL #Scalar_Funcion #UDF #Performance
سلام و عرض ادب خدمت دوستان گرامی
امیدوارم حالتون خوب باشه
اگر در جایی مشغول به فعالیت هستید که AlwaysON راه اندازی شده باشه ، ممکنه این سناریو براتون رخ بده
فرض کنید دوتا سرور دارید که بر روی اون AlwaysON راه اندازی کردین و این ها به صورت Synchronous هستند .
حالا سرور دوم از کار افتاده و عملا سبب شده فایل لاگ شما داره به شدت رشد میکنه.
اگر در این حالت دستور زیر رو اجرا کنید.
select name,log_reuse_wait_desc from sys.databases
ملاحظه خواهید کرد که در Wait ها نوشته Availability_group . در این حالت اگر شما بیاین دیتابیس رو از Availability_Group خارج کنید مشکلی که پیش میاد بهتون خطا میده که Chain در فایل LOG با MDF همخوانی نداره و به نظر میاد دیتابیس شما به مشکل خورده و نه میشه ازش Backup تهیه کرد نه دستورات DBCC اجرا میشه و اگر دیتابیس رو Detach کنید با مشکلات عدیده ای مواجه خواهید شد.
راه حل اول : اینکه ارتباط سرور دوم رو برقرار کنید تا لاگها ارسال شده و این مشکل حل بشه
راه حل دوم : تغییر مد Replica از Synchronous به Asynchronous که سبب میشه این Wait به Log_Backup تبدیل بشه که به راحتی با یک Log Backup مشکل فضای شما حل میشه و مساله ای نخواهید داشت.
اگر اشتباها اومدین دیتابیس رو از Availability group حذف کردین راهش این هست که با استفاده از کد زیر:
use Master
Go
ALTER AVAILABILITY GROUP MyAG ADD DATABASE YourDB;
GO
دیتابیس رو سوری به AlwaysON اضافه کنید و مراحل بالا رو طی کنید.

امیدوارم این نکته مفید واقع شده باشه.
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server

#Log_FIle #LDF #LOG_Growth #AlwaysON #Availability_GROUP #Log_Backup
شرکت پخش رازی جهت تکمیل کادر فنی خود نیاز به افراد زیر به صورت تمام وقت دارد:

برنامه نویس 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
دوره بسیار عالی با افرادی بسیار دقیق و باهوش در شرکت موتورسازان تراکتور سازی تبریز

#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