1

入力パラメーターに基づいて多数のテーブルの 1 つに対してチェックを実行する SQL の関数があります。例えば

CREATE FUNCTION demo
(
    @Classification INT,
    @ClassificationValue INT
)
RETURNS INT
AS
BEGIN

    IF @Classification = 1
    BEGIN
        IF EXISTS (SELECT CountryRegionId FROM table_1 WHERE id = @ClassificationValue)
        BEGIN
            RETURN 1;
        END
    END 
    IF @Classification = 2
    BEGIN
        IF EXISTS (SELECT CountryRegionId FROM table_2 WHERE id = @ClassificationValue)
        BEGIN
            RETURN 1;
        END
    END 
    RETURN 0;
END

これは単純化された状況であり、実際には選択できるターゲット テーブルが他にもあります。

私の質問

C# または他のほとんどの言語では、ハッシュが使用されるため、連続する if ステートメントよりも switch ステートメントを使用する方が適切です。これは SQL でも同じですか (case ステートメントに論理式を含めることができる場合、たとえば Case When a <5 - 明らかにハッシュできません。

4

1 に答える 1

3

での比較のコストifは、基本的に、ステートメントのコストと比較して何もexistsありません。適切なキーのインデックスがあったとしてもです。

文字通り何千もの比較がない限り、このようなマイクロ最適化について心配する必要はありません。

その場合、最初に一致する可能性が最も高い順に比較することをお勧めします。次に、単一のテーブルで ID を比較できる別のデータ構造を検討することをお勧めします。非常に類似したテーブルを持つことは、多くの場合、より大きなテーブルを減らしてデータ構造を改善できることを示しています。

最後に、比較の数が本当に気になる場合は、ネストされたifs を使用してO(log n)比較を取得します。例として、「8」の比較の構造は次のようになります。

if @Classification < 5
    if @Classification < 3
        if @Classification = 1
        else . . .
    else if @Classification = 3 . . .
    else . . .
else . . .
于 2013-07-05T14:05:26.503 に答える