آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

Querying در مجموعه ها

دوره های مرتبط با این مقاله

Querying در مجموعه ها

زبان برنامه نویسی T-SQL زبان اظهاری (declarative language) می باشد، یک زبان مجموعه محور. این به چه معناست؟ شما یک query را برای نتایجی که می خواهید منتشر می کنید، و موتور دیتابیس روی حزئیات مربوط به چگونگی برآورده ساختن تقاضا، سخت کار می کند. توسعه دهنده هایی که کلا با query های اظهاری آشنا نیستند، معمولا به سمت لوپ کردن مکانیزم ها پیش می روند، به عنوان مثال مکان نماهایی (cursor) که داده های یک سطر را در یک زمان بازیابی می کنند، منجر به ناکارآمدی در query می شوند.

توضیحات

منطق مکان نما یک کشنده ی عملکرد متداول می باشد که در هنگام عیب یابی مسائل دیتابیس با آن روبرو شدم. اگر یک مکان نما با ردیف های کمتری در حال کار می باشد، ممکن است خود را به عنوان یک موضوع مطرح نکند. همواره شما کار خود را با مجموعه های بزرگی از داده تمام خواهید کرد و در این هنگام است که مشاهده می کنید منطق مکان نما شروع به ایجاد مشکل می کند. زمانی باید برچسب تبدیل (conversion script ) را برای یک مشتری عیب یابی می کردم که با داده هایی از سه جدول مرتبط کار می کرد. برچسب اولین جدول را با یک مکان نما پردازش کرد و به دنبال ورودی های مرتبط در جدول دوم بود که آن جدول نیز از طریق مکان نما لوپ شده بود و با یک جدول سوم دنبال می شد که آن نیز با استفاده از یک مکان نما قابل دسترسی بود. تعداد کل ردیف ها برای پردازش 120000 و زمان کل اجرا سه روز ( تنها من می دانستم زیرا یک کنجکاوی شدید برای دانستن داشتم، بنابراین به برچسب اجازه اجرا تا تکمیل شدن را دادم.) بود و دوباره آن را به یک دقیقه تغییر دادم. نیاز به بیان آن نیست که مشتری چقدر خوشحال بود.

اجازه بدهید مثالی را امتحان کنیم. در مثال زیر برنامه ی ذخیره شده برای گرفتن برخی اطلاعات در مورد گرفتن یک ترتیب در AdventureWorks استفاده می شود. این مثال از یک query مجموعه محور برای بازیابی نتایج استفاده می کند.

set statistics time on
go
create procedure GetOrderData @SalesOrderID int
as
begin
‎ set nocount on
‎ ‎
‎ select OH.OrderDate, OH.DueDate, OH.ShipDate, D.ProductID, P.Name
‎ from Sales.SalesOrderHeader as OH
‎ inner join Sales.SalesOrderDetail as D on D.SalesOrderID = OH.SalesOrderID
‎ inner join Production.Product as P on P.ProductID = D.ProductID
‎ where OH.SalesOrderID = @SalesOrderID
end
go
exec GetOrderData @SalesOrderID = 51721‎
go

اجرای نتیجه به شدت موثر می باشد، تمام 72 ردیف را برای مجموعه ی نتیجه ظرف حدود 5 میلی ثانیه گزارش می دهد.

SQL Server Execution Times:‎
‎   CPU time = 0 ms,  elapsed time = 5 ms.‎

اکنون اجازه بدهید این برنامه را برای بازیابی همان نتایج با استفاده از مکان نما مجددا بنویسیم تا اینکه در محدوده ی ردیف های مربوط به جزئیات سفارش فروش و بررسی تفاوت ها قرار بگیریم.

set statistics time on
go
alter procedure GetOrderData @SalesOrderID int
as
begin
‎ set nocount on
‎ ‎
‎ declare @OrderDate datetime
‎ declare @DueDate datetime
‎ declare @ShipDate datetime
‎ declare @ProductID int
‎ declare @Name nvarchar(50)‎
‎ select @OrderDate = OrderDate,‎
‎            @DueDate = DueDate,‎
‎            @ShipDate = ShipDate
‎ from Sales.SalesOrderHeader
‎ where SalesOrderID = @SalesOrderID
‎ declare DetailCursor
‎ cursor for
‎ (‎
‎  select ProductID
‎  from Sales.SalesOrderDetail
‎  where SalesOrderID = @SalesOrderID
‎ )‎
‎   ‎
‎ open DetailCursor
‎ fetch DetailCursor into @ProductID
‎ while @@FETCH_STATUS = 0‎
‎ begin
‎  select @Name = Name
‎  from Production.Product
‎  where ProductID = @ProductID
‎  ‎
‎  select @OrderDate as OrderDate, ‎
‎    @DueDate as DueDate, ‎
‎    @ShipDate as ShipDate, ‎
‎    @ProductID as ProductID,‎
‎    @Name as Name
‎    ‎
‎  fetch next from DetailCursor into @ProductID
‎ end
‎ close DetailCursor;‎
‎ deallocate DetailCursor;‎
end
go
exec GetOrderData @SalesOrderID = 51721‎
go

دیدگاه مکان نما در این برنامه ی ذخیره شده، زمان بیشتری برای ایجاد همان نتیجه در مورد query می گیرد.

SQL Server Execution Times:‎
‎   CPU time = 15 ms,  elapsed time = 1886 ms.‎

در حالیکه این یک مورد افراطی نمی باشد ممکن است متوجه شوید که روش مکان نما شروع به تنزل در ردیف های رو به رشد می کند. به طور کل در تولید کد از مکان نماها اجتناب می کنم، مگر تحت شرایط خاص.

  • 2506
  •    610
  • تاریخ ارسال :   1394/07/27

دانلود PDF دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .