私は単純な選択ステートメントを持っています:
SELECT id1, id2, id3 FROM Table1
Table1 には、約 400,000 のレコードが含まれています。
現在、このステートメントの実行には 5 秒かかります。
これを最適化することは可能ですか (返されるレコードの数を減らすことなく)?
私は単純な選択ステートメントを持っています:
SELECT id1, id2, id3 FROM Table1
Table1 には、約 400,000 のレコードが含まれています。
現在、このステートメントの実行には 5 秒かかります。
これを最適化することは可能ですか (返されるレコードの数を減らすことなく)?
3つのフィールドすべてを含むインデックスを追加すると、SQLがインデックスページから読み取られます。これは、カバードインデックスとも呼ばれます。ただし、インデックスを追加すると、書き込み中にインデックスを再構築する必要があるため、書き込み時間が遅くなる可能性があることを覚えておいてください。
CREATE INDEX IDX_CoveredIndex ON Table1 (id1, id2, id3)
ただし、40万行しかないので、それはおそらく問題ではないと思います。
いいえ、クエリの結果は単純なテーブルスキャンになります。where
またはorder
ステートメントがない限り、それはあなたができる最善のことです。
問題は、なぜフィルターなしですべての行を選択するのかということです。アプリケーション内でフィルターをかけると、間違って実行します。
これは適切に最適化されていませんが(nolock)
、テーブル名の後に使用してみてください。そうすれば、この5秒間はテーブルがロックされず、他の人も使用できるようになります...
これは、同時に複数の場所からテーブルにアクセスしようとしている場合にのみ最適化されるため、テーブルの使用が終了するのを待つ必要はなく、一度にすべてを実行します。
SELECT id1, id2, id3 FROM Table1 (nolock)
PS:これはSQL Serverのsintaxです...他のSGBDについてはわかりませんが、類似したものがあることは確かです...しかし、あなたの質問はSQL Serverに関するものなので、大丈夫だと思います。:)