У нас есть довольно сложный запрос, для которого мы разрешаем пользователям использовать ряд предопределенных фильтров. Запрос включает около 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'
Хотя концептуально довольно легко понять, и это, возможно, через несколько часов работы, это может становятся немного громоздкими и беспорядочными, особенно учитывая количество задействованных таблиц.
Я думаю, что я не был единственным, кто столкнулся с этой проблемой (или подобной), поэтому мне было интересно, как другие люди подошли к подобным ситуациям. Разве нет еще более элегантного решения?
Но в любом случае вам нужно написать from, join и где для обычного запроса? Если вы регулярно запрашиваете пейджинг, вам просто нужно удержать эту часть. Имеют базу, базу со счетом и базу со страницей. – Paparazzi
Одна из проблем заключается в том, что все таблицы объединены в «обычный» запрос, поэтому DTO может быть заполнен. Таким образом, всегда есть два вопроса: один для части данных и один для части count. В запросе счетчика необязательно должны быть объединены все таблицы, в то время как запрос данных всегда имеет. – Apeiron
Итак, дополнительные таблицы не должны прерывать счет. Если они это сделают, то счет ошибочен. Даже если вы его отделите, должны быть основные части, общие для обоих запросов, или счет неверен. – Paparazzi