Aracılığıyla paylaş

.Net Core Web API SQL Server T-SQL Sorgusu Neden Yavaş Çalışıyor?

Chingy 0 Saygınlık puanı
2024-03-20T15:05:57.1733333+00:00

.Net 8.0 ortamında geliştirilen bir web api uygulamam var. Client tarafından API başvurusuna yanıt çok geç dönmekte. İlgili controller içerisindeki sorguyu oluşturan context yapısı aşağıdaki gibi;

                    `var devices = await _contextMivo.Devices`
````                                        .Where(x => x.Customerschema == _apiUser.Customerschema)`

`                                        .ToListAsync();`

`                        var deviceIds = devices.Select(d => d.Deviceid).ToList();`

`                        var wakeUpDatas = await _contextMivo.Wakeups`

`                                            .Where(x =>`

`                                                        x.Customerschema == _apiUser.Customerschema &&`

`                                                        deviceIds.Contains(x.Deviceid) &&`

`                                                        x.Dateandtime >= input.StartDate &&`

`                                                        x.Dateandtime <= input.StopDate`

`                                                    )`

`                                            .OrderByDescending(x => x.Dateandtime)`

`                                            .ToListAsync();`

Buradaki işlem sonrasında Visual Studio > Output penceresinde çıkan T-SQL sorgusunu SSMS üzerinden çalıştırdığımda 1 saniye kadar sürede veriler listeleniyor. Fakat bu süre uygulama üzerinden başvurularda 80 saniyelere kadar çıkıyor.   
  
Veri tabanı tablosunda herhangi bir indeksleme vs yok. Ayrıca local makina üzerinde çalışıyorum.  
  
Nedeninin ne olacağı ile ilgili bir fikriniz var mıdır?

Topluluk Merkezi | Soru-Cevap sitesini tartışma | Soru-Cevap'ı kullanmaya başlama
Geliştirici teknolojileri | .NET | Diğer
Geliştirici teknolojileri | ASP.NET | Diğer
Geliştirici teknolojileri | C#
Geliştirici teknolojileri | C#
C dil ailesine kökenleri olan ve bileşen odaklı programlama desteği içeren nesne odaklı ve tür açısından güvenli bir programlama dili.
{count} oy

3 yanıt

Sıralama ölçütü: En yararlı
  1. Yuliyan Emilov (CONVERGYS CORPORATION) 260 Saygınlık puanı Microsoft Harici Personeli
    2024-03-21T14:05:23.4966667+00:00

    Merhaba,

    İndeks oluşturmak performans artırma konusunda size yardımcı olabilir. Ayrıca, SSMS ve uygulamada çalışan sorgurda farklılılar olup olmadığına bir bakabilirsiniz.

    0 yorum Açıklama yok

  2. Emre ARAS 80 Saygınlık puanı Gönüllü Moderatör
    2024-03-25T12:51:34.4233333+00:00

    var devices = await _contextMivo.Devices.toList()

    şeklinde sorguları değiştirip denermisiniz

    0 yorum Açıklama yok

  3. can kucukgultekin 330 Saygınlık puanı
    2025-10-13T19:15:56.3433333+00:00

    this smells like the Contains(deviceIds) round-trip + tracking + big materialization, not the db itself. SSMS is fast cuz you probably ran a simplified sql with ids inlined; EF sends a fat IN (@p0,@p1,...) with lots of params, tracks every row, then sorts + serializes. that combo can easily hit 10–80s on app side even when sql is ~1s.

    do it in one server-side query, no tracking, no intermediate list. something like:

    var wakeUps = await _contextMivo.Wakeups
        .AsNoTracking()
        .Where(w => w.Customerschema == _apiUser.Customerschema
                 && w.Dateandtime >= input.StartDate
                 && w.Dateandtime <= input.StopDate)
        .Join(
            _contextMivo.Devices
                .AsNoTracking()
                .Where(d => d.Customerschema == _apiUser.Customerschema),
            w => w.Deviceid,
            d => d.Deviceid,
            (w, d) => w
        )
        .OrderByDescending(w => w.Dateandtime)
        .ToListAsync();
    
    
    

    if you don’t need all cols, project early to a dto (less json). also make sure the action isn’t returning megabytes uncompressed. if it’s still slow, there’s likely no index on (Customerschema, Deviceid, Dateandtime) so sql has to sort/scan; add at least an index on Wakeups(Dateandtime) + Deviceid later. but i’d try the single query + AsNoTracking() first it usually drops 80s → a few secs (or less)...

    0 yorum Açıklama yok

Yanıtınız

Yanıtlar, soru sahibi tarafından ‘Kabul Edildi’ ve moderatörler tarafından ‘Önerildi’ olarak işaretlenebilir, bu da kullanıcıların yanıtın yazarın sorununu çözdüğünü bilmelerine yardımcı olur.