Я написал небольшое приложение , которое анализирует выражения в абстрактных синтаксических деревьях.Прямо сейчас я использую несколько эвристик для выражения, чтобы решить, как лучше всего оценить запрос.К сожалению, есть примеры, которые делают план запроса крайне плохим.
Я нашел способ убедительно сделать более точные предположения о том, как следует оценивать запросы, но мне нужно сначала поместить свое выражение в CNF или DNFчтобы получить достоверно правильные ответы.Я знаю, что это может привести к потенциально экспоненциальному времени и пространству, но для типичных запросов, которые выполняют мои пользователи, это не проблема.
Теперь, преобразование в CNF или DNF - это то, что я делаю вручную все время, чтобыупростить сложные выражения.(Ну, может быть, не все время , но я знаю, как это сделать, используя, например, законы Деморгана, законы распределения и т. Д.) Однако я не уверен, как начать переводить это в метод, которыйреализуемо как алгоритм.Я посмотрел статьи по оптимизации запросов, и некоторые из них начинаются с «ну, сначала мы помещаем вещи в CNF» или «сначала мы помещаем вещи в DNF», и они, кажется, никогда не объясняют свой метод для достижения этой цели.
С чего мне начать?