مفهوم Logical Query Processing در SQL SERVER

مفهوم Logical Query Processing در SQL SERVER

نوشته شده توسط: تیم فنی نیک آموز
۰۶ آذر ۱۴۰۰
زمان مطالعه: 10 دقیقه
۲
(۱)

مقدمه

شاید جالب باشه که با این مقدمه شروع کنیم که تعریف فرآیند چیست و متشکل از چه اجزایی هست؟ یک فرآیند در چه زمانی می تواند بهترین خروجی رو به شما بدهد و این که باید از چه بخش‌ هایی تشکیل شده باشد و حتی چه قوانینی باید برای آن تعریف شود که کلیه این اجزا در این فرایند خروجی مطلوب رو ارائه بدهند و در نهایت حاصل این کار نتیجه خوبی داشته باشد. می خواهیم با چند تا مثال که شاید برای همه ما خیلی ملموس و واقعی باشه این موضوع رو مقداری موشکافی کنیم.

دوره کوئری نویسی نیک آموز

یک باغبان رو در نظر بگیرید که با گونه ‌های مختفی از گیاهان و درختان سروکار دارد، هر کدام از این درختان و گیاهان، ممکن است، در شرایط مختلفی نگهداری شوند. همچنین درختی ممکن است تا یک متر رشد کند و سپس ادامه این فرایند رشد، به شکل دیگری انجام شود یا درختی هم تا چندین سال، به رشد خود ادامه دهد و یا در فصل ‌های مختلفی از سال به شیوه‌ های مختفلی این فرایند متوقف شود و یا شکل ان عوض شود. همین فرآیند را می ‌توانیم در مورد کسوف و خسوف هم مشاهده کنیم که طبق یک سری قوانین و شرایطی که از پیش تعریف شده است، در فازهای مختلف قبل و بعد و زمان خسوف می‌ توانیم خروجی ‌های مختلف این فرایند را مشاهده کنیم. پس اگر دقت کنید، در هر مرحله اجزایی در این فرآیند شرکت می‌ کنند که بر روی نتیجه فعلی تاثیراتی اعمال کرده و سپس از صحنه ممکن است خارج شوند یا به شکل دیگری، تاثیر خود را در مراحل دیگر بگذارند. در سناریو اول باغبان این فرآیند ها را به درستی می شناسد و با انواع و اقسام گونه های گیاهی و درختان مختلف به خوبی آشنایی داشته و طی یک فرایند این مراحل رشد را برای درخت یا گیاه مورد نظرش زیر نظر دارد. در فرآیند دوم هم سلسله عواملی محیطی با اولویت های مشخص و از پیش تعریف شده منجر به این پدیده زیبا خواهند شد.این موضوع به عنوان پیش زمینه ایی بود که با یک اصلاح تخصصی آشنا بشویم و آن مفهوم Logical Query Processing Phases یا اجرای منطقی فازهای اجرایی هست. در واقع فازهای اجرایی برای این عنوان می ‌شود که اسکریپت اجرایی شما عملیاتی شده و خروجی نهایی رو نمایش دهد. در رابطه با این موضوع که که این منطق به چه شکل هست در ادامه مقاله به معرفی جزییات و بخش‌ های مختلف آن خواهیم پرداخت.
اگر اسکریپت زیر را بررسی و تحلیل کنیم متوجه می‌شویم که چندین عبارت کلیدی در این کوئری استفاده شده که بتوانیم مطابق با درخواستی که به ما اعلام شده است خروجی کار را استخراج کنیم. به صورت خلاصه اسکریپت زیر این خروجی را به ما ارائه می ‌کند که ۱۰ نفر از پر سودترین بازاریاب ‌های فروش شرکت را بتوانیم از دیتایی که داریم استخراج کنیم. ذکر این نکته لازم هست که بدانیم در یک فرایند فروش، اجزا و المان ‌های مختلفی برای تحلیل می ‌توانیم داشته باشیم. نظیر موارد زیر:

  • کالا ها
  • گروه کالا
  • بازاریاب های فروش
  • وسایل حمل و نقل
  • شهر ها و مناطق طبقه بندی شده فروش

