質問

の指標としているカラムA、B、C、DのテーブルT

私はクエリー引っ張るからA、B、Cの場を提供しています。

の指数の使用または別の指標が必要であることのみが含まれ、A、B、C?

役に立ちましたか?

解決

デヴィッドBでご確認いただくことを実行計画を確認する指標を使っています。

の指数の使用または別の指標が必要であることのみが含まれ、A、B、C?

答えによらこの最後の部分については、と思うのは、基底状態のセキュリティーソフトに対して、早急な解決、あるいは ほとんど ない理由にインデックスサブセットのインデックスのつけられたカラム.ご指数(A、B、C、D)が対(A、B、C)その結果、インデックス を求める, する最良の状態であるということをステークホルダーのすべての情報は、エンジンのニーズへの直接の結果セットです。これはそれは数値型の場合と平等のための試験を文字列タイプは、これをすることができるはずとのように'%'s)一方、場合にのみ参照されるDという最終わる指標 スキャン, ることをSQLエンジンがスキャンの全ての組み合わせA、B、C、トレージエンジンはインデックスかDた基準で判断する行のセットです。特に大きなテーブルがることになりましたがどうしていくべきなのかについて多くの質問に対しコラム"D"、あるいは追加指数Dのみ、約90%の性能改善しました。

編集:私もお使いになることをお勧めしデータベースエンジンのチューニングアドバイザーのSQL管理。まだの場合テーブルな物価連動に最適なクエリを実行したい.

他のヒント

状況によります!

WHERE A like '%x%'
  and B = 1
  and C = 1
//
WHERE A = 1
  OR B = 1
  OR C = 1
//
WHERE DateAdd(dd, 1, A) = '2008-01-01'
  AND B = 1
  AND C = 1

インデックスは有用ではないため、これらはインデックスに依存しません。

「推定実行計画の表示」をクリックします。潜在的なインデックスの使用を確認します。

Oracleデータベースでは、これは複合インデックスと呼ばれます(12gのドキュメントですが、以前のバージョンで有効です)

  

複合インデックスは、WHERE句が複合インデックスの列の先頭部分をすべて参照するSELECTステートメントのデータの取得を高速化できます。したがって、定義で使用される列の順序は重要です。一般的に、最も一般的にアクセスされる列が最初になります。

だからあなたの場合、はい。インデックスが使用される/される可能性があります。これは、説明計画を使用して確認できます。

MS SQLSERVERが異なる場合(そして、それが疑われる場合)、新しい答えが必要になります。

編集: また、使用するインデックスのみを考慮することに言及する必要があります。それは必ずしもインデックスが使用されることを意味するわけではありません。

Edit2: Oracle 11g以降には、インデックス内の列をスキップできるオプションがあります。そのため、A、B、およびDのクエリは引き続きインデックスを使用する可能性があります

のインデックスが使用可能です。かなりスマート約を指すことによって、より最適なクエリを計画しておりますが、これはしていないとのこと。

このようなもの、僕の言葉ではベンチマークです。テーブルを作成するに必要事項を記入して、代表されるデータのクエリでは、インデックスでは、クエリを設定することができます。

インデックスにクエリで使用されていない列が含まれているという事実は、その使用を妨げません。

それは間違いなく 使用されると言うのではなく、別の理由で無視される場合があります(おそらく、1つ以上の他のインデックスがより有用であるためです)。

いつものように、予想される実行計画を調べて、何が起こる可能性があるかを確認してください。

単純な等値検索(WHERE A = 1およびB = 'Red'およびC = 287)で開始します。はい(ほとんどの場合)インデックスが使用されます。インデックスは、オプティマイザーの「推測」を支援するために最初に使用されます。選択に一致する行の数、次に実際にそれらの行にアクセスするための2番目の行。

「いいね」に関するデビッドBのコメントに対する回答述語、SQLServerは引き続きインデックスを使用する場合があります。これは選択内容によって異なります。たとえば、count(*)を選択している場合、SQLServerはインデックスをスキャンし、インデックスが小さいためスキャンに必要なIOが少ないため、where句に一致するヒットをカウントする可能性があります。また、選択したSQLServerがインデックスをどのように感じているかに応じて、ベーステーブルからいくつかの列を選択している場合でも、それを行うことを決定する場合があります。

もう1つ「依存する」答え...テーブルの大きさにも依存します...

実行計画をチェックして、インデックスが使用されているかどうかを確認したことを述べた他のすべての人に同意します。

実行計画を読む際に役立つ記事をいくつか紹介します。

http://www.sqlservercentral.com/articles/Administering/executionplans/ 1345 / http://www.codeproject.com/KB/database/ sql-tuning-tutorial-1.aspx

シークとスキャンに関する優れた記事もあります。 http://blogs.msdn.com/craigfr/archive/ 2006/06/26 / 647852.aspx

Craig Freedmanのブログには良い記事のログがありますが、ここに役立つ別の記事があります。この記事では、使用するインデックスを決定するためにSQL Serverが使用するいくつかの要因について説明します...

http://blogs.msdn.com/craigfr /archive/2006/07/13/664902.aspx

注意してください! ジェフ

一般的にはそうです、すべての最新のデータベースはこれを行うのに十分賢いです。例外があります。たとえば、テーブルの統計で、テーブル内のデータの量が十分に少ないため、テーブル全体の読み取りがより効率的であることが示されている場合、インデックスは割引になりますが、原則として、信頼することができます必要に応じて。

その結果、インデックスを設計するときにこれを利用できます。たとえば、キー値としてA、B、Cを含むテーブルと、ステートメントによって頻繁に取得されることがわかっているデータを含む列YおよびZがあるとします

SELECT Y FROM table WHERE A = alpha and B = beta and C = gamma 

SELECT Z FROM table WHERE A = alpha and B = beta and C = gamma 

通常、A、B、C、X、Zにインデックスを作成します-XとZがある程度小さいフィールドであると仮定します。この理由は、上記のステートメントのアクセスパスウェイがインデックスを使用することを知っており、取得したいデータが既にインデックスに読み込まれているため、データブロックの個別の読み込みがないためですテーブルデータ自体を取得するために必要です。この戦略は、状況によってはデータ取得を劇的にスピードアップできます。もちろん、更新費用とディスク容量で支払いますので、データベースを適用する前にデータベースが何をしているのかを理解する必要がありますが、ほとんどのデータベースの読み取りは書き込みの数を大幅に上回るため、一般的に考慮する価値があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top