Скажем, у меня есть таблица X
с транзакциями, где CUSTOMER_ID
является первичным ключом.Оптимизация множественных внутренних самосоединений по уникальному ключу
Также у меня есть сотня «функций» (с точки зрения машинного обучения), то есть текста запросов в этой таблице X
. Все эти запросы как:
запроса 1:
SELECT
X.CUSTOMER_ID,
WHEN(X.GENDER = "F" AND X.IS_PREGNANT = TRUE) THEN 1 OTHERWISE 0 AS WILL_BUY_FOR_KIDS
FROM X
Запрос ххх:
SELECT
X.CUSTOMER_ID,
WHEN(X.GENDER = "M" AND X.AVG_AMOUNT > 1000) THEN 1 OTHERWISE 0 AS RICH_DUDE
FROM X
Задача состоит в том, чтобы произвести таблицу со всеми "особенностями", рассчитанные по X
Таблица. Так что мне нужно создать текст выходного запроса (программно), используя тексты «функциональных» запросов. Что-то вроде:
SELECT
*
FROM SOME_QUERY_1
INNER JOIN SOME_QUERY_X
ON SOME_QUERY_1.CUSTOMER_ID = SOME_QUERY_X.CUSTOMER_ID
...
Такой выход запроса выше может быть очень медленным, когда внутреннее Самосоединения сотни подзапросов. Ясно, что было бы здорово, если SQL двигатель будет "переписать" этот запрос на что-то подобное (избегать соединения):
SELECT
CUSTOMER_ID,
WHEN(X.GENDER = "F" AND X.IS_PREGNANT = TRUE) THEN 1 OTHERWISE 0 AS WILL_BUY_FOR_KIDS,
WHEN(X.GENDER = "M" AND X.AVG_AMOUNT > 1000) THEN 1 OTHERWISE 0 AS RICH_DUDE,
.....
FROM X
Несколько вопросов:
- Есть ли SQL двигатель что может сделать оптимизацию выше (MySQL, PostgreSQL и т. д.)?
- С общей численной алгеброй мы доказали правила упрощения выражений (например:
(a + b) * a = a^2 + b*a
). Существуют ли такие правила для реляционной альгребры?
Какова цель этих подзапросов? – wildplasser
BTW: postgres достаточно умен, чтобы свернуть подзапросы, но он не обнаруживает, что x1. * И x2. * Относятся к одному кортежу. Результат - объединение слияния при двух индексах. – wildplasser
@wildplasser Я обновил описание, чтобы добавить больше контекста на вопрос –