که تمرکز این کوئری بر روی تحلیل این موارد هست که بتوانیم با تحلیل ساده ایی بر روی عملکرد فروشنده ها یا بازاریاب های فروش به این هدف دست پیدا کنیم که به عنوان مثال در بحث پورسانت یا ارتقا شغلی به سمت های بالاتر برای این فروشنده ها به چه شکل این اطلاعات را تحلیل کنیم .

SELECT *
FROM   (
           SELECT DISTINCT TOP 10 s.[Salesperson Key] AS Salesperson,
                  SUM(s.profit) AS profit
           FROM   fact.Sale s
                  INNER JOIN fact.Sale s1
                       ON  s1.[sale key] = s.[Sale Key]
                  INNER JOIN Dimension.Employee e
                       ON  s.[Salesperson Key] = e.[Employee Key]
           WHERE  e.[Is Salesperson] = 1
           GROUP BY
                  s. [Salesperson Key]
           ORDER BY
                  Salesperson
       ) A
ORDER BY
       A.[Salesperson]
       OFFSET 7 ROWS;

معمولا نوع خواندن این مدل اسکریپت ‌ها از SELECT شروع می‌ شود و به سمت پایین اسکریپت، مرحله به مرحله، شرط‌ ها یا گروه‌بندی‌ های مختلف بر روی نتیجه نهایی اعمال می‌ شود. ولی با این دید و نوع نگرشی که ما داریم Engine با این منطق این کوئری را پردازش نمی‌ کند. در اینجاست که باید بررسی کنیم اولویت اجرای این کوئری با کدام کلمه کلیدی شروع شده و به چه شکل قرار هست این کوئری تحلیل شود. اگر با یک دید بالا به پایین به این قضیه نگاه کنیم، سبک نوشتن و توسعه کوئری‌ ها به این صورت هست که ممکن یک سری از عبارت حتما نیاز هست ذکر شود و تعدادی از آن ‌ها بسته به سناریو و تحلیلی که داریم نیاز می‌ شود که استفاده شود. این ساختار به شکل زیر است:

SELECT
DISTINCT
TOP <select_list>
FROM <left_table>
join  <Join type>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
WITH {CUBE | ROLLUP}
HAVING <having_condition>
ORDER BY <order_by_list>

اگر بخواهیم با منطقی که SQL SERVER برای اجرای Query ‌ها پیاده‌ سازی می ‌کند اشنا شویم، نیاز هست که حتما مدل ذهنی و پیش فرض خودمان را عوض کرده و با به عبارتی همانند Engine فکر کنیم به این شکل باید این ساختار را یاد بگیریم:

(۸) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(۱) FROM <left_table>
(۳) <join_type> JOIN <right_table>
(۲) ON <join_condition>
(۴) WHERE <where_condition>
(۵) GROUP BY <group_by_list>
(۶) WITH {CUBE | ROLLUP}
(۷) HAVING <having_condition>
(۱۰) ORDER BY <order_by_list>

شماره‌ هایی که در ابتدای هر خط نوشته شده است، مطابق با سبکی رایج کوئری ‌نویسی در نظر گرفته شده. در واقع اولویت اجرای هر فاز را برای ما مشخص می‌ کند. کوئری شما هر چه قدر که تو در تو نوشته شده باشد و Select‌های مختلفی در ابتدای آن باشد، تا زمانی که دیتا سورس یا مخزن کلی اطلاعات را پیدا نکند به این جستجو ادامه می ‌دهد. یعنی FROM کوئری شما در اولین قدم باید پردازش شود و اطلاعات لازم برداشته شود. در مرحله بعد اگر در کوئری از یک نوع خاصی از  Join ها استفاده شده باشد، نوبت به اجرای این فاز می‌ رسد که اطلاعات این جداول ترکیب شود.و برای پیدا کردن ستون ‌ها یا اطلاعات دیگر این ارتباط، حاصل شود. در این جا نمی ‌خواهیم که انواع Join ‌ها را بررسی کنیم. فقط به این نکته دقت داشته باشید که منطق این موضوع را به خوبی متوجه شوید. به همین ترتیب هر چه قدر Join‌های مختلفی در این قسمت نوشته شده باشد، این ارتباطات توسط شرط‌ هایی که در قسمت On اعمال می ‌شود، می ‌توانند با سایر جداول ارتباط گیرند. خب تا این مرحله ما با کلی جدول ارتباط گرفتیم که قرار هست که فیلتر‌هایی بر روی خروجی این مرحله اعمال کنیم. در مرحله بعد در صورتی که قرار هست

