2013-08-23 2 views
1

Я выполняю sql-запрос с использованием PetaPoco, который обычно возвращает около 4000 строк.Медленная производительность при использовании Paged Fetch

Вот код, который строит SQL:

var sql = PetaPoco.Sql.Builder 
.Append("Select ") 
.Append("Participants.ParticipantID") 
.Append("From Participants") 
.Append("Inner Join Organizations") 
.Append("On Participants.OrgID = Organizations.OrgID") 
.Append("Left Join Departments") 
.Append("On Participants.DepartmentID = Departments.DepartmentID") 
.Append("Where") 
.Append("Participants.OrgID = @0", 6328); 
.Append("and Participants.Last_Name like @0", "P%"); 
.Append("and ") 
.Append("Participants.OrgID in ") 
.Append("    (") 
.Append("     Select") 
.Append("      OrgID ") 
.Append("     from ") 
.Append("      Organizations") 
.Append("     Where") 
.Append("      AssociationID = @0", 318) 
.Append("    )"); 

Если я тяну весь набор записей назад и использовать LINQ на страницу результатов, страница отображается примерно 250мс. Вот код:

List<ParticipantVMItem> PagedResult = null; 
    var FullResult = db.Fetch<ParticipantVMItem>(sql); 
    PagedResult = FullResult.Skip((PageNo - 1) * PageSize).Take(PageSize).ToList(); 

Если я пытаюсь использовать функцию подкачки, встроенную в PetaPoco, страница берет на себя 4200ms для визуализации. Вот код:

  List<ParticipantVMItem> PagedResult = null; 
      PagedResult = db.Fetch<ParticipantVMItem>(4, 250, sql); 

Что нечетности Glimpse и Sql Profiler показать мне, что фактические команды SQL, работающие в любом случае занимает приблизительно одинаковую длину времени. Однако Глимпес предполагает, что во втором случае задержка происходит все до открытия соединения. Может ли кто-нибудь объяснить это поведение?

Дополнительная информация: Я бегу Sql Server 2008R2

ответ

2

Существует проблема с регулярным выражением PetaPoco пейджинга. Это обычно становится проблемой для длинных SQL, но другие могут быть затронуты.

Это может быть исправлено путем замены rxOrderBy Regex с

public static Regex rxOrderBy = new Regex(@"\bORDER\s+BY\s+(?:\((?>\((?<depth>)|\)(?<-depth>)|.?)*(?(depth)(?!))\)|‌​[\w\(\)\.\[\]""])+(?:\s+(?:ASC|DESC))?(?:\s*,\s*(?:((?>((?<depth>)|)(?<-depth‌​>)|.?)*(?(depth)(?!)))|[\w()\.[]""])+(?:\s+(?:ASC|DESC))?)*", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.Compiled);

или с помощью NPoco, значительно улучшенную вилку PetaPoco с совместимостью API.

+0

Я обновлю свой вопрос с помощью своего sqlcode. – Aheho

+0

Есть ли у вас такая же проблема с NPoco? Вы можете попробовать? Он использует diff regex. – Schotime

+0

Я выделил этот вопрос на следующий REGEX: \t \t \t public static Regex rxOrderBy = new Regex (@ "\ bORDER \ s + BY \ s + (?!. *? (?: \) | \ S +) AS \ s) (?: \ ((?> \ ((? ) | \) (? <-depth>) |.?) * (? (глубина) (?!)) \) | [\ w \ (\) \ .]) + (?: \ s + (?: ASC | DESC))? (?: \ s *, \ s * (?: \ ((?> \ ((? ) | \) (? <-depth>) | (?) * (? (глубина) (?!)) \) \ [\ w \ (\) \.]) + (?: \ s + (?: ASC | DESC))?) * ", RegexOptions.RightToLeft | RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.Compiled); – Aheho

0

Определенный в решении rxOrderBy дает исключение, поскольку глубина имени группы неизвестна. Какие-нибудь подсказки по этому поводу? Я не очень хорошо разбираюсь в этом вопросе.

Смежные вопросы