Query Design Analysis.mp4
159.2 MB
آموزش طراحی اصولی #Query در #SQLServer# - همراه ما باشید برای آموزشهای بیشتر درآینده!
10990A-SQL Server 2016 Reporting Services.pdf
13.3 MB
کتاب آموزشی دوره 10990 برای #SQLServer در این کتاب آموزشی شما یادخواهید گرفت که چگونه از Reporting Services استفاده کنید. نشر این کتاب با ذکر نام گروه @SQL_Server الزامی است.
سلام و عرض ادب خدمت دوستان گرامی
شب بر همگان خوش باشه
یکی از مواردی که در اکثر مشاوره ها در شرکتها باهاش برخورد کردم نحوه نوشتن کدها در زبان شیرین 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
#قسمت_دوم
سلام وعرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
در پست بعد جواب سوالات مربوط به پرسشها را قرار میدم.
ممنون از همه عزیزانی که محبت کردن و وقت گذاشتن و به این پرسشها پاسخ دادن.
ممنونم از اینکه با نظرات ارزشمندتون کمک می کنید کیفیت مطالب افزایش پیدا کنه
ارادتمند شما
حمیدرضا صادقیان
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
سلام و عرض ادب خدمت دوستان عزیز
امیدوارم حالتون خوب باشه
بعضی وقتها از من سوال میکنند چیکار کنیم که نسبت به رفتارهای درونی SQL Server بیشتر آشنا بشیم و بفهمیم چیکار میکنه.
میخوام بهتون تکنیکی رو یاد بدم که بهتون دید خوبی میده.
همونطور که میدونید ابزار SSMS برای کار با SQL Server هست و خوب تقریبا اکثر کارها به واسطه اون انجام میشه. پشت اون یک سری کد نوشته شده که نشاندهنده بخشی از ساختار SQL Server هست.
برای اینکه با دستورات و جداول سیستمی خوب اشنا بشین و ارتباطاتش رو درست درک کنید ، پیشنهاد می کنم Profiler رو اجرا کنید و شروع کنید به کارکردن با قسمتهای مختلف SSMS .!
اون موقع به راحتی میتونید کدهایی که توسط SSMS داره اجرا میشه رو ببینید و با دستورات و جداول سیستمی ، توابع و پراسیجرها ، DMV ها و... آشنا بشین ، ارتباطاتش رو بدست بیارین و کلی دانش خوب نسبت به رفتار SQL Server کسب کنید.
امیدوارم این نکته در جهت افزایش دانایی به کارتون بیاد.
شادو پرانرژی باشید.
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#SSMS
#Profiler
#DMV
#SQLServerEngine
#SQLServer
#SQL_Server
امیدوارم حالتون خوب باشه
بعضی وقتها از من سوال میکنند چیکار کنیم که نسبت به رفتارهای درونی SQL Server بیشتر آشنا بشیم و بفهمیم چیکار میکنه.
میخوام بهتون تکنیکی رو یاد بدم که بهتون دید خوبی میده.
همونطور که میدونید ابزار SSMS برای کار با SQL Server هست و خوب تقریبا اکثر کارها به واسطه اون انجام میشه. پشت اون یک سری کد نوشته شده که نشاندهنده بخشی از ساختار SQL Server هست.
برای اینکه با دستورات و جداول سیستمی خوب اشنا بشین و ارتباطاتش رو درست درک کنید ، پیشنهاد می کنم Profiler رو اجرا کنید و شروع کنید به کارکردن با قسمتهای مختلف SSMS .!
اون موقع به راحتی میتونید کدهایی که توسط SSMS داره اجرا میشه رو ببینید و با دستورات و جداول سیستمی ، توابع و پراسیجرها ، DMV ها و... آشنا بشین ، ارتباطاتش رو بدست بیارین و کلی دانش خوب نسبت به رفتار SQL Server کسب کنید.
امیدوارم این نکته در جهت افزایش دانایی به کارتون بیاد.
شادو پرانرژی باشید.
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#SSMS
#Profiler
#DMV
#SQLServerEngine
#SQLServer
#SQL_Server
👍2
سلام خدمت دوستان عزیزم
امیدوارم حالتون عالی عالی باشه
آموزش نصب SQL Server 2017 رو در Youtube قرار دادم
امیدوارم که مفید واقع بشه
شاد و پرانرژی باشید
@Hamidreza_Sadeghian
https://www.youtube.com/watch?v=IB-1FabtnKo
#sql #SQLServerinstallation #SQLServer2017 #InstallSQL #SQLInstall
امیدوارم حالتون عالی عالی باشه
آموزش نصب SQL Server 2017 رو در Youtube قرار دادم
امیدوارم که مفید واقع بشه
شاد و پرانرژی باشید
@Hamidreza_Sadeghian
https://www.youtube.com/watch?v=IB-1FabtnKo
#sql #SQLServerinstallation #SQLServer2017 #InstallSQL #SQLInstall
YouTube
SQL Server Installation
در این ویدئو طریقه نصب SQL Server 2017 رو کامل توضیح دادم
امیدوارم که مفید واقع بشه.
#SQLServerInstallation
#SQLServer
#Installation
#SQLServer2017
امیدوارم که مفید واقع بشه.
#SQLServerInstallation
#SQLServer
#Installation
#SQLServer2017
❤1
سلام دوستان عزیزم
امیدوارم حالتون عالی عالی باشه
چند روز پیش درگیر بروز رسانی یک سری Package های SSIS بودیم که از نسخه ۲۰۱۲ به نسخه ۲۰۲۲ منتقل کنیم.
موقع Deploy مدام به ایرادات مختلف مخصوصا Dll های مربوط به Package ها برخورد میکردیم.
بعد از کلی بررسی ها ، متوجه شدم که در Package ها Target Server به ۲۰۲۲ تغییر نکرده بود و همین باعث ایجاد کلی خطا شده بود. این خطاها هم اغلب در هنگامم اجرای Job رخ میداد. دلیلش هم واضحه. Package های SSIS وقتی که JOB میشن توسط فایل DTExec اجرا میشن و یکی از مواردی که توسط این فایل چک میشه بحث Target Server هست که باتوجه به اون بیاد DLL های مربوط به اون رو لود کنه و همین قضیه باعث میشد مرتبا جاب های ما Failed بشن. با تغییر این موضوع ، جابها با موفقیت اجرا شدند.
گفتم این مورد روباهاتون به اشتراک بذارم.
شاد باشین و شکرگزار
ارادتمند
حمیدرضا صادقیان
Hello dear friends,
I hope you're all doing exceptionally well. A few days ago, we were involved in updating a series of SSIS packages from version 2012 to version 2022. During the deployment, we consistently encountered various issues, especially related to the DLLs associated with the packages.
After thorough investigations, I realized that the Target Server in the packages had not been changed to 2022. This oversight caused a multitude of errors, most of which occurred during the execution of jobs. The reason is clear: SSIS packages, when executed by the DTExec file during a job, undergo a check related to the Target Server. Based on this, the corresponding DLLs are loaded. This situation repeatedly led to the failure of our jobs.
By addressing this issue and changing the Target Server, the jobs were successfully executed. I thought it would be beneficial to share this experience with you.
Stay joyful and grateful.
Best regards,
Hamidreza Sadeghian
Telegram Channel : @SQL_Server
#SSIS
#DBA
#SQLServer
#Administration
#ETL
#job
امیدوارم حالتون عالی عالی باشه
چند روز پیش درگیر بروز رسانی یک سری Package های SSIS بودیم که از نسخه ۲۰۱۲ به نسخه ۲۰۲۲ منتقل کنیم.
موقع Deploy مدام به ایرادات مختلف مخصوصا Dll های مربوط به Package ها برخورد میکردیم.
بعد از کلی بررسی ها ، متوجه شدم که در Package ها Target Server به ۲۰۲۲ تغییر نکرده بود و همین باعث ایجاد کلی خطا شده بود. این خطاها هم اغلب در هنگامم اجرای Job رخ میداد. دلیلش هم واضحه. Package های SSIS وقتی که JOB میشن توسط فایل DTExec اجرا میشن و یکی از مواردی که توسط این فایل چک میشه بحث Target Server هست که باتوجه به اون بیاد DLL های مربوط به اون رو لود کنه و همین قضیه باعث میشد مرتبا جاب های ما Failed بشن. با تغییر این موضوع ، جابها با موفقیت اجرا شدند.
گفتم این مورد روباهاتون به اشتراک بذارم.
شاد باشین و شکرگزار
ارادتمند
حمیدرضا صادقیان
Hello dear friends,
I hope you're all doing exceptionally well. A few days ago, we were involved in updating a series of SSIS packages from version 2012 to version 2022. During the deployment, we consistently encountered various issues, especially related to the DLLs associated with the packages.
After thorough investigations, I realized that the Target Server in the packages had not been changed to 2022. This oversight caused a multitude of errors, most of which occurred during the execution of jobs. The reason is clear: SSIS packages, when executed by the DTExec file during a job, undergo a check related to the Target Server. Based on this, the corresponding DLLs are loaded. This situation repeatedly led to the failure of our jobs.
By addressing this issue and changing the Target Server, the jobs were successfully executed. I thought it would be beneficial to share this experience with you.
Stay joyful and grateful.
Best regards,
Hamidreza Sadeghian
Telegram Channel : @SQL_Server
#SSIS
#DBA
#SQLServer
#Administration
#ETL
#job
👍43❤8😍2👎1👏1
شاید شما هم از دوستان DBA زیاد کلمه Statistics رو شنیدین؟ یا مثلا بگن Stat هاشو Update کردم درست شد و جملاتی از این قبیل.
حالا بریم ببینیم این جذاب لعنتی چیه که تمام رفتار Optimizer بر مبنای اون رقم میخوره.
فرض کنید Optimizer واحد مدیریت شرکت شماست.
و Statistics ها هم بخش آمار و تولید دیتای شما هستند که به شما دیتا میدن تا تصمیم گیری کنید.
خوب تا اینجاش که بنظر جذاب میاد.
آماااا. کجا دعواها شروع میشه.
اونجا که شما به عنوان مدیر میاین سرکار ، فرض کنید یک ذره پاداش کارمندان عقب افتاده(البته این اتفاق در یک کشور ثانی در دنیای موازی رخ میده شما مخاطب نیستید 😉 ) واحد آمار با شما لج می کنه و به شما دیتای غلط می ده. مثلا آمار اشتباهی از فروش محصولات میده. آمار اشتباهی از تعداد ثبت درخواست ها و بازدید سایت میده. شما هم شاد و خندان براساس آمارها میاین منابع تخصیص میدین برای توسعه کار(SQL Server میاد منابع RAm, CPU , IO رو پیش بینی میکنه و تخصیص میده برای اجرای کد) بعد با یک ژست مدیرعاملی خفن که مثلا ما خیلی باحالیم میاین دستور میدین به واحدهای مختلف که با این بودجه برید اینکارهارو انجام بدین(Optimizer پلن رو تهیه می کنه و میده به Execution Engine میگه داداش برو اینو اجرا کن) حالا این واحدهای از خدا بیخبر هم میرن بودجه رو میگیرن و سعی می کنن کارو دربیارن. اگه بودجه اضافی باشه که اون وسط یک حالی هم خودشون میکنن( البته SQL Server حلال خوره و میاد میگه داداش از این همه منابع من خداوکیلی اینقدرشو استفاده کردم مابقیش رو پس آوردم. البته جسارت نباشه ها بد برداشت نکنید، از جنبه فان نگاه کنید 😁 ) اگه بودجه کم بیاد که مجبورن با همون بودجه کم ، کارو دربیارن ولی زمان بیشتری رو صرف کنن( دقیقا همین اتفاق این سمت هم میافته)
حالا چی میشه؟
آفرین اینجوری میشه که کدها ومنابع شما به فنا میره.
حالا اگه واحد آمار پاداششو گرفته باشه و شنگول باشه و آمار درستی بده. چه اتفاقی میافته؟ دقیقااا. بودجه بندی مناسب ، تخصیص منابع درست و درنهایت تخمین دقیق زمان اجرا بدون هیچگونه هدررفت منابع.
سعی کردم این مطلب رو با شوخی تلفیق کنم که درکش ساده باشه.
در پستهای بعدی تلاش می کنم بیشتر این مبحث رو باز کنم و بیشتر شمارو با رفتار درونی SQL Server آشناکنم.
پرسرعت و شاد باشین 😊
Telegram discussion Group :https://xn--r1a.website/+-JqFG0ceU7JlNDA0
#Statistics
#DBA
#SQLServer_Internals
@Hamidreza_Sadeghian
حالا بریم ببینیم این جذاب لعنتی چیه که تمام رفتار Optimizer بر مبنای اون رقم میخوره.
فرض کنید Optimizer واحد مدیریت شرکت شماست.
و Statistics ها هم بخش آمار و تولید دیتای شما هستند که به شما دیتا میدن تا تصمیم گیری کنید.
خوب تا اینجاش که بنظر جذاب میاد.
آماااا. کجا دعواها شروع میشه.
اونجا که شما به عنوان مدیر میاین سرکار ، فرض کنید یک ذره پاداش کارمندان عقب افتاده(البته این اتفاق در یک کشور ثانی در دنیای موازی رخ میده شما مخاطب نیستید 😉 ) واحد آمار با شما لج می کنه و به شما دیتای غلط می ده. مثلا آمار اشتباهی از فروش محصولات میده. آمار اشتباهی از تعداد ثبت درخواست ها و بازدید سایت میده. شما هم شاد و خندان براساس آمارها میاین منابع تخصیص میدین برای توسعه کار(SQL Server میاد منابع RAm, CPU , IO رو پیش بینی میکنه و تخصیص میده برای اجرای کد) بعد با یک ژست مدیرعاملی خفن که مثلا ما خیلی باحالیم میاین دستور میدین به واحدهای مختلف که با این بودجه برید اینکارهارو انجام بدین(Optimizer پلن رو تهیه می کنه و میده به Execution Engine میگه داداش برو اینو اجرا کن) حالا این واحدهای از خدا بیخبر هم میرن بودجه رو میگیرن و سعی می کنن کارو دربیارن. اگه بودجه اضافی باشه که اون وسط یک حالی هم خودشون میکنن( البته SQL Server حلال خوره و میاد میگه داداش از این همه منابع من خداوکیلی اینقدرشو استفاده کردم مابقیش رو پس آوردم. البته جسارت نباشه ها بد برداشت نکنید، از جنبه فان نگاه کنید 😁 ) اگه بودجه کم بیاد که مجبورن با همون بودجه کم ، کارو دربیارن ولی زمان بیشتری رو صرف کنن( دقیقا همین اتفاق این سمت هم میافته)
حالا چی میشه؟
آفرین اینجوری میشه که کدها ومنابع شما به فنا میره.
حالا اگه واحد آمار پاداششو گرفته باشه و شنگول باشه و آمار درستی بده. چه اتفاقی میافته؟ دقیقااا. بودجه بندی مناسب ، تخصیص منابع درست و درنهایت تخمین دقیق زمان اجرا بدون هیچگونه هدررفت منابع.
سعی کردم این مطلب رو با شوخی تلفیق کنم که درکش ساده باشه.
در پستهای بعدی تلاش می کنم بیشتر این مبحث رو باز کنم و بیشتر شمارو با رفتار درونی SQL Server آشناکنم.
پرسرعت و شاد باشین 😊
Telegram discussion Group :https://xn--r1a.website/+-JqFG0ceU7JlNDA0
#Statistics
#DBA
#SQLServer_Internals
@Hamidreza_Sadeghian
Telegram
SQL Server
ُSQL Server Discussion Group (Farsi)
Juniors of SQL Server Group : PM to @Hamidreza_Sadeghian
Juniors of SQL Server Group : PM to @Hamidreza_Sadeghian
👍29❤4🤔2🤨1
سلام
💔 داستان Shrink در SQL Server 😅
ببینید رفقا، این عملیات Shrink کردن فایلهای Data عین روابط عاشقانهی پر فراز و نشیبِیه! 😎
یه روز SQL Server میگه:
"دیگه بهت نیاز ندارم 😤"
و فایل Data رو کوچیک میکنه (کات میکنن خلاصه 💔)
بعد صبح روز بعد دوباره میاد:
"ببین من یه چیزی گفتم... 😅 بیا دوباره با هم باشیم!"
و دوباره فضا میگیره 😬
شب دوباره job shrink اجرا میشه 😑
صبح دوباره SQL Server میاد میگه «برگرد پیشم!»
و این چرخه تا ابد ادامه داره... 😭
📣 بابا ولش کنین دیگه! Shrink نکنید، بذارید رابطهش آروم بگیره 😂
#SQLServer #DBA #ShrinkDrama #DatabaseHumor #ITLife #DBALife
💔 داستان Shrink در SQL Server 😅
ببینید رفقا، این عملیات Shrink کردن فایلهای Data عین روابط عاشقانهی پر فراز و نشیبِیه! 😎
یه روز SQL Server میگه:
"دیگه بهت نیاز ندارم 😤"
و فایل Data رو کوچیک میکنه (کات میکنن خلاصه 💔)
بعد صبح روز بعد دوباره میاد:
"ببین من یه چیزی گفتم... 😅 بیا دوباره با هم باشیم!"
و دوباره فضا میگیره 😬
شب دوباره job shrink اجرا میشه 😑
صبح دوباره SQL Server میاد میگه «برگرد پیشم!»
و این چرخه تا ابد ادامه داره... 😭
📣 بابا ولش کنین دیگه! Shrink نکنید، بذارید رابطهش آروم بگیره 😂
#SQLServer #DBA #ShrinkDrama #DatabaseHumor #ITLife #DBALife
😁13🤣9❤8👍6
گاهی وقتا برای فهمیدن پشتصحنهی واقعی SQL Server باید یه ذره چراغقوهی مخفی روشن کنیم 😎🔦
یکی از چیزهایی که همیشه کمکم کرده بفهمم دقیقاً اون زیر چه خبره، همین دستور معروفه:
dbcc traceon(3004,3604,-1)
این دستور باعث میشه جزییات کامل عملیات Backup و Restore رو ببینی؛
جزییاتی که SQL Server معمولاً ساکت و بیصدا انجامشون میده ولی ما میخوایم بدونیم دقیقاً در حال رخ دادن چیه ⚙️👀
نکتهی جالبش اینه که تو این جزییات دقیقاً مشخص میکنه:
✔️بکاپ یا ریستور با چه پارامترهایی داره انجام میشه،
✔️کدوم مرحله بیشترین زمان رو میبلعه،
✔️و چطور میتونی کل فرآیند رو بهینهتر کنی ⏱️🚀
وقتی فعالش میکنی، انگار وارد اتاق کنترل موتور SQL Server شدی و داری قدمبهقدم همهچیز رو لایو نگاه میکنی 🔍💡
و اما نکتهی مهم برای کسایی که تازه با این Trace Flagها آشنا میشن:
✔️Trace Flag 3004: مسئول نوشتن لاگ عملیات Backup/Restore هست.
✔️Trace Flag 3604: به SQL Server میگه همین لاگها رو مستقیم داخل نتیجهی همون کوئری نشون بده.
یعنی دقیقاً همان لحظه همونجا میبینی چه اتفاقی داره میفته 😍📜
برای من این چیزا فقط یه دستور نیستن؛
کلیدهایی هستن برای اینکه رفتار دیتابیس رو بفهمم، تحلیل کنم و دقیقتر از همیشه بهینهسازی انجام بدم.
#SQLServer #DBA #TraceFlag #BackupRestore #PerformanceTuning #DatabaseInternals #Monitoring #MicrosoftSQLServer #DataEngineering
یکی از چیزهایی که همیشه کمکم کرده بفهمم دقیقاً اون زیر چه خبره، همین دستور معروفه:
dbcc traceon(3004,3604,-1)
این دستور باعث میشه جزییات کامل عملیات Backup و Restore رو ببینی؛
جزییاتی که SQL Server معمولاً ساکت و بیصدا انجامشون میده ولی ما میخوایم بدونیم دقیقاً در حال رخ دادن چیه ⚙️👀
نکتهی جالبش اینه که تو این جزییات دقیقاً مشخص میکنه:
✔️بکاپ یا ریستور با چه پارامترهایی داره انجام میشه،
✔️کدوم مرحله بیشترین زمان رو میبلعه،
✔️و چطور میتونی کل فرآیند رو بهینهتر کنی ⏱️🚀
وقتی فعالش میکنی، انگار وارد اتاق کنترل موتور SQL Server شدی و داری قدمبهقدم همهچیز رو لایو نگاه میکنی 🔍💡
و اما نکتهی مهم برای کسایی که تازه با این Trace Flagها آشنا میشن:
✔️Trace Flag 3004: مسئول نوشتن لاگ عملیات Backup/Restore هست.
✔️Trace Flag 3604: به SQL Server میگه همین لاگها رو مستقیم داخل نتیجهی همون کوئری نشون بده.
یعنی دقیقاً همان لحظه همونجا میبینی چه اتفاقی داره میفته 😍📜
برای من این چیزا فقط یه دستور نیستن؛
کلیدهایی هستن برای اینکه رفتار دیتابیس رو بفهمم، تحلیل کنم و دقیقتر از همیشه بهینهسازی انجام بدم.
#SQLServer #DBA #TraceFlag #BackupRestore #PerformanceTuning #DatabaseInternals #Monitoring #MicrosoftSQLServer #DataEngineering
👏15❤8👌2👍1
سلام دوستان
🔍 یک چالش جالب در SQL Server که میتونست یک مجموعه رو زمینگیر کنه!
چند وقت پیش در یکی از مجموعهها با یک مشکل عجیب مواجه بودن 👀
سیستم از یک تعداد کاربر مشخص به بعد خطا میداد و اجازه نمیداد اتصال جدیدی به دیتابیس برقرار بشه.
🔎 بعد از دیدن خطا، اولین چیزی که به ذهنم رسید این بود:
احتمالاً تنظیمات user connections دستکاری شده.
مشکل اینجا بود که حتی اتصال عادی هم به دیتابیس برقرار نمیشد!
با کلی داستان و از طریق sqlcmd تونستم مستقیم به Engine وصل بشم 💪
📌 با بررسی تنظیمات:
'sp_configure 'user connections
مشخص شد مقدار روی 100 ست شده 😐
🔧 راهحل ساده ولی حیاتی بود:
مقدار user connections رو روی 0 گذاشتم
عدد 0 یعنی:
👉 SQL Server خودش مدیریت میکنه (تا حدود 32767 اتصال همزمان)
بعد از اعمال تغییر، مجبور شدیم یک بار سرویس SQL Server رو ریست کنیم 🔄
و… مشکل بهطور کامل حل شد ✅
✨ نکته جالبتر؟
کاربران میگفتن حتی سرعت سیستم هم بهتر شده!
احتمالاً سیستم مدام سعی میکرد اتصال بگیره، خطا میخورد و منتظر میموند تا دوباره تلاش کنه ⏳
🧠 جمعبندی مهم:
هر عددی که در SQL Server میبینید، معمولاً پشتش یک منطق و سناریو وجود داره.
این تنظیمات رو:
❌ با حدس
❌ با سلیقه
❌ یا «ببینیم با کدوم عدد حال میکنیم»
نباید تغییر داد!
⚠️ یک عدد اشتباه، خیلی راحت میتونه کل یک شرکت رو دچار اختلال کنه.
کمی دقت بیشتر در این جزئیات، هزینههای خیلی بزرگی رو کم میکنه.
#SQLServer #DBA #Performance #Troubleshooting #Database #Production #Experience
🔍 یک چالش جالب در SQL Server که میتونست یک مجموعه رو زمینگیر کنه!
چند وقت پیش در یکی از مجموعهها با یک مشکل عجیب مواجه بودن 👀
سیستم از یک تعداد کاربر مشخص به بعد خطا میداد و اجازه نمیداد اتصال جدیدی به دیتابیس برقرار بشه.
🔎 بعد از دیدن خطا، اولین چیزی که به ذهنم رسید این بود:
احتمالاً تنظیمات user connections دستکاری شده.
مشکل اینجا بود که حتی اتصال عادی هم به دیتابیس برقرار نمیشد!
با کلی داستان و از طریق sqlcmd تونستم مستقیم به Engine وصل بشم 💪
📌 با بررسی تنظیمات:
'sp_configure 'user connections
مشخص شد مقدار روی 100 ست شده 😐
🔧 راهحل ساده ولی حیاتی بود:
مقدار user connections رو روی 0 گذاشتم
عدد 0 یعنی:
👉 SQL Server خودش مدیریت میکنه (تا حدود 32767 اتصال همزمان)
بعد از اعمال تغییر، مجبور شدیم یک بار سرویس SQL Server رو ریست کنیم 🔄
و… مشکل بهطور کامل حل شد ✅
✨ نکته جالبتر؟
کاربران میگفتن حتی سرعت سیستم هم بهتر شده!
احتمالاً سیستم مدام سعی میکرد اتصال بگیره، خطا میخورد و منتظر میموند تا دوباره تلاش کنه ⏳
🧠 جمعبندی مهم:
هر عددی که در SQL Server میبینید، معمولاً پشتش یک منطق و سناریو وجود داره.
این تنظیمات رو:
❌ با حدس
❌ با سلیقه
❌ یا «ببینیم با کدوم عدد حال میکنیم»
نباید تغییر داد!
⚠️ یک عدد اشتباه، خیلی راحت میتونه کل یک شرکت رو دچار اختلال کنه.
کمی دقت بیشتر در این جزئیات، هزینههای خیلی بزرگی رو کم میکنه.
#SQLServer #DBA #Performance #Troubleshooting #Database #Production #Experience
❤22👍7👌2
سلام دوستان
📉 Shrink در SQL Server به روایت یک فضای کار اشتراکی!
فرض کن یکی میره یه فضای کار اشتراکی 🏢
اوایل کارش کوچیکه، یه میز اشتراکی میگیره.
کمکم کارش میگیره 📈، میگه «نه، من یه اتاق میخوام» 🚪
اتاق رو میگیره، کارش راه میافته، همه چی خوبه 😌
فرداش چی؟
میگه «نه بابا، الان اتاق زیادیه»
اتاق رو پس میده، برمیگرده میز اشتراکی 😐
عصر دوباره کار زیاد میشه:
«بچهها اتاق بدین!»
دوباره اتاق میگیره…
پس میده…
میگیره…
پس میده… 🤦♂️
حالا صاحب فضای کار اشتراکی کلافه نشده؟
دیوارها جابهجا نمیشن؟
نظم فضا به هم نمیریزه؟ 😵
📌 Shrink توی SQL Server دقیقاً همینه!
دیتابیس رشد میکنه 📊
شما Shrink میکنی چون «فضا خالیه»
دوباره دیتا میاد، دوباره رشد میکنه
دوباره Shrink
نتیجه؟
Fragmentation شدید 🧩
فشار بیخودی به IO 💥
بدتر شدن Performance 🐌
📢 Shrink یعنی پس گرفتن فضا، نه مدیریت فضا!
Shrink برای شرایط خاصه:
بعد از حذف دائمی حجم عظیمی از دیتا
وقتی مطمئنی دیگه به اون فضا نیاز نداری
نه برای اینکه:
❌ هر هفته دیسک خالی ببینی
❌ یا وجدان DBAت آروم بشه 😄
و این مساله هم برای فایل LDF صدق می کنه هم MDF.
بارها توی همه Job ها من Job برای Shrink دیدم و ایجاد Fragmentation بر روی LDF ها.
🎯 نتیجه:
به جای این همه «اتاق پس بده، اتاق بگیر»
یه فضای مناسب بگیر، درست استفاده کن،
و بگذار دیتابیس با آرامش رشد کنه
و برای کنترل LDF هم تهیه بکاپ منظم از Log ها به این مساله به شدت کمک می کنه.🧘♂️
hashtag#SQLServer hashtag#DBA hashtag#Shrink hashtag#Performance hashtag#DatabaseLife hashtag#طنز_فنی 😄
📉 Shrink در SQL Server به روایت یک فضای کار اشتراکی!
فرض کن یکی میره یه فضای کار اشتراکی 🏢
اوایل کارش کوچیکه، یه میز اشتراکی میگیره.
کمکم کارش میگیره 📈، میگه «نه، من یه اتاق میخوام» 🚪
اتاق رو میگیره، کارش راه میافته، همه چی خوبه 😌
فرداش چی؟
میگه «نه بابا، الان اتاق زیادیه»
اتاق رو پس میده، برمیگرده میز اشتراکی 😐
عصر دوباره کار زیاد میشه:
«بچهها اتاق بدین!»
دوباره اتاق میگیره…
پس میده…
میگیره…
پس میده… 🤦♂️
حالا صاحب فضای کار اشتراکی کلافه نشده؟
دیوارها جابهجا نمیشن؟
نظم فضا به هم نمیریزه؟ 😵
📌 Shrink توی SQL Server دقیقاً همینه!
دیتابیس رشد میکنه 📊
شما Shrink میکنی چون «فضا خالیه»
دوباره دیتا میاد، دوباره رشد میکنه
دوباره Shrink
نتیجه؟
Fragmentation شدید 🧩
فشار بیخودی به IO 💥
بدتر شدن Performance 🐌
📢 Shrink یعنی پس گرفتن فضا، نه مدیریت فضا!
Shrink برای شرایط خاصه:
بعد از حذف دائمی حجم عظیمی از دیتا
وقتی مطمئنی دیگه به اون فضا نیاز نداری
نه برای اینکه:
❌ هر هفته دیسک خالی ببینی
❌ یا وجدان DBAت آروم بشه 😄
و این مساله هم برای فایل LDF صدق می کنه هم MDF.
بارها توی همه Job ها من Job برای Shrink دیدم و ایجاد Fragmentation بر روی LDF ها.
🎯 نتیجه:
به جای این همه «اتاق پس بده، اتاق بگیر»
یه فضای مناسب بگیر، درست استفاده کن،
و بگذار دیتابیس با آرامش رشد کنه
و برای کنترل LDF هم تهیه بکاپ منظم از Log ها به این مساله به شدت کمک می کنه.🧘♂️
hashtag#SQLServer hashtag#DBA hashtag#Shrink hashtag#Performance hashtag#DatabaseLife hashtag#طنز_فنی 😄
👍16👌6🙏2🤨2❤1
تا حالا Running Total تو SQL Server نوشتی و با خیال راحت رد شدی؟ 😌
📌 معمولاً برای Running Total یه چیزی شبیه این مینویسیم:
همهچیز هم ظاهراً درسته…
اما دقیقاً همینجا مشکل شروع میشه 😐
🔍 مشکل کجاست؟
وقتی داخل OVER فقط ORDER BY مینویسیم و چیز دیگهای مشخص نمیکنیم،
خود SQL Server بهصورت پیشفرض از این استفاده میکنه 👇
و این یعنی چی؟ 🤔
یعنی اگر تو ستون ORDER BY (مثلاً OrderDate) مقدار تکراری وجود داشته باشه:
اونقوت SQL Server تمام ردیفهایی که تاریخ یکسان دارن رو «یک ردیف منطقی» در نظر میگیره
و Running Total برای همه اونها با هم محاسبه میشه
نتیجه؟
➕ جمع یههو میپره
😵💫 چیزی که حس میکنیم غلطه، ولی در واقع «غیرمنتظره» است
❗️ نکته مهم:
1- SQL Server اشتباه نکرده
2- ما ناخواسته رفتار RANGE رو فعال کردیم
🚀 راهحل درست و حرفهای:
اگه Running Total واقعی میخوای، یعنی ردیفبهردیف و بدون پرش،
باید صریح بنویسی:
یا حتی کوتاهتر:
✔️ محاسبه دقیق
✔️ بدون رفتار عجیب
✔️ بازدهی خیلی بهتر (In-Memory بهجای TempDB)
🧠 جمعبندی
همیشه Defaultها دوست ما نیستن
استفاده از RANGE فقط وقتی خوبه که عمداً بخوای Tieها یکی حساب بشن
برای ۹۹٪ سناریوهای Running Total → ROWS رو همیشه صریح بنویس
یه خط کداضافه ، ولی کلی تفاوت تو نتیجه و Performance 🔥
#SQLServer #TSQL #DBA #Performance #WindowFunctions #RunningTotal #DatabaseTips
📌 معمولاً برای Running Total یه چیزی شبیه این مینویسیم:
SUM(TotalDue) OVER (
PARTITION BY CustomerID
ORDER BY OrderDate
)
همهچیز هم ظاهراً درسته…
اما دقیقاً همینجا مشکل شروع میشه 😐
🔍 مشکل کجاست؟
وقتی داخل OVER فقط ORDER BY مینویسیم و چیز دیگهای مشخص نمیکنیم،
خود SQL Server بهصورت پیشفرض از این استفاده میکنه 👇
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
و این یعنی چی؟ 🤔
یعنی اگر تو ستون ORDER BY (مثلاً OrderDate) مقدار تکراری وجود داشته باشه:
اونقوت SQL Server تمام ردیفهایی که تاریخ یکسان دارن رو «یک ردیف منطقی» در نظر میگیره
و Running Total برای همه اونها با هم محاسبه میشه
نتیجه؟
➕ جمع یههو میپره
😵💫 چیزی که حس میکنیم غلطه، ولی در واقع «غیرمنتظره» است
❗️ نکته مهم:
1- SQL Server اشتباه نکرده
2- ما ناخواسته رفتار RANGE رو فعال کردیم
🚀 راهحل درست و حرفهای:
اگه Running Total واقعی میخوای، یعنی ردیفبهردیف و بدون پرش،
باید صریح بنویسی:
SUM(TotalDue) OVER (
PARTITION BY CustomerID
ORDER BY OrderDate
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
یا حتی کوتاهتر:
ROWS UNBOUNDED PRECEDING
✔️ محاسبه دقیق
✔️ بدون رفتار عجیب
✔️ بازدهی خیلی بهتر (In-Memory بهجای TempDB)
🧠 جمعبندی
همیشه Defaultها دوست ما نیستن
استفاده از RANGE فقط وقتی خوبه که عمداً بخوای Tieها یکی حساب بشن
برای ۹۹٪ سناریوهای Running Total → ROWS رو همیشه صریح بنویس
یه خط کداضافه ، ولی کلی تفاوت تو نتیجه و Performance 🔥
#SQLServer #TSQL #DBA #Performance #WindowFunctions #RunningTotal #DatabaseTips
👍14❤8🔥2
سلام دوستان
🚨 تا حالا شده بری Shrink File و با خودت بگی:
«اینا رو با یه SELECT نمیشه دید؟!» 🤔
خبر خوب برای DBAها و Backend Engineerها 🎉
بله… میشه! و حتی تمیزتر، سریعتر و قابل اتوماسیون 😎
🧠 مسئله چیه؟
تو SQL Server وقتی میری:
بخش Shrink Database
یا Shrink File
برای هر فایل اینا رو میبینی:
Total Size
Used Space
Free Space
اما این اطلاعات:
❌ اسکریپتپذیر نیست
❌ تو مانیتورینگ نمیاد
❌ تو گزارش DBA جایی نداره
🎯 سناریوی خیلی واقعی (احتمالاً الان داری باهاش دستوپنجه نرم میکنی 😅)
فرض کن:
روی یک سیستم تستی / Staging کار میکنی
میخوای روی یک دیتابیس خاص تغییرات سنگین بدی فضا کم آوردی 😬
اون دیتابیس هم ۱۰ تا Data File مختلف + یکی دوتا Log داره
حالا سوال مهم اینه 👇
👉 از کدوم فایل واقعاً میتونم فضا آزاد کنم؟
👉 کدوم فایل عملاً پره و Shrink روش جواب نمیده؟
اینجاست که Shrink UI دیگه کافی نیست…
و یه SELECT حسابی نجاتت میده 😏
✅ راهحل حرفهای
با کوئری زیر، دقیقاً همون چیزی که UI نشون میده رو میگیری
برای:
Data File 🗂
Log File 🧾
💎 این کوئری دقیقاً کجاها میدرخشه؟
✨ وقتی روی Test / QA / Staging فضا کم آوردی
✨ وقتی دیتابیس چندین فایل داره و تصمیمگیری سخته
✨ برای اینکه بدونی کدوم فایل ارزش Shrink داره
✨ قبل از Extend کردن دیسک (که همیشه هم در دسترس نیست 😐)
✨ توی Monitoring Dashboard
✨ برای Capacity Planning واقعی، نه حدسی
👥 این کد به درد کی میخوره؟
👨💻دوستان DBAها (Junior تا Senior)
👨💻همچنین Backend Engineerهایی که SQL Server دارن
🏢 تیمهای DevOps و Infra
📊 برای داشبوردهای Monitoring
⚠️ یادآوری دوستانه DBAطور
🔴اول اینکه Free Space ≠ Space قابل Shrink
🔴و Shrink مُسکنه، نه درمان
🔴 اول علت رشد فایل رو بفهم، بعد تصمیم بگیر
hashtag#SQLServer hashtag#DBA hashtag#Monitoring hashtag#CapacityPlanning hashtag#TSQL hashtag#DevOps hashtag#DataEngineering 🚀
🚨 تا حالا شده بری Shrink File و با خودت بگی:
«اینا رو با یه SELECT نمیشه دید؟!» 🤔
خبر خوب برای DBAها و Backend Engineerها 🎉
بله… میشه! و حتی تمیزتر، سریعتر و قابل اتوماسیون 😎
🧠 مسئله چیه؟
تو SQL Server وقتی میری:
بخش Shrink Database
یا Shrink File
برای هر فایل اینا رو میبینی:
Total Size
Used Space
Free Space
اما این اطلاعات:
❌ اسکریپتپذیر نیست
❌ تو مانیتورینگ نمیاد
❌ تو گزارش DBA جایی نداره
🎯 سناریوی خیلی واقعی (احتمالاً الان داری باهاش دستوپنجه نرم میکنی 😅)
فرض کن:
روی یک سیستم تستی / Staging کار میکنی
میخوای روی یک دیتابیس خاص تغییرات سنگین بدی فضا کم آوردی 😬
اون دیتابیس هم ۱۰ تا Data File مختلف + یکی دوتا Log داره
حالا سوال مهم اینه 👇
👉 از کدوم فایل واقعاً میتونم فضا آزاد کنم؟
👉 کدوم فایل عملاً پره و Shrink روش جواب نمیده؟
اینجاست که Shrink UI دیگه کافی نیست…
و یه SELECT حسابی نجاتت میده 😏
✅ راهحل حرفهای
با کوئری زیر، دقیقاً همون چیزی که UI نشون میده رو میگیری
برای:
Data File 🗂
Log File 🧾
SELECT
df.name,
df.type_desc,
df.physical_name,
df.size / 128.0 AS TotalSizeMB,
CASE
WHEN df.type = 1
THEN ls.used_log_space_in_bytes / 1024 / 1024
ELSE FILEPROPERTY(df.name, 'SpaceUsed') / 128.0
END AS UsedSpaceMB,
CASE
WHEN df.type = 1
THEN (df.size / 128.0) - (ls.used_log_space_in_bytes / 1024 / 1024)
ELSE (df.size - FILEPROPERTY(df.name, 'SpaceUsed')) / 128.0
END AS FreeSpaceMB
FROM sys.database_files df
OUTER APPLY sys.dm_db_log_space_usage ls;
💎 این کوئری دقیقاً کجاها میدرخشه؟
✨ وقتی روی Test / QA / Staging فضا کم آوردی
✨ وقتی دیتابیس چندین فایل داره و تصمیمگیری سخته
✨ برای اینکه بدونی کدوم فایل ارزش Shrink داره
✨ قبل از Extend کردن دیسک (که همیشه هم در دسترس نیست 😐)
✨ توی Monitoring Dashboard
✨ برای Capacity Planning واقعی، نه حدسی
👥 این کد به درد کی میخوره؟
👨💻دوستان DBAها (Junior تا Senior)
👨💻همچنین Backend Engineerهایی که SQL Server دارن
🏢 تیمهای DevOps و Infra
📊 برای داشبوردهای Monitoring
⚠️ یادآوری دوستانه DBAطور
🔴اول اینکه Free Space ≠ Space قابل Shrink
🔴و Shrink مُسکنه، نه درمان
🔴 اول علت رشد فایل رو بفهم، بعد تصمیم بگیر
hashtag#SQLServer hashtag#DBA hashtag#Monitoring hashtag#CapacityPlanning hashtag#TSQL hashtag#DevOps hashtag#DataEngineering 🚀
❤19👍1