
یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شیگرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفهای و امکانات کامل!
مشاهده بیشتر
تو این دوره 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> |
در حالیکه این یک مورد افراطی نمی باشد ممکن است متوجه شوید که روش مکان نما شروع به تنزل در ردیف های رو به رشد می کند. به طور کل در تولید کد از مکان نماها اجتناب می کنم، مگر تحت شرایط خاص.