テーブル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
クエリXXX:
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。*は同じタプルを参照していることを検出しません。結果は、2つの索引スキャンのマージ結合です。 – wildplasser
@wildplasser質問に文脈を追加するための説明を更新しました –