1

この状況で最も最適化されたソリューションは次のとおりです。

私のクエリの WHERE 句は次のようになります。

WHERE columnX LIKE @Account + '%'

@Account が ' ' である可能性があり、その場合はすべての値を取得したいので、'%' を使用します。それ以外の場合はすべて、等号 (=) を使用できます。

columnX にインデックスがあり、そのために等号 (=) を使用したいため、このソリューションは最適化されていません。また、OR を使用したソリューションは、パフォーマンスのために受け入れられません。

他におすすめありますか?WHERE 句で CASE を試しましたが、最適化された適切なソリューションが見つかりませんでした。互換性レベルは 80 であるため、新しい構文は使用できません。(理由は聞かないでください :-) )

事前にTnX!

ネマニャ

4

5 に答える 5

2

あなたはこれを試すことができます

where columnX = isnull(nullif(@Account, ''), columnX)
于 2012-10-18T13:17:45.467 に答える
1

意味的に異なる 2 つのクエリを実行しようとしています。1 つはすべての行をプルし、もう 1 つは単一の行をプルします。これら 2 つのクエリには、定義上、2 つの異なるクエリ プランがあります。「コードの重複」を避けるためにそれらを 1 つのクエリに結合しようとする試みは見当違いです。「コードの重複」は敵ではなく、複雑さです。答えは、シナリオごとにストアド プロシージャを作成することです。これにより、各ストアド プロシージャが単一のクエリ プランを表すことができるようになるだけではありません。また、単一責任の原則に従うことで、アプリケーションを簡素化できます。

于 2012-10-18T13:29:16.870 に答える
0

これは私たち全員が直面している状況です:)

Like で何を選択しても、実際にできることはあまりありません。最後に % のみを追加すると、インデックスがシークに使用される可能性が高くなります。本当の問題は、最初に % がある場合です。インデックスが使用されている場合、スキャンに使用されます。

また、インデックスの使用法は、選択した列にも関連していることに注意してください。ID と名前があり、名前にインデックスがあるテーブルがあり、そこから * を選択すると、インデックスはおそらく使用されません。

最後に、全文検索を検討することもできますが、その実装はかなり複雑です

于 2012-10-18T13:20:50.697 に答える
0

これを試して

DECLARE @var VARCHAR(10) = '' 
DECLARE @table TABLE ( ID VARCHAR(10) ) 

INSERT INTO @table 
SELECT '11' 
UNION 
SELECT '2' 

SELECT * 
FROM @table 
WHERE ( Len(@var) = 0 OR ID = @var ) 

SET @var = '11' 

SELECT * 
FROM @table 
WHERE ( Len(@var) = 0 OR ID = @var ) 
于 2012-10-18T13:24:21.270 に答える
0

SQL サーバーの一部のバージョンでは、OR を使用してもパフォーマンスの問題にはなりませんOPTION(RECOMPILE)。詳細については、http://sommarskog.se/dyn-search-2008.htmlを参照してください。

于 2012-10-18T13:25:58.603 に答える