5

さて、私はこのようなものに不慣れです..私は次のように開始時に私のSPにインデックスを作成しました

Create Index index_fab
ON TblFab (Fab_name)

今、私はこれの下でクエリを持っています

select fab_name from TblFab where artc = 'x' and atelr = 'y'.

select句でこのインデックス名を使用する必要がありますか、それともクエリを高速化するために自動的に使用されますか

私は次のようなものを使用する必要がありますか

select fab_name from TblFab WITH(INDEX(index_fab)) where artc = 'x' and atelr = 'y'.

またはクエリでこのインデックスを使用するその他の方法

また、このテーブルで結合を使用している場合、インデックスを使用する方法は?

4

8 に答える 8

9

まず、ストアドプロシージャでインデックスを作成しているということですか?これは悪い考えです。ストアドプロシージャを2回実行すると、インデックスがすでに存在するため失敗します。

次に、クエリはインデックスに記載されている列を使用しないため、影響はありません。

第3に、JodyTが記述しているように、クエリアナライザー(SQL Server自体)が使用するインデックスを決定します。それはあなたよりもほぼ確実に優れています。

最後に、言及したクエリを高速化するために、artc列とatelr列にインデックスを作成します。

于 2013-03-21T11:19:54.063 に答える
3

SQL Serverのクエリオプティマイザは、インデックスがクエリに適しているかどうかを判断します。force特定のインデックスを使用することはできません。使用したいヒントを与えることはできますが、それが使用されることを保証するものではありません。

于 2013-03-21T11:14:58.267 に答える
3

他の人があなたの質問に答えてあなたがよりよく理解するのを助けるので、私の意見は、あなたが最初にあなたがインデックスを使う必要がある理由を理解するべきであるということです。インデックスはパフォーマンスを向上させることがわかっているので、パフォーマンスの問題も引き起こす可能性があります。インデックスを使用する必要がある場合、インデックスの使用方法ではなくインデックスを使用する必要がある理由を知っておくとよいでしょう。

ここからほとんどすべての詳細を読むことができます。

あなたの例に関して、あなたのクエリのインデックスは影響を与えません。クエリのwhere句に上記の列がないためです。

次のことも試すことができます。

CREATE INDEX yourIndexName ON yourTableName (column_you_are_looking_for1,column_you_are_lookingfor2)。

また、知っておきたいこと:テーブルにインデックスが存在しない場合は、データベースクエリで参照されるテーブルごとにテーブルスキャンを実行する必要があります。テーブルが大きいほど、テーブルスキャンにかかる時間が長くなります。これは、テーブルスキャンでは、各テーブル行に順番にアクセスする必要があるためです。テーブルスキャンは、テーブル内のほとんどの行を必要とする複雑なクエリの場合はより効率的かもしれませんが、一部のテーブル行のみを返すクエリの場合、インデックススキャンはテーブル行により効率的にアクセスできます。(ここからのソース)

お役に立てれば。

于 2013-11-04T20:50:59.783 に答える
2

インデックスを使用してテーブルに対してクエリを実行する場合は、デフォルトでインデックスを使用する必要があります。ただし、インデックスを作成した列でデータをフィルタリングしていないため、投稿したクエリでは使用されないと思います。それから利益を得るには、artc列とatelr列のインデックスを作成する必要があると思います。インデックスが使用されているかどうかを確認するには、SQLManagementStudioで使用された実行プランを確認してください。

インデックスの詳細:インデックスルークを使用

于 2013-03-21T11:19:22.237 に答える
2

クエリにインデックスを含める必要はありません。そのSQLサーバーによって管理されます。また、このテーブルに結合する場合は、selectにインデックスを含める必要はありません。その明確なことを願っています。

于 2013-03-21T11:19:33.413 に答える
2

selectステートメントでフィルタリングしない「Fab_name」列をインデックスで使用しているため、役に立ちません。

あなたはこれに不慣れなので、あなたはこのようなインデックスから利益を得るかもしれません:

Create Index index_fab
ON TblFab (artc, atelr)

または多分このように

Create Index index_fab
ON TblFab (atelr, artc)

...はい、学ぶべき微妙な点がたくさんあります。

于 2013-03-21T11:24:12.233 に答える
2

パフォーマンスを向上させるには:頻繁に使用される列/テーブルを一覧表示し、それらのテーブル/列にのみインデックスを作成します。

于 2013-10-15T07:59:27.957 に答える
1

インデックスが適切に設定されている場合、オプティマイザーはそれを自動的に使用します。適切に設定することは、それが十分に選択的であり、クエリなどを効果的に助けることができることを意味します。それについて読んでください。ssmsの「実際の実行プランを含める」オプションを使用して、インデックスが使用されているかどうかを自分で確認できます。通常、with(index())ヒントを使用して、オプティマイザーを単独で決定させることはお勧めしません。ただし、よく知っている非常に特殊な場合を除きます;)。

于 2013-03-21T11:18:10.563 に答える