ما هي الـ Precompiled Queries؟
الـ Precompiled Queries هي استعلامات SQL يتم ترجمتها وتحليلها (Parsing و Optimization) مرة واحدة فقط، ثم يتم حفظ خطة التنفيذ (Execution Plan) الخاصة بها في الذاكرة أو Cache ليتم استخدامها لاحقًا دون إعادة ترجمة أو تحليل.
الهدف من الـ Precompiled Queries
- تحسين الأداء: عن طريق تجنب إعادة تحليل الاستعلام وإنشاء خطة تنفيذ جديدة مع كل استدعاء.
- توفير الموارد: لأن خطوات Parsing و Optimization يمكن أن تكون مكلفة، خاصة مع الاستعلامات المعقدة.
- تسريع التنفيذ: عند استخدام نفس الاستعلام بشكل متكرر مع اختلافات بسيطة (مثل المعاملات أو القيم).
كيفية عمل الـ Precompiled Queries
-
إنشاء الاستعلام:
يتم إنشاء استعلام SQL وتحضيره مسبقًا للتنفيذ. -
ترجمة وتحسين الاستعلام:
يتم تنفيذ مراحل:- Parsing
- Binding
- Optimization
لإنتاج خطة تنفيذ (Execution Plan).
-
حفظ خطة التنفيذ (Caching):
خطة التنفيذ التي تم إنشاؤها يتم حفظها في Cache لاستخدامها مرة أخرى. -
إعادة الاستخدام:
عند استدعاء نفس الاستعلام مرة أخرى، يتم استخدام خطة التنفيذ المحفوظة مباشرة دون المرور بمراحل التحليل والتحسين.
أنواع الـ Precompiled Queries
1. Stored Procedures (الإجراءات المخزنة)
الـ Stored Procedure في SQL Server تعتبر من أشهر الطرق لاستخدام Precompiled Queries.
- يتم إنشاء الاستعلام مرة واحدة فقط.
- يتم حفظ خطة التنفيذ في الذاكرة لاستخدامها عند كل استدعاء.
مثال على Stored Procedure:
CREATE PROCEDURE GetProductsByPrice
@MinPrice DECIMAL
AS
BEGIN
SELECT *
FROM Products
WHERE Price >= @MinPrice;
END;
-
عند تنفيذ الـ Procedure:
EXEC GetProductsByPrice @MinPrice = 100;
يتم استخدام خطة التنفيذ المحفوظة دون إعادة التحليل.
2. Parameterized Queries (الاستعلامات المُعلمة)
الاستعلامات اللي بتستخدم Parameters يمكن أن تستفيد من الـ Precompiled Queries.
مثال في C# باستخدام Entity Framework:
var minPrice = 100;
var products = _dbContext.Products
.Where(p => p.Price >= minPrice)
.ToList();
- في الخلفية، Entity Framework يحول الاستعلام إلى Parameterized Query.
- خطة التنفيذ للاستعلام (مع Parameter) يتم حفظها لاستخدامها لاحقًا.
فوائد الـ Precompiled Queries
-
أداء أسرع:
- يتم تجاوز مراحل التحليل والترجمة في كل مرة يتم استدعاء الاستعلام.
- يتم استخدام خطة التنفيذ المخزنة مباشرة.
-
تقليل استهلاك الموارد:
- يقلل الحمل على محرك قاعدة البيانات من حيث CPU والذاكرة.
-
حماية ضد SQL Injection:
- في حالة استخدام Parameterized Queries، يتم فصل البيانات (Parameters) عن الاستعلام، مما يجعل التطبيق أكثر أمانًا.
متى نستخدم الـ Precompiled Queries؟
- عندما يكون نفس الاستعلام يتم تنفيذه بشكل متكرر مع تغييرات بسيطة في المدخلات (مثل المعاملات أو القيم).
- في السيناريوهات التي تتطلب أداء عالي مثل تطبيقات الويب أو أنظمة الوقت الحقيقي.
- عند استخدام استعلامات معقدة ومكلفة من حيث الأداء.
ملاحظات مهمة
-
اختلاف البيانات أو المتغيرات:
- إذا كانت القيم مختلفة جدًا وتؤثر على خطة التنفيذ، قد يتم إنشاء خطة جديدة (Parameter Sniffing).
-
صيانة الـ Cache:
- إذا زاد عدد الاستعلامات المخزنة، قد يؤدي ذلك إلى زيادة استخدام الذاكرة.
-
في Entity Framework:
- يمكن استخدام EF.CompileQuery لإنشاء Precompiled Queries وتحسين الأداء عند استدعاء نفس الاستعلام بشكل متكرر.
مثال في Entity Framework Core:
using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;
var compiledQuery = EF.CompileQuery((AppDbContext context, decimal price) =>
context.Products.Where(p => p.Price >= price));
using var context = new AppDbContext();
var result = compiledQuery(context, 100);
- في هذا المثال، يتم تحضير الاستعلام مسبقًا (Compile Query) لاستخدامه بكفاءة.
خلاصة
- الـPrecompiled Queries تسهم في تحسين الأداء من خلال حفظ خطة التنفيذ وتجنب إعادة تحليل الاستعلام.
- الـStored Procedures و Parameterized Queries هما أشهر الطرق لتحقيق ذلك.
- في Entity Framework Core، يمكن استخدام
EF.CompileQuery
لإنشاء استعلامات محسنة مسبقًا.