Это очень, очень и очень сложная проблема, которую нужно решить в общем виде . Существует один вид программного обеспечения, которое делает это в течение всего дня, и называется он Оптимизатор SQL-запросов : этот фрагмент кода, присутствующий в каждом современном движке SQL, посмотрит на то, что вы хотите (запрос), затем взгляните на индексы, доступные для ваших данных, на селективность доступных индексов, и он должен найти оптимальный способ использовать все это, чтобы получить ваш набор результатов. Просто доказать, что проблема очень сложная, оптимизатор SQL-запросов иногда дает сбой и создает явно неэффективные планы.
Я уверен, что вы не хотите реализовывать полноценный оптимизатор запросов, поэтому вот несколько советов о том, как сделать ваши запросы достаточно быстрыми:
(1) Выберите некоторые поля, которые часто используются в ваших запросах, и настройте для них индексы. Эти поля должны обеспечивать хорошую селективность: не индексируйте по «логическому» значению, вы просто потеряете время на обход сложных структур двоичного поиска, когда вы можете так же быстро (или быстрее) просмотреть весь список!
(2) Для каждого данного запроса выберите ONE отдельный индекс, чтобы предварительно отфильтровать данные и применить все остальные фильтры по одному (без оптимизации).
В вашем примере: создайте индексы в полях "A" и "B". Кажется, что «C» - это функция, которую невозможно проиндексировать. «IsRoot», похоже, возвращает логическое значение, индексирование не стоит.
Структуры данных, которые будут использоваться для ваших данных, полностью зависят от ваших данных. Если производительность критична, внедрите несколько тестов. Если это не критично, просто ваш любимый алгоритм сортировки списка и все готово!