0

要件の変更により複雑になった複雑な SQL where 句があります。ケースには 4 つの基本的なセットがあり、それぞれ他の要因の組み合わせが異なります。(私の意見では) 4 つのケースを where 句の個別のブランチとして保持し、各ブランチで冗長な基準を繰り返す方が読みやすいと思います。しかし、データベース エンジンがそれをどの程度最適化するかはわかりません。

冗長な形式の式を次に示します。実際の基準を文字に置き換えました。A は「分岐」基準で、4 つの形式があります。field='value'特に断りのない限り、すべての式は の形式です。

A1 AND B AND C AND D
OR A2 AND B AND C AND D AND E AND F1 AND G
OR A3 AND A3a AND B AND C AND D AND E AND F1 AND G
OR A4 AND B AND C AND D AND F2

A4 を除くすべての A は の形式field in ('value1','value2')です。Dはfield > 'value'。G は の形式field not in (subquery)です。

これが、(私が思うに) 最も冗長でない形式に分解された式です。

B AND C AND D AND (
    A1
    OR (
        E AND F1 AND G AND (
            A2
            OR (A3 AND A3a)
        )
    )
    OR (A4 AND F2)

私の質問は、この式を最も単純な (冗長性が最も少ない)論理形式に分解する必要があるかどうか、またはより冗長で読みやすい形式のままにしておいてよいかどうかです。対象データベースはSybaseですが、RDMBS全般についての回答が知りたいです。

4

3 に答える 3

2

M$ SQL Server でこの問題に取り組んでいるとしたら、思い通りに記述して、クエリの実行計画を確認します。(a) 実行速度が遅く、(b) 実行計画が適切でない場合は、リファクタリングして文書化します。オプティマイザーがクエリを実行する方法を表示するためのSybaseのメカニズムが何であるかわかりません。

于 2009-04-27T16:17:23.463 に答える
2

RDBMS冗長性をあまり気にしない世界では、ここでは効率がより重要です。

あなたの場合、次のように、 を最上位条件としてUNION使用して 4 つのクエリすべてを実行します。A

SELECT  *
FROM    mytable
WHERE   A1 AND B AND C
UNION
SELECT  *
FROM    mytable
WHERE   A2 AND B AND C AND D AND E AND F1 AND G
…

私は何年も調べていませんでしSybaseたが、すべての7メジャーでは よりも効率的です。RDBMSUNIONOR

の silimar 問題へのアプローチについては、私のブログのこの記事を参照してくださいOracle

また、 とinのUNION比較については、この記事:ORMySQL

これらのアプローチもうまくいくと思いますSybase

UNIONの恩恵を受けるには、条件で使用される列にインデックスを作成する必要もあります

アップデート:

conditionGはサブクエリであるHASH JOINため、高速に実行するには が必要になる可能性があります。HASH JOINフィルタリングされていないすべての値に対してフル スキャンが必要です。そのため、1 回のフルスキャンですべての値をフィルタリングしてから、次の操作を実行する方がよい場合がありますHASH JOIN

SELECT  *
FROM    (
        SELECT  *
        FROM    foo
        WHERE   condition_set_1
        UNION
        SELECT  *
        FROM    foo
        WHERE   condition_set_2_but_no_g
        …
        ) q
WHERE   G

さらに判断するには、実際にクエリ自体を確認する方がはるかに優れています。

于 2009-04-27T16:35:07.993 に答える
0

私はそれをリファクタリングします。最終的には、ロジックが重複していると問題が発生します。2 番目の例は、理解するのに数秒かかる場合がありますが、大きな範囲では、where 句全体をすばやく見て、何が何に影響するかを判断し始めることができるため、何が起こっているのかを簡単に確認できます。

于 2009-04-27T16:14:23.097 に答える