2012-03-02 9 views
3

私は、1年に読み込まれる固定長のフラットファイルの構成を反映する単一の大きな非正規化テーブルを持っています。 112列、400,000レコード。私は、このテーブルに対して最も実行されるクエリのwhere句を構成する3つの列に一意のクラスタ化インデックスを持っています。 Index Fragは.01です。クエリのパフォーマンスは良好です(サブ秒)。ただし、すべてのレコードを返すには2分ほどかかります。実行計画は、コストの100%がクラスタ化インデックススキャン(シークではない)にあることを示しています。大きな非正規化テーブルの最適化

参加を必要とするクエリ(denormのため)はありません。このテーブルはレポートに使用されます。すべてのフィールドは、nvarchar型(データファイル内のフィールドの長さ)です。

テーブルを正規化する以外。パフォーマンスを向上させるために何ができるのですか?

+1

テーブルのデータ量(バイト)どのような種類のネットワーク接続がありますか?大量のデータでは2分で合理的です。 – Oded

+0

すべてのレコードを返すのでスキャンしています...シークする理由はありません。 @Odedのように、あなたのパフォーマンスはあなたのネットワークに基づいています...少ないデータを返す方法を見つけることができない限り、それはあなたのボトルネックになります。 –

答えて

0

クエリを改ページしてみてください。結果を、100行のグループに分割することができます。そうすれば、ユーザーは結果をかなり早く見ることができます。また、結果を表示するたびにすべてのデータを表示する必要がない場合、検索されるデータの量が大幅に削減されます。

これを超えると、データをフィルタするクエリにパラメータを追加すると、返されるデータの量が減ります。

この投稿は、ページネーションを始めるための良い方法です:SQL Pagination Query with order by

ちょうどページ変数を使用する答えで「50」と「100」に置き換え、あなたが行ってもいいです。

0

ここに3つのアイデアがあります。まず、nvarcharが必要ない場合は、これらをvarcharに切り替えます。それはストレージの要件を半分にし、処理を高速化する必要があります。

第2に、フィールドの長さがnvarchar(4000)/ varchar(8000)より小さいことを確認してください。値が大きくなると、別のページに値が格納され、検索時間が長くなります。

第3に、どのようにデータを取得しているのかわかりません。 ExcelやODBCなどの別のツールに戻す場合は、他のパフォーマンスのボトルネックが存在する可能性があります。

しかし、最終的に大量のデータを取得しているので、ほんの一握りの行を取得するよりもずっと時間がかかることが予想されます。

0

すべての行を尋ねると、常にスキャンが行われます。

400,000行×112列×17バイト/列は761,600,000バイトです。 (私は薄手の空気から17を引っ張った。)ネットワークを横切って3/4のギグを動かすのに2分ほどかかると悪くはない。それはおおよそ私のサーバーのスケジュールされたディスクへのバックアップのスループットです。

高速なネットワークにお金がありますか?

関連する問題