3

3,000,000行を超えるデータベースがあり、それぞれにvarchar(6000)を含むidフィールドとxmlフィールドがあります。

私がそうするならば、SELECT id FROM bigtableそれは完了するのに+-2分かかります。30秒でこれを取得する方法はありますか?

4

5 に答える 5

3

id 列にクラスター化インデックスを構築する

http://msdn.microsoft.com/en-us/library/ms186342.aspxを参照してください。

于 2013-03-15T10:25:58.273 に答える
2

テーブルにインデックスを適用できます。あなたの場合、クラスター化インデックス。

クラスタ化インデックス:

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)
于 2013-03-15T10:25:20.757 に答える
0

まず第一に、300万のレコードはテーブルを「巨大」にしません。

クエリを最適化するには、次のことを行う必要があります。

  1. クエリをフィルタリングします。なぜすべてのIDを取得する必要があるのですか?
  2. ID列のクラスター化インデックスを作成して、選択した行を指す前に最初に検索する小さなルックアップテーブルを取得します。

ここここに役立つスレッド

于 2013-03-15T10:29:21.323 に答える
0

パフォーマンスを向上させるために、テーブルにインデックスを付けることができます。

パーティション機能のようなパフォーマンスを向上させるために使用できる追加オプションもあります。

于 2013-03-15T14:58:15.973 に答える
0

さて、なぜすべてのIds をクライアントに戻すのですか?

テーブルにクラスター化されたインデックスがない場合でも (これは疑問です)、処理時間の大部分はクライアント側で発生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も、これらのクエリ以上の有用な情報は得られず、得られるのはネットワークとクライアントのトレーニングだけです。

于 2013-03-15T10:36:24.890 に答える