سلام و عرض ادب خدمت دوستان عزیز
امیدوارم حالتون خوب باشه
در اکثر جاهایی که مشاوره دادم ، بارها مشاهده کردم که نیاز بوده یک رشته ای که با , از هم جدا شده نیاز بوده به صورت جدول تبدیل بشه و برای این امر شروع به نوشتن توابعی کردن که معمولا بهینه نبوده.
از نسخه ۲۰۱۶ به بعد تابعی به اسم String_split به زبان قدرتمند T-SQL اضافه شده که اینکارو برای شما می کنه.
برای استفاده ا زاین تابع حتما باید Compatibility level برابر ۱۳۰ یا بزرگتر باشه.
نمونه استفاده این تابع هم در کد زیر ملاحظه می کنید.
DECLARE @orderids AS VARCHAR(MAX) = N'10248,10542,10731,10765,10812';
SELECT value
FROM STRING_SPLIT(@orderids, ',');
به دلیل این که یک Result Set برگردانده میشه میتونید درر Join ها و Apply و ... نیز استفاده کنید.
ارادتمند شما
حمیدرضا صادقیان
ID : @Hamidreza_Sadeghian
Channel : @SQL_Server
#T-SQL_Hints
#String_Split
امیدوارم حالتون خوب باشه
در اکثر جاهایی که مشاوره دادم ، بارها مشاهده کردم که نیاز بوده یک رشته ای که با , از هم جدا شده نیاز بوده به صورت جدول تبدیل بشه و برای این امر شروع به نوشتن توابعی کردن که معمولا بهینه نبوده.
از نسخه ۲۰۱۶ به بعد تابعی به اسم String_split به زبان قدرتمند T-SQL اضافه شده که اینکارو برای شما می کنه.
برای استفاده ا زاین تابع حتما باید Compatibility level برابر ۱۳۰ یا بزرگتر باشه.
نمونه استفاده این تابع هم در کد زیر ملاحظه می کنید.
DECLARE @orderids AS VARCHAR(MAX) = N'10248,10542,10731,10765,10812';
SELECT value
FROM STRING_SPLIT(@orderids, ',');
به دلیل این که یک Result Set برگردانده میشه میتونید درر Join ها و Apply و ... نیز استفاده کنید.
ارادتمند شما
حمیدرضا صادقیان
ID : @Hamidreza_Sadeghian
Channel : @SQL_Server
#T-SQL_Hints
#String_Split
سلام و عرض ادب خدمت دوستان عزیز
امیدوارم حالتون خوش باشه
یک اتفاق جالب افتاد خواستم باهاتون به اشتراک بذارم تا به وضعیت مدیریت دیتابیس های دانشگاهها پی ببرید.
برای یکی از دوستان داشتم برای دانشگاه الکترونیکی آزاد ثبت نام انجام می دادم ، به محض اینکه خواستم به قسمت ثبت نام وارد بشم بهم پیغام داد که Transaction Log پر شده و شما نمی تونید کاری بکنید.😁😁😁
دانشگاهی که داعیه تحصیل مجازی رو داره و باید حداقل در خدمات مجازی ساختار مناسبی رو داشته باشه ، با این وضعیت روبرو شده.
احتمالا الان به مسئول شبکه یا کسی که اونجا یک ذره بلده با ویندوز کار کننه 😂😂 می گن که برو توی SSMS و دیتابیس رو ببر توی حالت Simple و بعد هم Shrink کن. اون بنده خدا هم میبینه که مشکل حل شده احتمالا کلی کیف می کنه که مشکل سایت دانشگاه آزاد رو حل کرده.
خیلی عجیبه که حتی یک جاب ساده برای تهیه Log Backup نذاشتن که این اتفاق خیلی پیش پا افتاده رخ نده. یعنی حتی احتمال این هم ندادن که موقع ثبت نام ها احتمالا تعداد تراکنش ها زیاد میشه و با مشکل مواجه خواهند شد.
تصویر این خطا رو در پست بعد براتون ارسال می کنم
شاد باشید
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
امیدوارم حالتون خوش باشه
یک اتفاق جالب افتاد خواستم باهاتون به اشتراک بذارم تا به وضعیت مدیریت دیتابیس های دانشگاهها پی ببرید.
برای یکی از دوستان داشتم برای دانشگاه الکترونیکی آزاد ثبت نام انجام می دادم ، به محض اینکه خواستم به قسمت ثبت نام وارد بشم بهم پیغام داد که Transaction Log پر شده و شما نمی تونید کاری بکنید.😁😁😁
دانشگاهی که داعیه تحصیل مجازی رو داره و باید حداقل در خدمات مجازی ساختار مناسبی رو داشته باشه ، با این وضعیت روبرو شده.
احتمالا الان به مسئول شبکه یا کسی که اونجا یک ذره بلده با ویندوز کار کننه 😂😂 می گن که برو توی SSMS و دیتابیس رو ببر توی حالت Simple و بعد هم Shrink کن. اون بنده خدا هم میبینه که مشکل حل شده احتمالا کلی کیف می کنه که مشکل سایت دانشگاه آزاد رو حل کرده.
خیلی عجیبه که حتی یک جاب ساده برای تهیه Log Backup نذاشتن که این اتفاق خیلی پیش پا افتاده رخ نده. یعنی حتی احتمال این هم ندادن که موقع ثبت نام ها احتمالا تعداد تراکنش ها زیاد میشه و با مشکل مواجه خواهند شد.
تصویر این خطا رو در پست بعد براتون ارسال می کنم
شاد باشید
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
سلام و عرض ادب خدمت دوستان گرامی
شب بر همگان خوش باشه
یکی از مواردی که در اکثر مشاوره ها در شرکتها باهاش برخورد کردم نحوه نوشتن کدها در زبان شیرین T-SQL بوده .
دوستانی که دارن کد T-SQL می نویسند باید به این نکته توجه کنند که زبان T-SQL یک زبان توصیفی یا Declarative هست.
زبانهای برنامه نویسی مثل C# یا Delphi اینها Procedural هستند.
شما نباید با همون منطقی که در زبانی مثل سی شارپ تفکر می کنید و کد می نویسید ،در زبان T-SQL هم کد بنویسید.
بارها دیدم که مشکلات خیلی راحت حل می شدن ولی چون تفکر Procedural بوده یا حلقه while در کدها تعریف شده یا از جداول Temp به شدت استفاده شده یا Cursor تعریف شده که گاها با یک Select یا update یا Insert به راحتی حل شده و Performance اون چند ده برابر نیز شده است.
زبان T-SQL از زبان SQL مشتق شده که یک زبان با استاندارد Ansi هست. این زبان از Relational Model اقتباس شده که خود Relational Model از ترکیب Set Theory و Predicate Logic ایجاد شده است.
پس وقتی که شما دارید کدنویسی می کنید باید به صورت Set Based به داده ها نگاه کنید نه یک رکورد از یک جدول.
شما نباید هیچ وقت هیچ وقت هیچ وقت در کد نویسی T-SQL برای SQL Server الگوریتم مشخص کنید. وقتی که در خیلی از موارد ترکیبی از Cursor, While ,Temp Table ها مشاهده میشه ، کاملا مشخص هست که برنامه نویس داره الگوریتم فراخوانی اطلاعات هم به SQL Server تحمیل میکنه که کاری کاملا اشتباهه.
شما در SQL Server باید به این طریق کد بنویسید که نیازتون رو بیان کنید. همین
اینکه چطوری این داده ها فراخوانی می شوند رو به Engine SQL Server بسپارید . بهتون قول میدم به بهترین نحو و با بهترین الگوریتم ها ،اطلاعات موردنظر شمارو فراخوانی خواهد کرد و به شما نشان خواهد داد.
اگر در این خصوص سوالی داشتید در خدمتتون هستم.
ارادتمند.
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#Set_Based_Thinking #T_SQL #SQL_Server #SQLServer #Hamidreza_Sadeghian #Declarative #SQL
شب بر همگان خوش باشه
یکی از مواردی که در اکثر مشاوره ها در شرکتها باهاش برخورد کردم نحوه نوشتن کدها در زبان شیرین T-SQL بوده .
دوستانی که دارن کد T-SQL می نویسند باید به این نکته توجه کنند که زبان T-SQL یک زبان توصیفی یا Declarative هست.
زبانهای برنامه نویسی مثل C# یا Delphi اینها Procedural هستند.
شما نباید با همون منطقی که در زبانی مثل سی شارپ تفکر می کنید و کد می نویسید ،در زبان T-SQL هم کد بنویسید.
بارها دیدم که مشکلات خیلی راحت حل می شدن ولی چون تفکر Procedural بوده یا حلقه while در کدها تعریف شده یا از جداول Temp به شدت استفاده شده یا Cursor تعریف شده که گاها با یک Select یا update یا Insert به راحتی حل شده و Performance اون چند ده برابر نیز شده است.
زبان T-SQL از زبان SQL مشتق شده که یک زبان با استاندارد Ansi هست. این زبان از Relational Model اقتباس شده که خود Relational Model از ترکیب Set Theory و Predicate Logic ایجاد شده است.
پس وقتی که شما دارید کدنویسی می کنید باید به صورت Set Based به داده ها نگاه کنید نه یک رکورد از یک جدول.
شما نباید هیچ وقت هیچ وقت هیچ وقت در کد نویسی T-SQL برای SQL Server الگوریتم مشخص کنید. وقتی که در خیلی از موارد ترکیبی از Cursor, While ,Temp Table ها مشاهده میشه ، کاملا مشخص هست که برنامه نویس داره الگوریتم فراخوانی اطلاعات هم به SQL Server تحمیل میکنه که کاری کاملا اشتباهه.
شما در SQL Server باید به این طریق کد بنویسید که نیازتون رو بیان کنید. همین
اینکه چطوری این داده ها فراخوانی می شوند رو به Engine SQL Server بسپارید . بهتون قول میدم به بهترین نحو و با بهترین الگوریتم ها ،اطلاعات موردنظر شمارو فراخوانی خواهد کرد و به شما نشان خواهد داد.
اگر در این خصوص سوالی داشتید در خدمتتون هستم.
ارادتمند.
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#Set_Based_Thinking #T_SQL #SQL_Server #SQLServer #Hamidreza_Sadeghian #Declarative #SQL
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
بحثی رو چند روز اخیر شروع کردم د رخصوص Set Based نوشتن و سبب سوالات بسیار زیادی در خصوصی من شد که ابهام ایجاد شده بود که چطور خود SQL Server متوجه میشه راه درست چیه.؟
تصمیم گرفتم یک ذره ساده تر مساله رو توضیح بدم و با مثالهای متعدد این بحث رو جا بندازم.
خوب بذارید از یک مثال فارسی شروع کنیم.
ما میخواهیم ده تا کتاب رو از کتابخونه از سری کتابهای علمی بگیریم که رنگ جلد آنها زرده.
این رو میشه به دو صورت بیان کرد. من در دو حالت Set Based و Cursor Based بیانش میکنم تفاوت هاش رو ببینید و خودتون زمانش رو حدس بزنید.
قسمت Set Based :
در کتابخونه به قفسه کتابهای علمی برو(From ) و از فهرست اونجا نگاه کن کتابهایی که جلد زرد رنگ دارند(Where) ده عدد(Top) جداکن بردار.
قسمت Cursor Based :
با استفاده از تاکسی ها به کتابخونه برو. حتما سوار تاکسی های زرد بشو و از تاکسی های عبوری و اتوبوس استفاده نکن.
در کتابخونه از راهروی سمت راست برو به انتهای راهرو رسیدی بپیچ به سمت چپ و از پله ها بیا پایین به انتهای راهرو برو در اونجا قفسه کتابهای علمی رو مشاهده می کنی.
حالا از پایین قفسه تک تک کتابهارو بردار رنگشون رو بررسی کن اگر رنگ اونها زرده برش دار و بذار داخل سبد اگر رنگش زرد نبود کتاب رو بذار سرجاش برو سراغ کتاب بعدی. اینکار رو تکرار کن تا ده عدد کتاب با جلد زرد رنگ رو جمع آوری کنی.
خوب اختلاف رو دیدین؟
شما به SQL Server میگید چه چیزی نیاز دارید و از کجا و چه مشخصاتی داشته باشه. اینکه چطوری اون دیتاها فراهم بشه SQL Server به واسطه Statistics ها ، به واسطه ایندکس ها و موارد دیگه بهترین الگوریتم و سریعترین الگوریتم رو برای رسیدن به دیتای شما فراهم می کنه
ولی وقتی شما میاین مطابق روش دوم براش راه حل در نظر میگیرید سبب میشه دیگه از الگوریتم های خودش پیروی نکنه و هرچی شما دیکته کردین انجام بده پس مستلزم انجام مراحل خیلی بیشتر و مسلما زمان بیشتر و درگیری منابع بیشتر هست.
وقتی من در روش اول بیان نکردم چطور برو کتابخونه ، شاید اون فرد با BRT خیلی سریعتر برسه یا با مترو. ولی در روش دوم من اجبارش کردم حتما باید با تاکسی زرد بره. که میتونه ترافیک باشه و خیلی شلوغ باشه.
در پستهای بعدی مثالهای عملی تری رو ارائه می کنم
لطفا سوالات و نظراتتون رو بامن درمیان بذارید تا بتونم کیفیت مطالبی که مینویسم رو ارتقا بدم.
ارادتمندشما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#Set_Based_Thinking #T_SQL #SQL_Server #SQLServer #Hamidreza_Sadeghian #Declarative #SQL_Server
#قسمت_دوم
امیدوارم حالتون خوب باشه
بحثی رو چند روز اخیر شروع کردم د رخصوص Set Based نوشتن و سبب سوالات بسیار زیادی در خصوصی من شد که ابهام ایجاد شده بود که چطور خود SQL Server متوجه میشه راه درست چیه.؟
تصمیم گرفتم یک ذره ساده تر مساله رو توضیح بدم و با مثالهای متعدد این بحث رو جا بندازم.
خوب بذارید از یک مثال فارسی شروع کنیم.
ما میخواهیم ده تا کتاب رو از کتابخونه از سری کتابهای علمی بگیریم که رنگ جلد آنها زرده.
این رو میشه به دو صورت بیان کرد. من در دو حالت Set Based و Cursor Based بیانش میکنم تفاوت هاش رو ببینید و خودتون زمانش رو حدس بزنید.
قسمت Set Based :
در کتابخونه به قفسه کتابهای علمی برو(From ) و از فهرست اونجا نگاه کن کتابهایی که جلد زرد رنگ دارند(Where) ده عدد(Top) جداکن بردار.
قسمت Cursor Based :
با استفاده از تاکسی ها به کتابخونه برو. حتما سوار تاکسی های زرد بشو و از تاکسی های عبوری و اتوبوس استفاده نکن.
در کتابخونه از راهروی سمت راست برو به انتهای راهرو رسیدی بپیچ به سمت چپ و از پله ها بیا پایین به انتهای راهرو برو در اونجا قفسه کتابهای علمی رو مشاهده می کنی.
حالا از پایین قفسه تک تک کتابهارو بردار رنگشون رو بررسی کن اگر رنگ اونها زرده برش دار و بذار داخل سبد اگر رنگش زرد نبود کتاب رو بذار سرجاش برو سراغ کتاب بعدی. اینکار رو تکرار کن تا ده عدد کتاب با جلد زرد رنگ رو جمع آوری کنی.
خوب اختلاف رو دیدین؟
شما به SQL Server میگید چه چیزی نیاز دارید و از کجا و چه مشخصاتی داشته باشه. اینکه چطوری اون دیتاها فراهم بشه SQL Server به واسطه Statistics ها ، به واسطه ایندکس ها و موارد دیگه بهترین الگوریتم و سریعترین الگوریتم رو برای رسیدن به دیتای شما فراهم می کنه
ولی وقتی شما میاین مطابق روش دوم براش راه حل در نظر میگیرید سبب میشه دیگه از الگوریتم های خودش پیروی نکنه و هرچی شما دیکته کردین انجام بده پس مستلزم انجام مراحل خیلی بیشتر و مسلما زمان بیشتر و درگیری منابع بیشتر هست.
وقتی من در روش اول بیان نکردم چطور برو کتابخونه ، شاید اون فرد با BRT خیلی سریعتر برسه یا با مترو. ولی در روش دوم من اجبارش کردم حتما باید با تاکسی زرد بره. که میتونه ترافیک باشه و خیلی شلوغ باشه.
در پستهای بعدی مثالهای عملی تری رو ارائه می کنم
لطفا سوالات و نظراتتون رو بامن درمیان بذارید تا بتونم کیفیت مطالبی که مینویسم رو ارتقا بدم.
ارادتمندشما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#Set_Based_Thinking #T_SQL #SQL_Server #SQLServer #Hamidreza_Sadeghian #Declarative #SQL_Server
#قسمت_دوم
سلام و عرض ادب خدمت دوستان عزیز
امیدوارم حالتون خوب باشه
یک سری سوال در مورد T-SQL آماده کردم و تمایل دارم سطح دانش افراد کانال رو بسنجم که بتونم با دقت بیشتری مطالبی رو بنویسم و آموزشهایی رو تدوین کنم.
لذا خواهشی که از شما عزیزان دارم این هست که بدون اینکه در اینترنت سرچ کنید از دانش خودتون استفاده کنید و این سوالات رو پاسخ بدین و در یک فایل ورد برای من در خصوصی ارسال کنید. جواب سوالات رو نیز چند روز آتی قرار خواهم داد.
فقط جواب شما عزیزان به این سوالات برای من اهمیت داره که بتونم یک ارزیابی صحیحی داشته باشم.
پیشاپیش تشکر میکنم از همه عزیزانی که این سوالات رو بررسی می کنندو فرصتی رو قرار میدن و به این سوالات پاسخ میدن.
نکته : دوستان عزیزم توجه کنید که هدف من این هست که دقیقا بدونم در چه حوزه هایی بیشتر ضعف هست که بتونم روی اون موارد تمرکز بیشتری بکنم.
لذا پاسخ های شما بسیار برای من مهمه .
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
امیدوارم حالتون خوب باشه
یک سری سوال در مورد T-SQL آماده کردم و تمایل دارم سطح دانش افراد کانال رو بسنجم که بتونم با دقت بیشتری مطالبی رو بنویسم و آموزشهایی رو تدوین کنم.
لذا خواهشی که از شما عزیزان دارم این هست که بدون اینکه در اینترنت سرچ کنید از دانش خودتون استفاده کنید و این سوالات رو پاسخ بدین و در یک فایل ورد برای من در خصوصی ارسال کنید. جواب سوالات رو نیز چند روز آتی قرار خواهم داد.
فقط جواب شما عزیزان به این سوالات برای من اهمیت داره که بتونم یک ارزیابی صحیحی داشته باشم.
پیشاپیش تشکر میکنم از همه عزیزانی که این سوالات رو بررسی می کنندو فرصتی رو قرار میدن و به این سوالات پاسخ میدن.
نکته : دوستان عزیزم توجه کنید که هدف من این هست که دقیقا بدونم در چه حوزه هایی بیشتر ضعف هست که بتونم روی اون موارد تمرکز بیشتری بکنم.
لذا پاسخ های شما بسیار برای من مهمه .
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
سلام و عرض ادب خدمت دوستان عزیز
امیدوارم حالتون خوب باشه
تا به امروز فقط 4 نفر از عزیزان زحمت کشیدن پاسخ سوالات رو دادن.
من روز جمعه جوابهارو ارسال خواهم کرد. لذا خواهشمندم محبت کنید یک ساعت وقت بذارید و اگر مقدوره به این سوالات پاسخ بدین.
در سوالات نکات مهمی نهفته هست که پس از مشاهده پاسخ ها احتمالا مطالب جدیدی را فراخواهید گرفت
بی صبرانه منتظر لطف شما عزیزان هستم
ارادتمند
حمیدرضا صادقیان
امیدوارم حالتون خوب باشه
تا به امروز فقط 4 نفر از عزیزان زحمت کشیدن پاسخ سوالات رو دادن.
من روز جمعه جوابهارو ارسال خواهم کرد. لذا خواهشمندم محبت کنید یک ساعت وقت بذارید و اگر مقدوره به این سوالات پاسخ بدین.
در سوالات نکات مهمی نهفته هست که پس از مشاهده پاسخ ها احتمالا مطالب جدیدی را فراخواهید گرفت
بی صبرانه منتظر لطف شما عزیزان هستم
ارادتمند
حمیدرضا صادقیان
سلام و عرض ادب خدمت دوستان عزیز
تعطیلات خوبی رو تا به این لحظه براتون آرزومندم
چند تن از عزیزان از من خواستند که زمان ارسال جواب رو مقداری به تاخیر بندازم.
من برای یکشنبه شب جوابها رو ارسال خواهم کرد و پارت بعدی سوالات که در خصوص DBA و مدیریت دیتابیس ها هست براتون ارسال می کنم.
تا به این لحظه اگر بخواهم جوابها رو یک آنالیز کلی بکنم باید عرض کنم که در خصوص مفاهیم اصلی SQL Server متاسفانه دانش کمی وجود داره.
و تقریبا در اکثر پاسخ ها مشاهده کردم که دوستان از امکانات جدید SQL Server اصلا اطلاعی ندارند و خیلی از مشکلات و مسائل رو با روشهای بسیار قدیمی سعی می کنند حل کنند.
خیلی از الگوریتهایی که برای حل مسائل پیشنهاد شده مبتدی و یک جورایی میشد گفت پیچیده بودند.
که در پاسخ سوالات این مباحث رو مطرح می کنم و توضیح میدم.
و سعی میکنم پیرامون این مسائل سلسله مفاهیمی رو توضیح بدم خدمتتون .
در این بین اگر در خصوص مسائل مطرح شده ، توضیحات ارائه شده ، مثالهای زده شده ، نظری پیشنهادی انتقادی هر چیزی هست بیان کنید.
اگر نوع نگارش متون سخته یا مثالها پیچیده هستند یا خیلی ساده هستند، یا هر اشکالی که احساس می کنید ممکنه درک مطالب رو دشوار کنه ، ممنون میشم بیان کنید که بتونم اصلاحشون کنم که از بهترین شیوه آموزشی بهره ببریم.
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
تعطیلات خوبی رو تا به این لحظه براتون آرزومندم
چند تن از عزیزان از من خواستند که زمان ارسال جواب رو مقداری به تاخیر بندازم.
من برای یکشنبه شب جوابها رو ارسال خواهم کرد و پارت بعدی سوالات که در خصوص DBA و مدیریت دیتابیس ها هست براتون ارسال می کنم.
تا به این لحظه اگر بخواهم جوابها رو یک آنالیز کلی بکنم باید عرض کنم که در خصوص مفاهیم اصلی SQL Server متاسفانه دانش کمی وجود داره.
و تقریبا در اکثر پاسخ ها مشاهده کردم که دوستان از امکانات جدید SQL Server اصلا اطلاعی ندارند و خیلی از مشکلات و مسائل رو با روشهای بسیار قدیمی سعی می کنند حل کنند.
خیلی از الگوریتهایی که برای حل مسائل پیشنهاد شده مبتدی و یک جورایی میشد گفت پیچیده بودند.
که در پاسخ سوالات این مباحث رو مطرح می کنم و توضیح میدم.
و سعی میکنم پیرامون این مسائل سلسله مفاهیمی رو توضیح بدم خدمتتون .
در این بین اگر در خصوص مسائل مطرح شده ، توضیحات ارائه شده ، مثالهای زده شده ، نظری پیشنهادی انتقادی هر چیزی هست بیان کنید.
اگر نوع نگارش متون سخته یا مثالها پیچیده هستند یا خیلی ساده هستند، یا هر اشکالی که احساس می کنید ممکنه درک مطالب رو دشوار کنه ، ممنون میشم بیان کنید که بتونم اصلاحشون کنم که از بهترین شیوه آموزشی بهره ببریم.
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
سلام وعرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
در پست بعد جواب سوالات مربوط به پرسشها را قرار میدم.
ممنون از همه عزیزانی که محبت کردن و وقت گذاشتن و به این پرسشها پاسخ دادن.
ممنونم از اینکه با نظرات ارزشمندتون کمک می کنید کیفیت مطالب افزایش پیدا کنه
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#Set_Based_Thinking #T_SQL #SQL_Server #SQLServer #Hamidreza_Sadeghian #Declarative #SQL_Server #Quiz #Quiz_Answer
امیدوارم حالتون خوب باشه
در پست بعد جواب سوالات مربوط به پرسشها را قرار میدم.
ممنون از همه عزیزانی که محبت کردن و وقت گذاشتن و به این پرسشها پاسخ دادن.
ممنونم از اینکه با نظرات ارزشمندتون کمک می کنید کیفیت مطالب افزایش پیدا کنه
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#Set_Based_Thinking #T_SQL #SQL_Server #SQLServer #Hamidreza_Sadeghian #Declarative #SQL_Server #Quiz #Quiz_Answer
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حال همه شما خوب و خوش باشه و براتون سلامتی و شادی آرزومندم
همونطور که میدونید در دو پست قبلی در خصوص Set Based Thinking صحبت کردم و مثال هایی رو عرض کردم.
امروز قصد دارم مقداری وارد مسائل حقیقی بشیم که باهاش سرو کار داریم.
خوب من مساله ای رو مطرح می کنم خوشحال میشم راه حل هاتون رو در خصوصی برای من ارسال کنید.
پیشاپیش از همه عزیزانی که در این سوال و جوابها شرکت می کنند تشکر میکنم چون باعث میشه انگیزه بیشتری پیدا کنم و زمان بیشتری رو صرف کنم که این مسائل جا بیافته.
متاسفانه در دانشگاهها و موسسات آموزشی اصلا به این موارد نمی پردازند. بعضی از اساتید دانشگاهها متاسفانه اصلا از دانش خوبی در این حوزه برخوردار نیستند و اگر همین مسائل رو بپرسید به سختی میتونند بهتون پاسخ بدن. همین مسائلی که من اینجا مطرح میکنم از اساتیدی که میشناسید بپرسید و پاسخهای آنها رو با جوابهایی که اینجا ارسال میشه مقایسه کنید تا خودتون به عمق فاجعه پی ببرید.
خوب برگردیم سر سوال.
یکی از مسائلی که در نرم افزارها با آن مواجه هستیم بحث پیدا کردن شماره های خالی یا Gap بین شماره اسناد یا شماره نامه ها هست
فرض کنید داده های زیر رو دارید.
Id
1
2
3
5
6
8
10
15
21
30
45
46
47
48
49
50
55
56
57
58
60
61
62
66
ما میخواهیم شماره اسنادی رو بدست بیاریم که داخل این لیست نیستند.
که جواب باید به شرح زیر باشه
4,7,9,11..14,16..20,22..29,31..44,51..54,59,63,64,65
جوابها رو تا روز یکشنبه آخروقت برای من ارسال کنید
من راه حل های مختلف رو روز دوشنبه قرار میدم و کامل دراین زمینه شرح میدم.
لطفا از اینترنت کدی برای من کپی نکنید ارسال کنید.خیلی ارزشمند نیست. میخوام خودتون بشینید به سوال فکر کنید و با دانش خودتون و مطالبی که در پرسش و پاسخ ها و پستهای قبل عرض کردم راه حل برای من بنویسید. وگرنه الان دنبال مساله Gap در اینترنت بگردید راه حلهای زیادی رو پیدا می کنید.
منتظر پاسخهای شما عزیزان هستم.
(خوشحال میشم اتفاقا از اساتید دانشگاهی که میشناسید بپرسید و راه حل های این عزیزان هم بیارید باهم بررسی کنیم☺️)
اسکریپت ساخت جدول :
Create Table #Test (Id int)
Go
Insert into #Test
Values(1),(2),(3),(5),(6),(8),(10),(15),(21),(30),(45),(46),(47),(48),(49),(50),
(55),(56),(57),(58),(60),(61),(62),(66)
Go
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#Set_Based_Thinking #T_SQL #SQL_Server #SQLServer #Hamidreza_Sadeghian #Declarative #SQL_Server #Learn_SQL_Server
#قسمت_سوم
امیدوارم حال همه شما خوب و خوش باشه و براتون سلامتی و شادی آرزومندم
همونطور که میدونید در دو پست قبلی در خصوص Set Based Thinking صحبت کردم و مثال هایی رو عرض کردم.
امروز قصد دارم مقداری وارد مسائل حقیقی بشیم که باهاش سرو کار داریم.
خوب من مساله ای رو مطرح می کنم خوشحال میشم راه حل هاتون رو در خصوصی برای من ارسال کنید.
پیشاپیش از همه عزیزانی که در این سوال و جوابها شرکت می کنند تشکر میکنم چون باعث میشه انگیزه بیشتری پیدا کنم و زمان بیشتری رو صرف کنم که این مسائل جا بیافته.
متاسفانه در دانشگاهها و موسسات آموزشی اصلا به این موارد نمی پردازند. بعضی از اساتید دانشگاهها متاسفانه اصلا از دانش خوبی در این حوزه برخوردار نیستند و اگر همین مسائل رو بپرسید به سختی میتونند بهتون پاسخ بدن. همین مسائلی که من اینجا مطرح میکنم از اساتیدی که میشناسید بپرسید و پاسخهای آنها رو با جوابهایی که اینجا ارسال میشه مقایسه کنید تا خودتون به عمق فاجعه پی ببرید.
خوب برگردیم سر سوال.
یکی از مسائلی که در نرم افزارها با آن مواجه هستیم بحث پیدا کردن شماره های خالی یا Gap بین شماره اسناد یا شماره نامه ها هست
فرض کنید داده های زیر رو دارید.
Id
1
2
3
5
6
8
10
15
21
30
45
46
47
48
49
50
55
56
57
58
60
61
62
66
ما میخواهیم شماره اسنادی رو بدست بیاریم که داخل این لیست نیستند.
که جواب باید به شرح زیر باشه
4,7,9,11..14,16..20,22..29,31..44,51..54,59,63,64,65
جوابها رو تا روز یکشنبه آخروقت برای من ارسال کنید
من راه حل های مختلف رو روز دوشنبه قرار میدم و کامل دراین زمینه شرح میدم.
لطفا از اینترنت کدی برای من کپی نکنید ارسال کنید.خیلی ارزشمند نیست. میخوام خودتون بشینید به سوال فکر کنید و با دانش خودتون و مطالبی که در پرسش و پاسخ ها و پستهای قبل عرض کردم راه حل برای من بنویسید. وگرنه الان دنبال مساله Gap در اینترنت بگردید راه حلهای زیادی رو پیدا می کنید.
منتظر پاسخهای شما عزیزان هستم.
(خوشحال میشم اتفاقا از اساتید دانشگاهی که میشناسید بپرسید و راه حل های این عزیزان هم بیارید باهم بررسی کنیم☺️)
اسکریپت ساخت جدول :
Create Table #Test (Id int)
Go
Insert into #Test
Values(1),(2),(3),(5),(6),(8),(10),(15),(21),(30),(45),(46),(47),(48),(49),(50),
(55),(56),(57),(58),(60),(61),(62),(66)
Go
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#Set_Based_Thinking #T_SQL #SQL_Server #SQLServer #Hamidreza_Sadeghian #Declarative #SQL_Server #Learn_SQL_Server
#قسمت_سوم
سلام و عرض ادب خدمت عزیزان و دوستان گرامی
امیدوارم که حالتون خوب باشه
قبل از هرچیزی جاداره از تمام دوستان عزیزی که محبت کردن و پاسخ هارو ارسال کردن تشکر کنم.
البته این مساله خیلی ساده بود و اصلا من قسمتهای پیچیده اوونو مطرح نکردم که سبب نوشتن کدهای سنگین بشه.
فقط صرفا هدف آشنایی با مفاهیم Set Based هست و اینکه مفهوم کدهارو متوجه بشیم.
تابع زیر برای تولید اعداد هست که تا یک بازه بزرگی رو تولید می کنه.
CREATE FUNCTION dbo.GetNums(@low AS BIGINT, @high AS BIGINT) RETURNS TABLE
AS
RETURN
WITH
L0 AS (SELECT c FROM (SELECT 1 UNION ALL SELECT 1) AS D(c)),
L1 AS (SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
L2 AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
L3 AS (SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
L4 AS (SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
L5 AS (SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
FROM L5)
SELECT TOP(@high - @low + 1) @low + rownum - 1 AS n
FROM Nums
ORDER BY rownum;
GO
من سه تا کد مختلف نوشتم که هر کدومش رو توضیح میدم.
کد اول :
Select n as ID from Getnums(1,66) as n
where not exists(Select * from #test as d where n.n=d.id)
در این کد من با استفاده از تابع فوق اعداد 1 تا 66 رو تولید کردم و بایک Not exists دارم چک میکنم که رکورد وجود داره یا نه. به این طریق نوشتن Select در Where Clause که سبب ارتباط با Select بالایی هست Correlated subquery می گویند.
این کد رو با not in هم می تونید بنویسید ولی performance ضعیفتری نسبت به این کد داره. در اینجا اعداد 1 تا 66 ایجاد شده و براساس شرط داخلی سلکت در Where چک می شود که آیا رکورد فوق True هست یا False . به همین خاطر از سرعت پردازش بالایی برخورداره .
روش دوم :
Select n as ID from Getnums(1,66) as n
except
Select Id from #test
در این روش یک مرحله اضافه وجود داره و این هم بحث Sort و Distinct هست که خود عملیات Except سبب اون خواهد شد و باعث میشه نسبت به کد بالایی از Performance پایین تری برخوردار باشه.
روش سوم :
Select n as ID from Getnums(1,66) as n
Left outer Join #test as d
on n.n=d.id
where d.id is null
این روش هم نسبت به روش اول تقریبا کندتر هست .
الان خیلی نمیخوام وارد جزئیات مسائل Performance بشم.
باز هم تاکید میکنم مساله رو هم ساده انتخاب کردم هم روشهای ساده ای نوشتم که با طرز تفکر Set Based در مسائل مختلف آشنا بشین. جلوتر که بریم مسائل پیچیده تر و منطق های پیچیده تری رو حتما بررسی می کنیم و هم اینکه نکات Performance رو عرض می کنم.
با روشهای Cursor Based هم بخواهید بنویسید میشه با یک حلقه چک کرد ببینیم آیا رکورد فوق موجود هست یاخیر که نسبت به این روشها کندتر خواهد شد.
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#Set_Based_Thinking #T_SQL #SQL_Server #SQLServer #Hamidreza_Sadeghian #Declarative #SQL_Server #Learn_SQL_Server
#قسمت_چهارم
امیدوارم که حالتون خوب باشه
قبل از هرچیزی جاداره از تمام دوستان عزیزی که محبت کردن و پاسخ هارو ارسال کردن تشکر کنم.
البته این مساله خیلی ساده بود و اصلا من قسمتهای پیچیده اوونو مطرح نکردم که سبب نوشتن کدهای سنگین بشه.
فقط صرفا هدف آشنایی با مفاهیم Set Based هست و اینکه مفهوم کدهارو متوجه بشیم.
تابع زیر برای تولید اعداد هست که تا یک بازه بزرگی رو تولید می کنه.
CREATE FUNCTION dbo.GetNums(@low AS BIGINT, @high AS BIGINT) RETURNS TABLE
AS
RETURN
WITH
L0 AS (SELECT c FROM (SELECT 1 UNION ALL SELECT 1) AS D(c)),
L1 AS (SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
L2 AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
L3 AS (SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
L4 AS (SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
L5 AS (SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
FROM L5)
SELECT TOP(@high - @low + 1) @low + rownum - 1 AS n
FROM Nums
ORDER BY rownum;
GO
من سه تا کد مختلف نوشتم که هر کدومش رو توضیح میدم.
کد اول :
Select n as ID from Getnums(1,66) as n
where not exists(Select * from #test as d where n.n=d.id)
در این کد من با استفاده از تابع فوق اعداد 1 تا 66 رو تولید کردم و بایک Not exists دارم چک میکنم که رکورد وجود داره یا نه. به این طریق نوشتن Select در Where Clause که سبب ارتباط با Select بالایی هست Correlated subquery می گویند.
این کد رو با not in هم می تونید بنویسید ولی performance ضعیفتری نسبت به این کد داره. در اینجا اعداد 1 تا 66 ایجاد شده و براساس شرط داخلی سلکت در Where چک می شود که آیا رکورد فوق True هست یا False . به همین خاطر از سرعت پردازش بالایی برخورداره .
روش دوم :
Select n as ID from Getnums(1,66) as n
except
Select Id from #test
در این روش یک مرحله اضافه وجود داره و این هم بحث Sort و Distinct هست که خود عملیات Except سبب اون خواهد شد و باعث میشه نسبت به کد بالایی از Performance پایین تری برخوردار باشه.
روش سوم :
Select n as ID from Getnums(1,66) as n
Left outer Join #test as d
on n.n=d.id
where d.id is null
این روش هم نسبت به روش اول تقریبا کندتر هست .
الان خیلی نمیخوام وارد جزئیات مسائل Performance بشم.
باز هم تاکید میکنم مساله رو هم ساده انتخاب کردم هم روشهای ساده ای نوشتم که با طرز تفکر Set Based در مسائل مختلف آشنا بشین. جلوتر که بریم مسائل پیچیده تر و منطق های پیچیده تری رو حتما بررسی می کنیم و هم اینکه نکات Performance رو عرض می کنم.
با روشهای Cursor Based هم بخواهید بنویسید میشه با یک حلقه چک کرد ببینیم آیا رکورد فوق موجود هست یاخیر که نسبت به این روشها کندتر خواهد شد.
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#Set_Based_Thinking #T_SQL #SQL_Server #SQLServer #Hamidreza_Sadeghian #Declarative #SQL_Server #Learn_SQL_Server
#قسمت_چهارم
👍2
سلام وعرض ادب خدمت دوستان عزيزم
اميدوارم حالتون خوب و خوش باشه و اول هفته خوبي رو آغاز كرده باشين.
يكي از مسائلي كه براي هر DBA و كسي كه مسئول نگهداري ديتابيس ها است ، اين هست كه بدونه روزانه چه مواردي رو بايد كنترل كنه و عملا نياز به يك چك ليست داره. در اين فايلي كه خدمتتون ارسال كردم، مواردي كه يك DBA بايد بدونه و رعايت كنه و كنترل كنه ليست شده است. اين فايل رو سعي ميكنم تكميلترش كنم و نسخه هاي بعدي رو نيز خدمت شما ارسال كنم.
اگر موردي يا سوالي در خصوص مطالب فايل داشتيد با من در ميان بگذاريد.
ارادتمند شما
حميدرضا صادقيان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#DBA #DBA_CheckList #SQLServerCheckList #CheckList #صادقيان
اميدوارم حالتون خوب و خوش باشه و اول هفته خوبي رو آغاز كرده باشين.
يكي از مسائلي كه براي هر DBA و كسي كه مسئول نگهداري ديتابيس ها است ، اين هست كه بدونه روزانه چه مواردي رو بايد كنترل كنه و عملا نياز به يك چك ليست داره. در اين فايلي كه خدمتتون ارسال كردم، مواردي كه يك DBA بايد بدونه و رعايت كنه و كنترل كنه ليست شده است. اين فايل رو سعي ميكنم تكميلترش كنم و نسخه هاي بعدي رو نيز خدمت شما ارسال كنم.
اگر موردي يا سوالي در خصوص مطالب فايل داشتيد با من در ميان بگذاريد.
ارادتمند شما
حميدرضا صادقيان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#DBA #DBA_CheckList #SQLServerCheckList #CheckList #صادقيان
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
یک مقاله ای امروز داشتم مطالعه میکردم از 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 #صادقيان
امیدوارم حالتون خوب باشه
یک مقاله ای امروز داشتم مطالعه میکردم از 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 #صادقيان
SQLPerformance.com
Understanding log buffer flushes - SQLPerformance.com
Itzik Ben-Gan explains log buffer flushes and shows how to use them to help balance performance, transaction size, and durability.
سلام و عرض ادب خدمت دوستان عزیزم
لینک گروه تخصصی SQL Server رو قرار میدم .سوالی داشتید می تونید در گروه با رعایت قوانینگروه مطرح بفرمایید
ارادتمند
حمیدرضا صادقیان
https://t.me/joinchat/BTQQtzy50j_MVbMcUf6PtA
لینک گروه تخصصی 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
امیدوارم حال همه شما خوب و خوش باشه .
یکی از موارد مهمی که برای اکثر شرکتهای نرم افزاری پیش میاد ، نحوه بروز رسانی دیتابیس های مشتری ، پیدا کردن تفاوت های بین دیتابیس های مشتری ، نحوه توسعه 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
امیدوارم حال همگی خوب باشه
یکی از مسائلی که اکثرا باهاش در کدنویسی ها درگیر هستیم بحث کنارهم قراردادن رشته هاست.
مثلا فرض کنید میخواهیم ستون نام یک جدول رو کنار هم قرارداده و با , اینهارو از هم جدا کنیم ورشته ای مثل رشته زیر رو تولید کنیم.
علی,حمید,محمد,داریوش,....
یکی از روشهای اینکار استفاده از 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
امیدوارم حالتون خوب باشه
یکی از مواردی که در بررسی کدهای سازمانها و شرکتهای مختلف دیدم وجود داره استفاده از 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
امیدوارم حالتون خوب باشه
اگر در جایی مشغول به فعالیت هستید که 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