ورود ثبت نام

ورود به حساب کاربری

نام کاربری *
رمز ورود *

ایجاد حساب کاربری

گزینه های * دار الزامی می باشند.
نام *
نام کاربری *
رمز ورود *
تائیدیه رمز ورود *
نشانی پست الکترونیک *
تائیدیه پست الکترونیک *

باورهای غلط در SQL SERVER - مقدمه

معمولاً به عنوان یک مهندس نرم افزار و یا برنامه نویس، ابتدا با یک یا چند زبان برنامه نویسی آشنا شده و سپس اقدام به فراگیری پایگاه داده و sql server می کنیم. به عبارتی دیگر بسیاری از قوانین برنامه نویسی و تجارب کدنویسی را در sql server نیز استفاده کرده و این امر باعث بوجود آمدن مشکلاتی چون کاهش کارایی و در برخی موارد ایجاد خطای زمان اجرا خواهد شد. اولین نکته ای که باید به آن توجه داشته باشیم این است که زبان های برنامه نویسی و SQL تفاوت های زیادی با یکدیگر دارند به عنوان مهمترین تفاوت لازم است بدانیم که زبان های برنامه نویسی بر اساس نیازها توسعه داده می شوند و از آنجایی که نیازهای ما دائماً دستخوش تغییرات هستند، زبان های برنامه نویسی نیز با سرعت زیادی تغییر می کنند و بعضاً یک زبان برنامه نویسیِ جدید اکثر مباحث بنیادی زبان قبلی را متحول می کند اما SQL یک زبان بر مبنای ریاضیات است و دستخوش تغییراتی مانند زبان های برنامه نویسی نمی شود.

به طور کلی باورهای غلط در SQL SERVER به دو دسته تقسیم می شوند:

دسته اول آنهایی هستند که برنامه نویسان به علت عادت کردن به دید procedural، این سبکِ توسعه را به sql server نیز منتقل می کنند. مثلاً از آنجایی که در کدنویسی یک برنامه دائماً با شرط و حلقه در نوشتن کدها سر و کار داریم ممکن است با شروع کار با دیتابیس و زبان sql استفاده از حلقه و تکرار را نیز ادامه بدهند. می دانیم که انجین sql server برای کار با مجموعه ها ایجاد و بهینه سازی شده است و در صورت انجام عملیات در هر لحظه بر روی یک رکورد کارایی مناسبی نخواهد داشت.

دومین دسته از باورهای غلط در sql server به دلیل عدم شناخت پایه و اصول زبان sql است. همانطور که اشاره شد اساس زبان sql بر ریاضیات و قوانین آن یعنی set theory و predicate logic بنا شده است و عدم آگاهی از این قوانین مشکلاتی مانند: افت کارایی و بدتر از همه ایجاد خطا در زمان اجرا را ایجاد خواهد کرد.

در مجموعه آموزشی باورهای غلط در SQL SERVER به هر یک از این دسته باورها می پردازیم. سعی بر این است که در انتهای هر مطلب، لینکی به ویدئو آموزشی آن نیز داده شود.

دانلود فیلم آموزش باورهای غلط در sql server - قسمت اول


باورهای غلط در SQL SERVER - قسمت اول (حلقه و تکرار)

تفاوت دو دیدگاه Procedural approaches و Set based approaches:

دیدگاه اول یعنی Procedural در زبان های برنامه نویسی وجود دارد به این صورت که در ابتدا باید تعیین کنیم که چه عملیات یا کاری را می خواهیم انجام دهیم(what) سپس نحوه انجام آن کار را نیز مشخص می کنیم(How). دقیقاً مانند آنچه در طراحی یک الگوریتم و یا فلوچارت انجام می شود:

اما در دیدگاه Set base تنها نوع عملیات را مشخص می کنیم(What) و نحوه انجام دادن آن(How) بر عهده ما نیست. به عنوان مثال برای جوین دو جدول در sql server، تنها از عملگر join بین این دو جدول استفاده می کنیم و چگونه انجام شدن این عملیات(hash match، inner join، nested loops) بر عهده optimizer است.        

sql-server-misunderstanding-set-base-approache

به عنوان اولین مورد باورهای غلط در SQL SERVER  عملیاتی که نیاز به حلقه و تکرار دارد را با هر یک از رویکردهای Procedural  و  set base طراحی می کنیم. در اینجا از یک مثال ساده جهت اضافه کردن یک واحد به مقدار موجود در یک متغیر و تکرار آن به تعداد 10میلیون مرتبه استفاده کرده و این عملیات را در زبان #c و sql پیاده سازی و زمان اجرای آن ها را مقایسه می کنیم. جهت پیاده سازی این مثال در sql server اسکریپت زیر را طراحی کرده ایم:

DECLARE @i INT = 0, --تعریف متغییر
@Time DATETIME = GETDATE()--ذخیره زمان شروع 

--------------------ایجاد حلقه جهت پردازش یک رکورد در هر لحظه-------------------------------
WHILE @i < 10000000 --اضافه کردن یک واحد به متغییر به تعداد 10 میلیون مرتبه                 -|
BEGIN                                                                                         -- |
  SET @i += 1;                                                                                -- |
END                                                                                           -- |
-------------------------------------------------------------------------------------------------
 
