3

私は非常に奇妙な問題を抱えています。

SQL Server 2008 R2 で実行する次のようなクエリがあります。

SELECT TOP (20) *
FROM MyTable
WHERE a = 0
    AND b = 0
    AND c = 0

MyTable で私のインデックスを使用する

しかし、これはしません:

SELECT TOP (20) *
FROM MyTable
WHERE a = 0
    OR b = 0
    OR c = 0

プログラムで2番目のクエリを実行したい。インデックスを使用するように 2 番目のクエリを変更するにはどうすればよいですか?

インデックスは次のとおりです。

CREATE NONCLUSTERED INDEX [MyIndex] ON [dbo].[MyTable] (
[a] ASC,
[b] ASC,
[c] ASC
)
WITH (
        PAD_INDEX = OFF,
        STATISTICS_NORECOMPUTE = OFF,
        SORT_IN_TEMPDB = OFF,
        IGNORE_DUP_KEY = OFF,
        DROP_EXISTING = OFF,
        ONLINE = OFF,
        ALLOW_ROW_LOCKS = ON,
        ALLOW_PAGE_LOCKS = ON
        ) ON [PRIMARY]
4

3 に答える 3

5

or条件の間にあるクエリにその 1 つのインデックスを使用することはできません。考えてみてください。値のいずれかが一致する可能性があるため、インデックスの一致では、その条件に一致するレコードが他にないことを保証できません。

これは、別々の検索を実行してからそれらを照合するようなものです。

于 2013-10-29T08:10:36.027 に答える
0

Indexを使用するために、SQL-Serverは多くのことをチェックします

1)フィルタが SARG の場合。

2)インデックス利用尤度比(ユニークレコード数:総レコード数)

3)取得するレコードの数 (レコードが少ない場合は、インデックスを使用するか、テーブル スキャンを使用できます。SQL サーバーでは、レコードの量が膨大な場合にインデックスを見つけて使用するよりも、テーブル全体をスキャンする方が簡単であることがわかっているためです。)

4)クエリでは、を使用しているためOR、レコード数が増加します。この条件では、sql-server は、インデックスを検索/使用するよりもテーブル全体をスキャンする方が簡単であると判断します。であればAND、Index を利用する可能性が高まります。

于 2013-10-29T08:13:51.697 に答える