54

現在、SQL Server 2005の特定の列にインデックスを含めることによるパフォーマンスへの影響を判断するために、いくつかのテストを行っています。

私が使用しているテストデータセットには、約7,200万行(約6 GBのデータ)があります。インデックスのパフォーマンスを実際にテストするには、インデックスがある場合とない場合のパフォーマンスを比較できる必要があります。

それはすべて問題ありませんが、そもそもインデックスを作成することは安価な操作ではありません。インデックスなしでテーブルをテストしたい場合は、少なくともインデックスを無効にする必要があります。インデックスを使用してテストするには、インデックスを再度有効にする必要がありますが、これにはかなりの時間がかかります。

クエリの実行時にSQLServer2005に特定のインデックスを無視させる方法はありますか?インデックスを無効にするのに非常に長い時間がかかるため、クエリをテストするためだけにインデックスを無効にする必要はありません。

4

3 に答える 3

76
SELECT *
FROM MyTable WITH (INDEX(0))
WHERE MyIndexedColumn = 0

クエリは通常、MyIndexedColumnのインデックスを使用しますが、テーブルヒントのため、代わりにテーブルスキャンを使用します。


SELECT *
FROM MyTable WITH (INDEX(IndexName))
WHERE MyIndexedColumn = 0

クエリは通常、MyIndexedColumnのインデックスを使用しますが、テーブルヒントのため、代わりにIndexNameという名前のインデックスを使用します。

于 2012-06-13T14:29:58.833 に答える
9

私はさまざまな種類のDBを使用しており、必要なときに特定のヒントを思い出せません。したがって、私は(現在)私の道を横切るすべてのDBで機能する純粋なSQLアプローチを使用しています。

アイデアは、SQLでそれぞれの式を難読化することにより、DBが特定のインデックスを使用できないようにすることです。たとえば、where句によってデータベースがインデックスを使用して解決するのが最適であると信じるようになったが、そうではない場合です。

SELECT *
FROM MyTable
WHERE MyIndexedColumn + 0 = 0

同様に、文字列値に空の文字列を追加できます。現在のオプティマイザは、そのような式を解決しません。でインデックスを使用することはできません(MyIndexedColumn)

これは実際、私の本で説明したアンチパターンです。SQLの数学に関するページの一部を次に示します。

アドホックテストには間違いなく十分です。もちろん、本番コードでは、ヒントの方が表現力に優れています。

于 2013-09-17T05:22:42.253 に答える
-5

テストコードを実行しているのと同じトランザクションで使用したくないインデックスを無効にすることができます。必ず最後にトランザクションをロールバックしてください。これにより、テストコードはインデックスを使用しませんが、インデックスが実際に無効になるのを防ぎます。

BEGIN TRANSACTION

    ALTER INDEX [MyIndex] ON MyTable DISABLE;

    EXEC TestCode;

ROLLBACK

これは、テストコードがさまざまな時点で多数のインデックスを使用する複雑なケースがあり、新しいインデックスを追加することで改善されるかどうかをテストする場合に、より効果的に機能します。

于 2013-09-16T18:06:26.363 に答える