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
سلام دوستان عزیزم
امیدوارم حالتون عالی عالی باشه
چند روز پیش درگیر بروز رسانی یک سری 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://t.me/+-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://t.me/+-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