افزونهی SQL Code Guard
دورههایی رایگان برای دوران کرونا
You do not need to register, or anything, just visit the course and all the videos are available as ‘previews’. You will be able to take the entire course without even giving me any personal information! The courses include:
Integrating SignalR and Angular
Rider 2024.2.6 منتشر شد
SELECT * FROM table1 WHERE OrderDate ='12 Mar 2004' SET @SQL = 'SELECT * FROM table2 WHERE OrderDate = ' + '''' + @Var + '''' EXEC (@SQL)
این نوع مشکلات با بکار گیری ORMها به نحو قابل توجهی کاهش یافتهاست؛ زیرا این نوع واسطها در اغلب موارد، در آخر کار کوئریهایی پارامتری را تولید میکنند.
مشکل کوئریهای غیر پارامتری چیست؟
استفادهی وسیع از کوئریهای غیرپارامتری با SQL Server، مشکلی را پدید میآورد به نام «Cache bloat» یا «کش پُف کرده» و این «پُف» به این معنا است که کش کوئریهای اجرا شدهی بر روی SQL Server بیش از اندازه با Query planهای مختلف حاصل از بررسی نحوهی اجرای بهینهی آنها پر شدهاست. هر کوئری که به SQL Server میرسد، جهت اجرای بهینه، ابتدا پردازش میشود و دستور العملی خاص آن، تهیه و سپس در حافظه کش میشود. وجود این کش به این خاطر است که SQL Server هربار به ازای هر کوئری رسیده، این عملیات پردازشی را تکرار نکند. مشکل از زمانی شروع میشود که SQL Server کوئریهایی را که از نظر یک برنامه نویس مانند هم هستند را به علت عدم استفادهی از پارامترها، یکسان تشخیص نداده و برای هر کدام یک Plan جداگانه را محاسبه و کش میکند. این مساله با حجم بالای کوئریهای رسیده دو مشکل را ایجاد میکند:
الف) مصرف حافظهی بالای SQL Server که گاهی اوقات این حافظهی اختصاص داده شدهی به کش کوئریها به بالای یک گیگابایت نیز میرسد.
ب) CPU Usage بالای سیستم
سیستم قدیمی است؛ امکان تغییر کدها را نداریم.
بدیهی است بهترین راه حلی که در اینجا وجود دارد، پارامتری ارسال کردن کوئریها به SQL Server است تا به ازای هر تغییری در مقادیر آنها، این کوئریها باز هم یکسان به نظر برسند و SQL Server سعی در محاسبهی مجدد Plan آنها نکند. اما ... اگر این امکان را ندارید، خود SQL Server یک چنین قابلیتهایی را به صورت توکار تدارک دیدهاست که باید فعال شوند.
فعال سازی پارامتری کردن خودکار کوئریها در SQL Server
اگر نمیتوانید کدهای یک سیستم قدیمی را تغییر دهید، SQL Server میتواند به صورت خودکار اینکار را برای شما انجام دهد. در این حالت فقط کافی است یکی از دو دستور ذیل را اجرا کنید:
--Forced ALTER DATABASE dbName SET PARAMETERIZATION FORCED --Simple ALTER DATABASE dbName SET PARAMETERIZATION SIMPLE
فعال سازی بهبود کارآیی SQL Server با کوئریهای Ad-Hoc زیاد
به کوئریهای غیرپارامتری، کوئریهای Ad-Hoc نیز گفته میشود. اگر سیستم فعلی شما، تعداد زیادی کوئری Ad-Hoc تولید میکند، میتوان فشار کاری SQL Server را برای این مورد خاص، تنظیم و بهینه سازی کرد.
فعال سازی گزینهی ویژهی «Optimize for Ad hoc Workloads» سبب میشود تا SQL Server پس از مدتی به صورت خودکار کش Plan کوئریهایی را که به ندرت استفاده میشوند، حذف کند. همین مساله سبب آزاد شدن حافظه و بهبود کارآیی کلی سیستم میگردد. همچنین باید درنظر داشت که کش Plan کوئریها نامحدود نیست و سقفی دارد. به همین جهت آزاد شدن آن، کش کردن کوئریهایی را که بیشتر استفاده میشوند، سادهتر میکند.
برای اعمال آن به یک بانک اطلاعاتی خاص، نیاز است دستورات ذیل را اجرا کرد:
use dbName; -- Optimizing for Ad hoc Workloads exec sp_configure 'show advanced options',1; RECONFIGURE; go exec sp_configure 'optimize for ad hoc workloads',1; RECONFIGURE; Go
برای مطالعهی بیشتر
Fixing Cache Bloat Problems With Guide Plans and Forced Parameterization
Optimizing ad-hoc workloads
Optimizing for Ad hoc Workloads
پیاده سازی DbContext مورد نیاز
برای ساخت DbContext میتوان به صورت زیر عمل نمود:
namespace FsWeb.Repositories open System.Data.Entity open FsWeb.Models type FsMvcAppEntities() = inherit DbContext("FsMvcAppExample") do Database.SetInitializer(new CreateDatabaseIfNotExists<FsMvcAppEntities>()) [<DefaultValue()>] val mutable books: IDbSet<Guitar> member x.Books with get() = x.books and set v = x.books <- v
اگر syntax زبان #F برایتان نامفهوم است میتوانید از این دوره کمک بگیرید.
پیاده سازی کلاس BookRepository
ابتدا به کدهای زیر دقت کنید:
namespace FsWeb.Repositories type BooksRepository() = member x.GetAll () = use context = new FsMvcAppEntities() query { for g in context.Books do select g } |> Seq.toList
در بخش بعدی بک کوئری از DbSet مورد نظر گرفته میشود. این روش Query گرفتن در F# 3.0 مطرح شده است. در نتیجه در نسخههای قبلی آن (F# 2.0) اجرای این کوئری باعث خطا میشود. اگر قصد دارید با استفاده از F# 2.0 کوئریهای خود را ایجاد نماید باید به طریق زیر عمل نمایید:
ابتدا از طریق nuget اقدام به نصب package ذیل نمایید:
FSPowerPack.Linq.Community
query <@ seq { for g in context.Books -> g } @> |> Seq.toList
[<HandleError>] type BooksController(repository : BooksRepository) = inherit Controller() new() = new BooksController(BooksRepository()) member this.Index () = repository.GetAll() |> this.View
نکته : تنظیمات مروط به ConnectionString را فراموش نکنید:
<add name="FsMvcAppExample" connectionString="YOUR CONNECTION STRING" providerName="System.Data.SqlClient" />
DECLARE @Test TABLE ( RowID INT IDENTITY, FName VARCHAR(20), Salary SMALLINT ); INSERT INTO @Test (FName, Salary) VALUES ('George', 800), ('Sam', 950), ('Diane', 1100), ('Nicholas', 1250), ('Samuel', 1250), ('Patricia', 1300), ('Brian', 3000), ('Thomas', 1600), ('Fran', 2450), ('Debbie', 2850), ('Mark', 2975), ('James', 3000), ('Cynthia', 3000), ('Christopher', 5000); SELECT RowID,FName,Salary, SumByRows = SUM(Salary) OVER (ORDER BY Salary ROWS UNBOUNDED PRECEDING), SumByRange = SUM(Salary) OVER (ORDER BY Salary RANGE UNBOUNDED PRECEDING) FROM @Test ORDER BY RowID;
آموزش JavaScript توسط Bob Tabor
NOTE: This popular course was recently updated with all new videos and content. Check it out!
01 | IntroductionGet an introduction from Bob, as he kicks off the course, sets expectations, and gives you a little guidance for the road ahead.
02 | Setting Up the Development Environment
03 | Basic JavaScript Syntax
04 | Variables
05 | Data Types
06 | Type Coercion and Conversion
07 | Expressions and Operators
08 | Arrays
09 | Function Declaration
10 | Function Expressions
11 | Decision Statements
12 | Iteration Statements
13 | Basics of Scope
14 | Returning Functions from Functions
15 | Object Literals
16 | Module Pattern and Revealing Module Pattern
17 | Closures
18 | this Keyword
19 | Destructuring
20 | String Template Literals
21 | Regular Expressions
22 | Built-In Natives
23 | Constructor Function Calls with the new Keyword
24 | Objects and the Prototype Chain
25 | JavaScript Classes
26 | Arrow Functions
27 | Truthy and Falsy Values
28 | null Type
29 | Date Objects
30 | String Methods
31 | Array Methods
32 | Error Handling with Try Catch
33 | Understanding the Document Object Model
34 | Working with DOM Nodes
35 | Course Conclusion