--محاسبه زمان صرف شده
SELECT [MM:SS:MS] = CAST((DATEDIFF(MINUTE, @Time, GETDATE()) % 60) AS VARCHAR) + ':' + --دقیقه
                   CAST((DATEDIFF(SECOND, @Time, GETDATE()) % 60) AS VARCHAR)  + ':' +--ثانیه
	               CAST((DATEDIFF(MILLISECOND, @Time, GETDATE())  % 1000) AS VARCHAR) --میلی ثانیه

خروجی اجرای اسکریپت بالا در شکل زیر نمایش داده شده است:

sql-server-misunderstanding-row-by-row-sql

به منظور پیاده سازی این مثال با رویکرد برنامه نویسی(Procedural) از حلقه زیر استفاده می کنیم:

for (int i = 0; i < 10000000; i++)//افزایش یک واحدی به تعداد 10 میلیون               
             { i += 1; }

زمان اجرای حلقه فوق:

sql-server-misunderstanding-row-by-row-c-sharp

همانطور که مشاهده می کنید زمان لازم جهت اجرای عملیات در زبان #c برابر با 24میلی ثانیه است در حالیکه انجام همین عملیات در sql به 6ثانیه و 300 میلی ثانیه زمان نیاز دارد و دلیل اصلی چنین اختلاف زمانی این است که زبان sql جهت کار بر روی مجموعه رکوردها(set) طراحی شده است و در صورت استفاده از آن برای انجام عملیات بر روی یک رکورد در لحظه، کارایی آن به شدت کاهش پیدا می کند.

در مثال بالا، مقایسه ای از پیاده سازی یک مثال با دو رویکرد Procedural  و  set base را دیدیم. اما در مثال های واقعی و روزمره که در sql server پیاده سازی می کنیم، استفاده از cursor معادل با نوشتن حلقه و تکرار در زبان sql است. به عبارتی دیگر در صورتیکه برای طراحی یک کوئری از cursor استفاده کنیم در واقع به optimizer می گوییم که در هر لحظه، عملیات مورد نظر ما را بر روی یک رکورد انجام بدهد.

در اسکریپت زیر، قصد داریم مقدار فید color در رکوردهایی از جدول  Product که دارای Weight=3 هستند را به Blue تغییر دهیم. این عملیات را می توانیم با یک دستور update ساده به صورت set base انجام دهیم و یا با استفاده از cursor و با رویکرد Procedural:

--Row By Row Operation
--Procedural رویکرد 
BEGIN TRANSACTION
DECLARE @Name NVARCHAR(50) ,
    @Color NVARCHAR(15) ,
    @Weight DECIMAL(8, 2) 
DECLARE BigUpdate CURSOR
FOR SELECT  p.[Name]
,p.Color
,p.[Weight]
FROM    Production.Product AS p ;
OPEN BigUpdate ;
 
FETCH NEXT FROM BigUpdate INTO @Name, @Color, @Weight ;
 
WHILE @@FETCH_STATUS = 0 
    BEGIN
        IF @Weight=3
            BEGIN
                UPDATE  Production.Product
                SET     Color = 'Blue'
                WHERE CURRENT OF BigUpdate
            END
 
        FETCH NEXT FROM BigUpdate INTO @Name, @Color, @Weight ;
 
    END
CLOSE BigUpdate ;
DEALLOCATE BigUpdate ;
 
SELECT  *
FROM    Production.Product AS p
WHERE   Color = 'Blue' ;
 
ROLLBACK TRANSACTION

--Rowset Operation
--set base رویکرد 
BEGIN TRANSACTION
         
UPDATE  Production.Product
SET     Color = 'BLUE'
WHERE   [Weight] =3 ;
 
ROLLBACK TRANSACTION

اسکریپت بالا را بر روی دیتابیس AdventureWorks اجرا و زمان اجرای هر یک از روش ها را با یکدیگر مقایسه کنید.

دو مثال بالا جهت آشنایی و درک تفاوت این دو رویکرد ارائه شدند و کاملاً مشخص است که مثلاً برای بروزرسانی رکوردهایی با Weight=3 از update استفاده می کنیم و نه از کرسر. اما کوئری هایی وجود دارند که طراحی آن ها کاملاً وابسته به تجربه، مهارت و رویکرد طراح آن ها دارد. برای مشاهده یک نمونه از این کوئری، آموزش ارزیابی کارایی WINDOW FUNCTIONS را مطالعه و تفاوت رویکرد Procedural  و  set base در محاسبه running total را مشاهده کنید.


 باورهای غلط در SQL SERVER - نتیجه گیری

در این آموزش در ابتدا اشاره کردیم که باورهای غلط در sql server یا به دلیل انتقال برخی رویکرهای برنامه نویسی به زبان sql رخ می دهند و یا اینکه به دلیل عدم شناخت اصول و مفاهیم زبان sql ایجاد می شوند و در ادامه به عنوان اولین باور غط در sql server به استفاده از حلقه و تکرار در sql server اشاره شد:

sql-server-misunderstanding-procedural-vs-set-base

در آموزش بعدی از این مجموعه، به یکی دیگر از باورهای غلط در SQL SERVER که با دید برنامه نویسی به sql server منتقل شده است و می تواند منجر به ایجاد خطای زمان اجرا شود می پردازیم.

دانلود فیلم آموزش باورهای غلط در sql server - قسمت اول

نوشتن دیدگاه


تصویر امنیتی
تصویر امنیتی جدید