Во-первых, этот запрос будет выглядеть и работать лучше, если вы используете объединения:
SELECT *
FROM
app_event._event_view EV
INNER JOIN app_event.calendar C
ON EV.calendar_id = C.calendar.id
INNER JOIN app_event._ical_class IC
ON C.class_id = EV.class_id
WHERE
C.is_personal = 't'
AND C.name = 'personal'
AND state_id IN (1,2,3,4,5,6)
AND EXTRACT(year FROM dtstart) = '2008'
AND EXTRACT(month FROM dtstart) = '11'
AND (
IC.name = 'PUBLIC' -- other two are redundant
OR user_id = '1'
)
Это хорошее начало для снижения сложности. Затем, если вы хотите добавить дополнительные фильтры непосредственно в SQL, вы можете добавить еще операторы «И ...» в конце. Поскольку все критерии связаны с AND (ИЛИ безопасно содержится в скобках), нет никакой возможности добавить после них критерий, который каким-либо образом отменяет вышеприведенные, то есть, если вы ограничили результаты одной частью предложение, вы не можете «ограничить» его более поздним предложением, если оно связано с AND. (Конечно, если эти дополнительные пункты находятся рядом с пользовательским вводом текста, их необходимо санировать, чтобы предотвратить атаки с использованием SQL-инъекций.)
База данных может фильтровать быстрее, чем любой другой уровень, в общем, потому что использование предложения WHERE для базы данных часто позволяет базе данных избегать даже чтения ненужных записей с диска, что на несколько порядков медленнее, чем все, что вы можно сделать с процессором. Сортировка часто выполняется также быстрее в БД, потому что БД часто может выполнять объединения таким образом, что записи уже отсортированы в том порядке, в котором вы их хотите. Таким образом, с точки зрения производительности, если вы можете сделать это на БД, тем лучше.
Вы сказали, что производительность на самом деле не является ключевым моментом, поэтому добавление фильтров с программной точки зрения в бизнес-логику может быть вам полезно, и их легче читать, чем возиться со строками SQL.