2012-02-15 6 views
2

Tabe1には約10個の不足レコード(100万)があり、プライマリキーは含まれていません。 SELECTコマンド(特定のWHERE条件)を使用してデータを取得すると、時間がかかります。主キーをテーブルに追加することで検索時間を短縮することができますか、それを行うための他の方法に従う必要があります。親切に私を助けてください。大きなテーブルの問題(プライマリキーが使用できない)

+1

テーブル構造、長い時間がかかるクエリなど... –

+2

通常は「_lakh_」の綴りではありませんか? –

答えて

3

主キーは、直接には、パフォーマンスには影響ありません。しかし間接的にはそうです。これは、主キーをテーブルに追加すると、SQL Serverは、エンティティの整合性を強制するために使用される一意のインデックス(既定でクラスタ化されている)を作成するためです。しかし、テーブルに独自のインデックスを作成することはできます。したがって、厳密に言えば、プライマリインデックスはパフォーマンスには影響しませんが、プライマリキーによって使用されるインデックスはパフォーマンスに影響しません。

WHEN SHOULD PRIMARY KEY BE USED?

+0

ありがとうございました。 –

+0

私は助けてうれしいです。 – Pranav

3

特定のレコードを参照するには、主キーが必要です。

SELECTを高速に実行するには、WHEREで使用している適切な列にインデックスを追加することを検討する必要があります。

など。 SELECT * FROM "Customers" WHERE "State" = 'CA'を高速化するには、Stateカラムにインデックスを作成する必要があります。

+1

一般的に私はすべてのテーブル*が主キーを持つべきであることに同意しますが、それらは特定の行を参照する唯一の方法ではありません。独自の制約もそれを可能にします。一意制約が一意制約または主キー制約によって強制されない場合でも、一意のデータを使用して特定の行を見つけることができます。厳密に言えば、主キーは特定の行を参照するためには必要ありません。 –

0

あなたができることの1つは、あなたのテーブルにcreate indexesです。

オプティマイザは、インデックス・カラムがSELECTで参照されている場合は、インデックス・スキャンを選択します(デフォルトでは、検索時間は短縮されます)。索引スキャンが表スキャンより高​​速であるとオプティマイザが推定した場合には、通常、索引ファイルは小さく、表全体よりも読み込み時間が短く、特に表が大きくなるほどで​​す。さらに、索引全体をスキャンする必要がない場合もあります。索引に適用される述部は、データ・ページから読み取られる行の数を減らします。

続きを読む:Advantages of using indexes in database?

1

これは、SELECT文に依存し、テーブルの各行のサイズが、テーブルの行数、そしてあなたは、各行内のすべてのデータを取得しているかどうかだけの小さなサブセット(サブセットの場合は、必要なデータ列がすべて単一の索引に存在するかどうか)、および行をソートする必要があるかどうかによって決まります。

テーブル内のすべての行のすべての列を返す必要がある場合は、インデックスを追加して処理を高速化することはできません。一方、行のごく一部を検索しようとしているだけの場合は、フィルタ条件に関係する列に適切なインデックスを指定すると、クエリのパフォーマンスが大幅に向上します。すべての行またはほとんどの行を選択していて、いくつかの列のみを選択している場合は、それらの列がすべて単一の索引に存在し、索引にない列に条件がない場合は、索引が役立ちます。

さらに詳しい情報がないと、それほど具体的ではありません。

+0

2番目の文に同意するかどうか分かりません。すべての行を返す必要があるが、すべての列を返す必要がない場合は、必要な列のみの非クラスター化インデックスが有効であり、そのインデックスのスキャンはクラスター化インデックス(またはヒープ)のスキャンより効率的です。 。 –

+0

@Aaron:そうです、それはすぐに複雑になり、私はその詳細レベルには進まないことに決めました。しかし、あなたは正しい。 SELECTが索引の列の小さな投影にある場合、索引は全表走査と比較して時間を節約できます。 OTOHでは、DBMSはかなり高速なテーブルスキャンを行います。私は主キーについても議論しなかった。彼らは常に存在する必要があります。私は通常、自動インクリメントの列をPKsとしてカウントしません。固有の(候補)キーを表す他の識別可能なサブセットの代理となるべきである。 –

+0

これをあまりあいまいにするには、「テーブルの*データ*がすべて返されなければならないのなら、おそらく私の賢明な側面だが狭いインデックスが読んだときに最初に気がついたのはおそらくあなたはそれをどう言いましたか? –

1

あなたはどこ原因で主キーを持っていない場合は主キーが助けにはなりません:含む対象に書かれた全書籍があります。

質問を早くしたい場合は、原因のある列に非クラスタインデックスを作成できます。索引の上に列を含めることができます(選択した原因による)

SQLオプティマイザは、索引を検索してより高速に検索します。 (ただし、テーブルにデータを追加するタイミングについて考える必要があります。多くの列にインデックスを作成する場合は、挿入操作に時間がかかることがあります)

関連する問題