Я хочу написать систему для материализации частичных наборов данных, которые повторяются в рабочей нагрузке хранилища, поэтому дорогостоящие и общие вычисления вычисляются только один раз, и все последующие запросы, использующие этот набор данных (или подмножество этого набора данных), выполняют простой SELECT из материализованного набора данных вместо повторного выполнения запроса. Хранилище использует Spark + HDFS.
Поиск наиболее распространенных запросов, подзапросов и CTE был простым и уже решенным. Сейчас я застрял в том, чтобы найти способ найти кандидатов на материализацию. Я не могу найти метод, позволяющий определить, является ли один запрос надмножеством другого (или, наоборот, один запрос является подмножеством другого). Если бы я знал это, то было бы возможно переписать запрос и заменить дорогой подзапрос уже материализованной таблицей.
Один из способов, которым я думал об этом, - построить граф, в котором запросы и подзапросы узлы и ребра представляют тот факт, что на один запрос отвечает другой. Но мне тяжело строить границы этого графика.
В итоге: учитывая 2 SQL заявления, например, учитывая 2 запроса:
Q1: SELECT col1, col2 FROM table;
и
Q2: SELECT col1 FROM table WHERE col2 > 0;
Как определить, Q2 является подмножеством Q1?
Это простой пример, объединения, агрегации, Союзы, где и где условия также должны быть приняты во внимание. Оценивать наборы данных - это не вариант, его следует определять только на основе оператора SQL и / или планов выполнения (речь идет о наборах данных с несколькими петабайтами, а сравнение наборов данных требует слишком много ресурсов)
Мои идеи так далеко: возьмите список проекций и сравните, из списка проецируемых столбцов Q1 содержится список проекций Q2, тогда Q1 может быть надмножеством Q2. Также проверьте столбцы, включенные в фильтры и какие фильтры применяются.