کوئری ‌های تحلیلی بنویسیم از عبارت ‌های کلیدی Group By و اعمال شرط ‌های آن استفاده می‌کنیم. سپس Engine به اولین سطر از کوئری شما رفته و تعداد رکورد‌های مد نظر را جهت نمایش ارایه خواهدکرد .. سپس این خروجی به اخرین سطر کوئری ارجاع داده شده تا مرتب ‌سازی ان انجام شده و در مرحله اخر هم مجدد به اولین خط رجوع می‌ شود که مقادیر تکراری این اطلاعات به کاربر نمایش داده نشود. پس ذکر این نکته بسیار حائز اهمیت هست که حتما شماره هایی که در ساختار بالا مشاهده می کنید را به خوبی یاد گرفته که در چرخه اجرای این فرایند دقیقا بتوانید تحلیل های خود را از کوئری های نوشته شده به خوبی ارایه دهید .
*** به طور کلی قاعده Logical Query Processing یا LQP به این موضوع اشاره می ‌کند که رعایت حق تقدم و تاخر در اجرا تمامی این فرآیند‌ها مطابق با یک قانون مشخص و با اولویت های خاص در نظر گرفته شده است.
تمامی این فرایند ها در واقع در SQL Server  تحت عنوان مرحله Parsing  شناخته می شود که اولویت استفاده از این کلمات و درست استفاده شدن از آنها رعایت شده باشد . این مثال رو مشاهده کنید

SELECT ID,
(Salary * 12) AS YearlySalary
FROM   Employee
WHERE  YearlySalary > 10000;

اگر مطابق با منطقی که توضیح داده شد، این کوئری را اجرا کنید، شاهد خطای زیر خواهید بود :

Invalid column name ‘YearlySalary’.

این خطا دقیقا نشان می‌ دهد که اولا، کوئری شما از جدول Employee شروع به جمع آوری داده می‌ کند و در مرحله بعد باید مطابق با منطق Lgoical Query Processing باید به قسمت Where رفته و این خط را اجرا کند. ولی همان طور که مشاهده کردید، در این قسمت از الیاسی استفاده شده که هنوز در قسمت مورد نظر، پردازش نشده SQL Server در جریان نیست که همچین الیاسی در کد به کار رفته که منظور همان YearlySalary هست. لذا تسلط بر این منطق، باعث می ‌شود، زمانی که یک کوئری بسیار بزرگ را مشاهده کردید، بتوانید به راحتی تحلیل کنید که اولا چه اطلاعاتی از چه جداولی استخراج می ‌شود و ثانیا این که در مرحله بعد قرار است چه فیلتر‌هایی بر روی این کوئری اعمال شود و به چه سبک گروه‌ بندی ‌های آن انجام و نتیجه نهایی مشخص شود. همچنین خطایابی و متوجه شدن منطق کوئری های بزرگ با این تکنیک که خدمت شما ارائه شد به راحتی قابل استخراج است . برای آشنایی با جزییات این موضوع می‌ توانید به کتاب اقای Itzik Ben-Gan که با عنوان T-SQL Querying منتشر شده است مراجعه کنید و با چارت اجرایی این فرایند بیشتر آشنا شوید

چه رتبه ای می‌دهید؟

میانگین ۲ / ۵. از مجموع ۱

اولین نفر باش

title sign
دانلود مقاله
مفهوم Logical Query Processing در SQL SERVER
فرمت PDF
7 صفحه
حجم 1 مگابایت
دانلود مقاله
title sign
معرفی نویسنده
تیم فنی نیک آموز
مقالات
236 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
تیم فنی نیک آموز
پروفایل نویسنده
title sign
دیدگاه کاربران

ثبت نام رایگان در همایش Tehran .NET Conf 2023 ، همین الان کلیک کنید
ثبت نام رایگان..
close-image