3,000,000行を超えるデータベースがあり、それぞれにvarchar(6000)を含むidフィールドとxmlフィールドがあります。
私がそうするならば、SELECT id FROM bigtable
それは完了するのに+-2分かかります。30秒でこれを取得する方法はありますか?
3,000,000行を超えるデータベースがあり、それぞれにvarchar(6000)を含むidフィールドとxmlフィールドがあります。
私がそうするならば、SELECT id FROM bigtable
それは完了するのに+-2分かかります。30秒でこれを取得する方法はありますか?
id 列にクラスター化インデックスを構築する
http://msdn.microsoft.com/en-us/library/ms186342.aspxを参照してください。
テーブルにインデックスを適用できます。あなたの場合、クラスター化インデックス。
クラスタ化インデックス:
http://msdn.microsoft.com/en-gb/library/aa933131(v=sql.80).aspx
また、クエリをフィルタリングして、毎回 300 万行すべてが返されないようにすることもお勧めします。これは、TOP
またはを使用して行うことができますWHERE
。
上:
SELECT TOP 1000 ID
FROM bigtable
どこ:
SELECT ID FROM
bigtable
WHERE id IN (1,2,3,4,5)
さて、なぜすべてのId
s をクライアントに戻すのですか?
テーブルにクラスター化されたインデックスがない場合でも (これは疑問です)、処理時間の大部分はクライアント側で発生Id
し、ネットワーク経由で値を転送して画面に表示します。
すべての値に対してクエリを実行すると、クエリ エンジンを使用するメリットが失われます。
すべての s を取得するために私が考えることができる (おそらく想像力に欠ける) 唯一の理由Id
は、ある種の誤ったキャッシングです。
多くのことを知りたい場合は、
SELECT count(*) FROM [bigtable]
Id
が存在するかどうかを知りたい場合は、
SELECT count([Id[) FROM [bigtable] WHERE [Id] = 1 /* or some other Id */
これは、指定された の存在を示す 1 または 0 を持つ 1 行を返しますId
。
これらのクエリはどちらも、クラスター化されたインデックスの恩恵を大きく受け、Id
最小限のデータと最大限の情報を返します。
これらのクエリはどちらも 30 秒未満で返され、クラスター化インデックスがオンになっている場合は 30 ミリ秒未満で返されます。Id
すべての を選択してId
も、これらのクエリ以上の有用な情報は得られず、得られるのはネットワークとクライアントのトレーニングだけです。