Как определить, генерирует ли один оператор SQL набор данных, который является подмножеством / надмножеством другого оператора SQL? - PullRequest
0 голосов
/ 24 марта 2020

Я хочу написать систему для материализации частичных наборов данных, которые повторяются в рабочей нагрузке хранилища, поэтому дорогостоящие и общие вычисления вычисляются только один раз, и все последующие запросы, использующие этот набор данных (или подмножество этого набора данных), выполняют простой 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. Также проверьте столбцы, включенные в фильтры и какие фильтры применяются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...