0

私は50列のテーブル1lac行を持っています。主キーに基づいて、1つの行と1つの列を選択する必要があることはわかっています。だから私はどちらのクエリを使用する必要があります

SELECT * FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX  

また

SELECT COL_NAME FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX  

ですから、どちらのアプローチが優れているのか、そしてその理由を教えてください。パフォーマンスの観点から。このクエリがスケーラブルなアプリケーションで頻繁に実行されているとします。原因を特定してください。

4

3 に答える 3

0

それはすべてインデックスに依存しますが、私が考えることができるほとんどの場合、データへのアクセスSELECT COL_NAME方法に関するより多くの「オプション」をSQLに提供するため、ナローセレクト()の方がパフォーマンスが向上します。

一般に、特定のクエリの場合、最良のシナリオは、WHERE条件でインデックスシークを許可するインデックスを作成することですが、に必要な列も含まれますSELECT。このように、RDBMSは、クエリの結果を取得するためにインデックスを使用するだけで済みます。基になるテーブルはまったく必要ありません。

MS SQL Serverでは、カバーインデックスを使用すると、これを正確に実行できます。

それはありそうもない

SELECT * FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX  

多くの場合、テーブル内のすべての列を含むインデックスがない限り、最適になります(クラスター化インデックスIND_COL_NAMEでない限り、ストレージの無駄になります)。<IND_COL_NAME>それ以外の場合は、クエリがのインデックス<IND_COL_NAME>を検索してから、物理テーブルに結合して残りの列データを取得する必要があることを意味します。

だからあなたの狭いクエリのために

SELECT COL_NAME FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX

最適なインデックスは<IND_COL_NAME>、を含むになりますCOL_NAME。それが主キーであると言うので<IND_COL_NAME>、それは非常に選択的です。

于 2012-08-07T10:54:17.953 に答える
0

フィールドの指定には使用せず*、常に必要なフィールドを正確に指定してください。

単一の行をフェッチする場合、データサイズの違いはわずかですが、通常、帯域幅の使用量を減らすために必要なものだけを取得する必要があります。もう1つの側面は、を使用*するとテーブルデザインへの依存関係が追加されることです。後でテーブルにフィールドを追加すると、クエリはそれらのフィールドもフェッチします。これは、バッファに収まるよりも多くのデータを取得し、例外が発生することを意味する可能性があります。

テーブルから単一のフィールド(またはいくつかのフィールド)を取得すると、特定のパフォーマンス上の利点があります。必要なフィールドが含まれる列としてキーのインデックスがある場合、クエリはインデックスからのみ実行でき、テーブル自体には触れません。

于 2012-08-07T10:57:19.543 に答える
0

理想的なアプローチは

 SELECT yourcolumn FROM yourtable WHERE yourcondition

これにより、生成されるネットワークトラフィックが少なくなり、要件をより正確に表すことができます。

さらに、テーブルに特定のタイプの列がある場合、それらの高価なクエリを回避できるため、パフォーマンスが向上します

于 2012-08-07T10:51:26.790 に答える