Compiled Queries और Performance
EF.CompileQuery, AsNoTracking और Select के साथ projection का उपयोग करके क्वेरी प्रदर्शन बढ़ाएँ।
Compiled Queries और Performance, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
EF Core क्वेरी संकलन
हर बार जब EF Core LINQ क्वेरी चलाता है, तो उसे अभिव्यक्ति ट्री को पार्स करना, उसका SQL में अनुवाद करना और उसे मान्य करना पड़ता है। अक्सर चलने वाले पथों में यह अतिरिक्त लागत बढ़ती जाती है। EF Core इसे कम करने के लिए कई उपकरण उपलब्ध कराता है।
केवल-पठन क्वेरी के लिए AsNoTracking
AsNoTracking() परिवर्तन ट्रैकर में पंजीकरण को छोड़ देता है। केवल-पठन क्वेरी (एपीआई प्रतिक्रियाएँ, रिपोर्ट) के लिए यह सबसे बड़ा और आसानी से मिलने वाला लाभ है — आम तौर पर 2–5 गुना तेज़ और कम मेमोरी उपयोग।
// With tracking (default) — for entities you'll modify
var tracked = await _db.Products.FirstOrDefaultAsync(p => p.Id == 1);
// Without tracking — for read-only
var dto = await _db.Products
.AsNoTracking()
.Where(p => p.IsActive)
.Select(p => new ProductDto { Id = p.Id, Name = p.Name })
.ToListAsync();संकलित क्वेरी
EF.CompileAsyncQuery LINQ क्वेरी को पहले से एक डेलीगेट में संकलित करता है। अनुवाद स्टार्टअप के समय एक बार होता है; इसके बाद की कॉल संकलन चरण को पूरी तरह छोड़ देती हैं।
// Define once, reuse many times
private static readonly Func<AppDbContext, int, Task<Product?>> GetProductById =
EF.CompileAsyncQuery(
(AppDbContext db, int id) =>
db.Products.AsNoTracking().FirstOrDefault(p => p.Id == id));
// Usage
var product = await GetProductById(_db, 42);प्रदर्शन के लिए Select के साथ प्रोजेक्शन
हमेशा केवल उन्हीं फ़ील्ड का प्रोजेक्शन करें जिनकी आपको आवश्यकता है। पूरी इकाई के बजाय DTO चुनने से लाई जाने वाली कॉलम, नेटवर्क पेलोड और GC पर पड़ने वाला दबाव कम होता है।
// Load entire entity (over-fetch)
var all = await _db.Products.ToListAsync();
// Projection: only fetch needed columns
var names = await _db.Products
.AsNoTracking()
.Select(p => new { p.Id, p.Name, p.Price })
.ToListAsync();
// SQL: SELECT Id, Name, Price FROM Productsइंडेक्स संकेत और कच्ची क्वेरी का अनुकूलन
EF Core उन डेटाबेस इंडेक्स का सम्मान करता है जिन्हें आप HasIndex() से कॉन्फ़िगर करते हैं। संयुक्त इंडेक्स, फ़िल्टर किए गए इंडेक्स और शामिल किए गए कॉलम — सभी क्वेरी योजना के प्रदर्शन को प्रभावित करते हैं।
// Configure compound index in OnModelCreating
modelBuilder.Entity<Order>()
.HasIndex(o => new { o.CustomerId, o.Status })
.HasFilter("[Status] = 0") // filtered index
.IncludeProperties(o => o.PlacedAt);
// The query below will use this index efficiently
var pending = await _db.Orders
.AsNoTracking()
.Where(o => o.CustomerId == 5 && o.Status == OrderStatus.Pending)
.ToListAsync();Skip और Take के साथ पृष्ठांकन
बड़े परिणाम-समुच्चयों पर हमेशा पृष्ठांकन करें। Skip और Take का SQL में OFFSET/FETCH में अनुवाद होता है, जिससे हज़ारों पंक्तियाँ मेमोरी में लोड करने से बचा जा सकता है।
int page = 2, pageSize = 25;
var products = await _db.Products
.AsNoTracking()
.Where(p => p.IsActive)
.OrderBy(p => p.Name)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
// SQL: ... ORDER BY Name OFFSET 25 ROWS FETCH NEXT 25 ROWS ONLYकुशलता से गणना करना
रिकॉर्ड की संख्या गिनने के लिए उन्हें लोड करने के बजाय CountAsync() या AnyAsync() का उपयोग करें। जब आपको केवल मौजूदगी जाँचनी हो, तो AnyAsync() COUNT से भी तेज़ होता है।
// Total count for pagination
int totalCount = await _db.Products
.Where(p => p.IsActive)
.CountAsync();
// Existence check — faster than Count > 0
bool hasExpensive = await _db.Products
.AnyAsync(p => p.Price > 1000m);
// SQL: IF EXISTS (SELECT 1 FROM ...) SELECT 1AddRange के साथ बड़ी संख्या में INSERT
एक साथ कई इकाइयाँ जोड़ने के लिए AddRange का उपयोग करें। प्रदाता में MaxBatchSize द्वारा नियंत्रित EF Core INSERT को कम राउंड-ट्रिप में बैच करता है।
var newProducts = Enumerable.Range(1, 1000)
.Select(i => new Product { Name = $"Product {i}", Price = i * 1.5m })
.ToList();
_db.Products.AddRange(newProducts);
await _db.SaveChangesAsync();
// Batched: typically 100-1000 rows per round-tripडेटाबेस फ़ंक्शन के लिए EF.Functions
EF.Functions डेटाबेस-विशिष्ट फ़ंक्शन (LIKE, तिथि के भाग, पूर्ण-पाठ खोज) उपलब्ध कराता है, जिनका EF Core मेमोरी में मूल्यांकन करने के बजाय SQL में अनुवाद करता है।
// LIKE pattern search (SQL-side)
var results = await _db.Products
.Where(p => EF.Functions.Like(p.Name, "%keyboard%"))
.AsNoTracking()
.ToListAsync();
// Date difference (SQL-side)
var recentOrders = await _db.Orders
.Where(o => EF.Functions.DateDiffDay(o.PlacedAt, DateTime.UtcNow) <= 7)
.ToListAsync();धीमी क्वेरी का निदान
तैयार हुई SQL देखने के लिए EF Core की क्वेरी लॉगिंग सक्षम करें। पैरामीटर मान देखने के लिए विकास के दौरान EnableSensitiveDataLogging() का उपयोग करें।
builder.Services.AddDbContext<AppDbContext>(opt =>
opt.UseSqlServer(connStr)
.LogTo(Console.WriteLine, LogLevel.Information)
.EnableSensitiveDataLogging() // dev only!
.EnableDetailedErrors()); // dev only!वास्तविक दुनिया: अनुकूलित सूची एंडपॉइंट
प्रोडक्शन के लिए तैयार सूची एंडपॉइंट अधिकतम प्रदर्शन के लिए AsNoTracking, प्रोजेक्शन, इंडेक्स और पृष्ठांकन को मिलाता है।
app.MapGet("/products", async (
AppDbContext db,
string? search,
int page = 1, int size = 20) =>
{
var query = db.Products
.AsNoTracking()
.Where(p => p.IsActive);
if (!string.IsNullOrEmpty(search))
query = query.Where(p => EF.Functions.Like(p.Name, $"%{search}%"));
var total = await query.CountAsync();
var items = await query
.OrderBy(p => p.Name)
.Skip((page - 1) * size).Take(size)
.Select(p => new { p.Id, p.Name, p.Price })
.ToListAsync();
return Results.Ok(new { total, items });
});त्वरित जाँच
नियमित LINQ क्वेरी की तुलना में EF.CompileAsyncQuery का मुख्य लाभ क्या है?
पुनरावलोकन: संकलित क्वेरी और प्रदर्शन
मुख्य बातें:
AsNoTracking(): केवल-पठन के लिए परिवर्तन ट्रैकर को छोड़ें — सबसे तेज़ आसानी से मिलने वाला लाभEF.CompileAsyncQuery: अक्सर चलने वाली क्वेरी को डेलीगेट में पहले से संकलित करेंSelectके साथ प्रोजेक्शन: केवल आवश्यक कॉलम लाएँ- उचित इंडेक्स (
HasIndex) क्वेरी योजनाओं में बहुत सुधार करते हैं Skip/Takeसे पृष्ठांकन करें; मौजूदगी जाँचने के लिएAnyAsyncका उपयोग करें- धीमी या अप्रत्याशित SQL पकड़ने के लिए विकास के दौरान क्वेरी लॉगिंग सक्षम करें
एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “Compiled Queries और Performance” पाठ निःशुल्क है?
हाँ—“Compiled Queries और Performance” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Compiled Queries और Performance” में मैं क्या सीखूँगा?
EF.CompileQuery, AsNoTracking और Select के साथ projection का उपयोग करके क्वेरी प्रदर्शन बढ़ाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“Compiled Queries और Performance” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Eager, Lazy और Explicit Loading
- Raw SQL, Stored Procedures और Interpolation
- Compiled Queries और Performance
- Global Query Filters और Owned Entities