簡體   English   中英

Linq Query需要很長時間

[英]Linq Query is taking long time

以下是長期的 -

using (var db = new Agreements_DBEntities())
{

    bool isProfileExist = (from ua in db.UserAgreementDetails
                                     where ua.uID == uID &&
                                           ua.uMailId == uMailId &&
                                           ua.uType == uType &&
                                           ua.UProfile.HasValue && ua.UProfile.Value
                                     select true).Any();
}

以上行bool isProfileExist花了太長時間......它有什么問題?

好吧,我想你可以刪除where子句並直接使用Any (我不確定IQueryable提供程序將如何優化Linq)以及你如何對它進行基准測試但是:

db.UserAgreementDetails.Any(ua => ua.uID == uID &&
                                           ua.uMailId == uMailId &&
                                           ua.uType == uType &&
                                           ua.UProfile.HasValue && ua.UProfile.Value);

即使這樣,你在db中有多少行? 這是第一次執行查詢等。?

首先要做的是檢查生成的實際查詢。 SQLServer Profiler非常適合這種情況,其他數據庫也有其他查詢日志記錄方法。

如果我們將查詢的不必要位簡化為:可能會產生更好的SQL:

bool isProfileExist = db.UserAgreementDetails.Any(
    ua => ua.uID == uID &&
    ua.uMailId == uMailId &&
    ua.uType == uType &&
    ua.UProfile.HasValue &&
    ua.UProfile.Value);

我想這會產生幾乎相同的代碼,但它可能不會,如果查詢提供程序給出了一些奇怪的東西,那值得嘗試。

在那之后,我猜(但不能確定)主要罪魁禍首實際上是數據庫服務器。 檢查是否有一個索引或索引集使這個查詢快速執行。

想法索引可能是覆蓋與uIDuMailIduTypeUProfile相對應的列,或包含其中一些和“擁有”其他列的列。 但是,人們不需要單獨考慮這個查詢,因此您可能會決定對它們使用單​​獨的索引,或者只是覆蓋某些索引的索引:特別是,如果只有少量行具有相同的uID ,那么一個正好應該做的工作的索引,不需要增加插入成本,也可以使更多的其他查詢受益。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM