تصمیم داریم در این مبحث، به آموزش بانک اطلاعاتی اس کیو ال سرور SQL Server Database پرداخته و دستور زبان T-SQL را بیشتر توضیح دهیم تا شما را با نکاتی آشنا کنم که شاید کمتر با آن ها برخورد کرده باشید.
ترکیب Set Operations و Join ها در سرور SQL
در این مطلب میخواهیم از ترکیب Set Operations و Join ها با شما صحبت کنیم.
فرض کنید ما تصمیم داریم بین دو تا جدول Inner join بزنیم ولی یکی از فیلدهای شرط ما Null هست.
خوب اگر ما بیایم این دو فیلد رو مساوی قرار بدهیم، چون Null نمیتواند مساوی قرار بگیرد پس در واقع در شرط به صورت Unknown ارزیابی میشود و مقدار False برمیگرداند ولی براساس شرط ما این ردیف نیز باید برگردد.
راه دوم این است که بیاییم این دو فیلد را با مقدار Isnull باهم مقایسه کنیم.
SELECT EL.country, EL.region, EL.city, EL.numemps, CL.numcusts
FROM dbo.EmpLocations AS EL
INNER JOIN dbo.CustLocations AS CL
ON EL.country = CL.country
AND ISNULL(EL.region, N'<N/A>') = ISNULL(CL.region, N'<N/A>')
AND EL.city = CL.city;
در اینجا مشکل ما حل میشود و مقدار رکورد مورد نظر برمیگردد ولی چون فیلدهای Region دستخوش تغییرات شده اند در جستجوهای ما SQL Server دیگر به Sort بر روی این فیلدها نگاهی نمیکند (اگر ایندکسی بر روی انها باشد و سورت شده باشد)و اگر رکوردها زیاد باشند و Merge join انجام شود خودش یک Sort انجام میدهد. یا در تعداد پایین می آید ابتدا Index Seek بر روی شرط Country انجام میشود و دو شرط بعدی در واقع بر روی کل رکوردهای باقی مانده انجام میشود.که یک مقایسه زیادی هست.
راه سوم این هست که بیایم ازدستور Isnull استفاده کنیم.
SELECT EL.country, EL.region, EL.city, EL.numemps, CL.numcusts
FROM dbo.EmpLocations AS EL
INNER JOIN dbo.CustLocations AS CL
ON EL.country = CL.country
AND (EL.region = CL.region OR (EL.region IS NULL AND CL.region IS NULL))
AND EL.city = CL.city;
در این روش کل شرط ها در Index Seek انجام می پذیرد و پلن بهینه ای خواهیم داشت و از Sort روی ایندکس ها نیز بهره میبرد.
راه بعدی هم ترکیب Set Operation ها و Join هست.
SELECT EL.country, EL.region, EL.city, EL.numemps, CL.numcusts
FROM dbo.EmpLocations AS EL
INNER JOIN dbo.CustLocations AS CL
ON EXISTS (SELECT EL.country, EL.region, EL.city
intersect
SELECT CL.country, CL.region, CL.city);
در این روش پلن ایجاد شده مانند کد قبل هست و پلن بهینه ای تولید میشود و چون Intersect میتواند Null را ارزیابی کند پس آن ردیفی که دارای Region برابر Null هست نیز داخل رکوردهای ما هست و در پلن بیرونی نیز ارزیابی میشود.
آموزش دستور در زبان T-SQL
غالباً برای یک رشته ای که با , از هم جدا شده نیاز است که به صورت جدول تبدیل می کنند و برای این امر شروع به نوشتن توابعی کردند که معمولا بهینه نبوده است.
از نسخه ۲۰۱۶ به بعد تابعی به اسم 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 و ... نیز استفاده کنید.