2014-02-19 7 views
-1

У нас есть довольно сложный запрос, для которого мы разрешаем пользователям использовать ряд предопределенных фильтров. Запрос включает около 20 таблиц, и, как вы можете себе представить, подсчет строк (до пейджинга) в результате, безусловно, является самой медленной частью запроса.Подсчет количества строк в результате динамического запроса

На данный момент я думаю о том, чтобы сделать запрос COUNT динамическим, путем объединения таблиц на основе пользовательских фильтров и, таким образом, сделать запрос COUNT более легким.

Например:

Фильтры не дали:

SELECT 
    COUNT(BaseTable.Id) 
FROM BaseTable 

фильтр на какой-то другой таблице:

SELECT 
    COUNT(BaseTable.Id) 
FROM BaseTable 
JOIN OtherTable ON BaseTable.OtherTableId = OtherTable.Id 
WHERE OtherTable.SomeColumn = 'criterion' 

Хотя концептуально довольно легко понять, и это, возможно, через несколько часов работы, это может становятся немного громоздкими и беспорядочными, особенно учитывая количество задействованных таблиц.

Я думаю, что я не был единственным, кто столкнулся с этой проблемой (или подобной), поэтому мне было интересно, как другие люди подошли к подобным ситуациям. Разве нет еще более элегантного решения?

+0

Но в любом случае вам нужно написать from, join и где для обычного запроса? Если вы регулярно запрашиваете пейджинг, вам просто нужно удержать эту часть. Имеют базу, базу со счетом и базу со страницей. – Paparazzi

+0

Одна из проблем заключается в том, что все таблицы объединены в «обычный» запрос, поэтому DTO может быть заполнен. Таким образом, всегда есть два вопроса: один для части данных и один для части count. В запросе счетчика необязательно должны быть объединены все таблицы, в то время как запрос данных всегда имеет. – Apeiron

+0

Итак, дополнительные таблицы не должны прерывать счет. Если они это сделают, то счет ошибочен. Даже если вы его отделите, должны быть основные части, общие для обоих запросов, или счет неверен. – Paparazzi

ответ

0

Прочтите свой вопрос.
Вы попросили подход к подсчету построения и предложениям выбора.
Это подход к построению этих двух утверждений.
Я использую его, и он не является ни громоздким, ни грязным.
Насколько сложно пройти через построитель запросов и поместить строки в базу, подсчитать или выбрать?
Вам нужно разбить запрос на/join и где/sort.
Операторы select будут независимыми.

StringBuilder sbBaseFromJoin = new StringBuilder(); 
StringBuilder sbBaseWhere = new StringBuilder(); 

StringBuilder sbCountSelect = new StringBuilder(); 
StringBuilder sbCountFromJoin = new StringBuilder(); 
StringBuilder sbCountWhere = new StringBuilder(); 

StringBuilder sbDTOSelect = new StringBuilder(); 
StringBuilder sbDTOFromJoin = new StringBuilder(); 
StringBuilder sbDTOWhereSort = new StringBuilder(); 

пройти через вас текущего построитель запросов и вспыхивают линий

количество = sbCountSelect + sbBaseFromJoin + sbCountFromJoin + sbBaseWhere + sbCountWhere

DTO = sbDTOSelect + sbBaseFromJoin + sbDTOFromJoin + sbBaseWhere + sbDTOWhereSort

PS Если у вас есть соединение, которое не участвует в том, где или выберите и сильно влияет на производительность, вам нужно посмотреть на запрос.

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