یه تابستون متفاوت با یه تصمیم هوشمندانه! دوره هوش مصنوعی با تخفیف ویژه، فقط با کد AI84 دوره هوش مصنوعی با تخفیف ویژه، فقط با کد AI84
🎯 ثبت نام
بستن تبلیغات
تسلط کامل بر سی‌شارپ با یک دوره پروژه‌محور

یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شی‌گرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفه‌ای و امکانات کامل!

مشاهده بیشتر
SQL Server رو حرفه‌ای یاد بگیر

تو این دوره SQL Server رو از صفر تا پیشرفته یاد می‌گیری! از تراکنش‌ها و طراحی دیتابیس تا Query نویسی حرفه‌ای و پروژه‌های واقعی مثل مدیریت فروش و سیستم مالی. همه چی رو با مثال و تمرین یاد می‌گیری و یه متخصص دیتابیس می‌شی!

مشاهده بیشتر

Querying در مجموعه ها

Querying در مجموعه ها

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

توضیحات

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
<button></button>

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

1
2
3
SQL Server Execution Times:‎
‎   CPU time = 0 ms,  elapsed time = 5 ms.‎
<button></button>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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
<button></button>

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

1
2
3
SQL Server Execution Times:‎
‎   CPU time = 15 ms,  elapsed time = 1886 ms.‎
<button></button>

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

1394/07/27 5360 1668
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...